Что нового

Узнать ключ активации Windows [перевести с VBS]

---Zak---

Скриптер
Сообщения
455
Репутация
120
Добрый день...

Думаю ни для кого не секрет, что програмным путем можно узнать ключик к Windows... Я работаю сис.админом в компаниях и по наследству передались компы с WinXP, Win7 и т.п.

Реестра по сути нет никакого, на серваке KMS и т.п. отсутствует, да и вообще домена нет.
Тут встал вопрос - наклейки на рабочих стираются, а ключики терять жаль:

Нашел на сайте Microsoft вот такой скриптик (клик):
Код:
Set WshShell = CreateObject("WScript.Shell")
	regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"

	DigitalProductId = WshShell.RegRead(regKey & "DigitalProductId")
	Win8ProductName = "Windows Product Name: " & WshShell.RegRead(regKey & "ProductName") & vbNewLine
	Win8ProductID = "Windows Product ID: " & WshShell.RegRead(regKey & "ProductID") & vbNewLine
	Win8ProductKey = ConvertToKey(DigitalProductId)
	strProductKey ="Windows 8 Key: " & Win8ProductKey
	Win8ProductID = Win8ProductName & Win8ProductID & strProductKey
	
	MsgBox(Win8ProductKey)
	MsgBox(Win8ProductID)
	
Function ConvertToKey(regKey)
    Const KeyOffset = 52
    isWin8 = (regKey(66) \ 6) And 1
    regKey(66) = (regKey(66) And &HF7) Or ((isWin8 And 2) * 4)
    j = 24
    Chars = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        y = 14
        Do
            Cur = Cur * 256
            Cur = regKey(y + KeyOffset) + Cur
            regKey(y + KeyOffset) = (Cur \ 24)
            Cur = Cur Mod 24
            y = y -1
        Loop While y >= 0
        j = j -1
        winKeyOutput = Mid(Chars, Cur + 1, 1) & winKeyOutput
        Last = Cur
    Loop While j >= 0
    If (isWin8 = 1) Then
        keypart1 = Mid(winKeyOutput, 2, Last)
        insert = "N"
        winKeyOutput = Replace(winKeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
        If Last = 0 Then winKeyOutput = insert & winKeyOutput
    End If
    a = Mid(winKeyOutput, 1, 5)
    b = Mid(winKeyOutput, 6, 5)
    c = Mid(winKeyOutput, 11, 5)
    d = Mid(winKeyOutput, 16, 5)
    e = Mid(winKeyOutput, 21, 5)
    ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
End Function
PS: хоть и Win8, но на 7-ке проверил тоже работает...

Вопрос: кто знаком близко или не очень с VBS ? Можно перевести все это в AutoIt ?
PS: суть - записать ключ в файл, а не переписывать на листок. Да и AutoIt по сравнению с VBS стал ближе...

Заранее благодарю...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
---Zak---,
Есть на форуме, лень искать.
Код:
Opt('MustDeclareVars', 1)

Dim $aKeyName[2][2] = [['Windows Key:', 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion'], _
		['MS Office 2003 Key:', 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Registration\{90110419-6000-11D3-8CFE-0150048383C9}']]
If StringInStr(@OSArch, '64') Then
	$aKeyName[1][1] = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\11.0\Registration\{90110419-6000-11D3-8CFE-0150048383C9}'
EndIf
For $i = 0 To 1
	MsgBox(64, 'Info', $aKeyName[$i][0] & @TAB & _GetKey(RegRead($aKeyName[$i][1], 'DigitalProductId')))
Next

Func _GetKey($bKey)
	Local $szPossibleChars = 'BCDFGHJKMPQRTVWXY2346789', $szProductKey, $dwAccumulator, _
			$a_rpk = StringRegExp(Hex(BinaryMid($bKey, 53, 15)), '.{2}', 3)
	If UBound($a_rpk) <> 15 Then Return SetError(1, 0, '')
	For $i = 0 To 14
		$a_rpk[$i] = Dec($a_rpk[$i])
	Next
	For $i = 1 To 25
		$dwAccumulator = 0
		For $j = 14 To 0 Step -1
			$dwAccumulator *= 256
			$dwAccumulator += $a_rpk[$j]
			$a_rpk[$j] = BitAND(($dwAccumulator / 24), 255)
			$dwAccumulator = Mod($dwAccumulator, 24)
		Next
		$szProductKey = StringMid($szPossibleChars, $dwAccumulator + 1, 1) & $szProductKey
	Next
	Return StringRegExpReplace($szProductKey, '(?<=.)(?=(.{5})+\z)', '-')
EndFunc   ;==>_GetKey
На ХР работает (офис 2003), на 7 не могу сейчас проверить - на работе.
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
madmasles
Win 7 x64 - не пашет

PS: но спасиб за наводку - может что разберу сам.
PSS: я уже голову сломал в поиске)))))

---- UPD #1
Лыжи видимо не едут из-за того, что получить данные из реестра не можем:
Код:
$regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
MsgBox(0, "", "ProductID: "	 		 & RegRead($regKey, "ProductId"))


В Win7 x64 - возвращает пустую строку. Запуск от админа + разрешения = пробовал - не помогает.

---- UPD #2
Лыжи едут, если в Win** x64 запускать скрипт через "Run Script (x64)"...

Т.е. для x86 - компиляцию делаем в x86, а чтобы работало на x64 системах - компилируем в x64
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
madmasles
Да - я тоже нашел ее через гугл, но к этому времени уже понял в чем суть. И Ваш код работает на Win7 - просто у меня x64 система, а запускал скрипт в x86.
Как выяснилось (об этом написал выше) для получения данных из реестра для x64 системах необходимо запускать скрипт скомпилированный для x64 системы.
 

k790

Новичок
Сообщения
239
Репутация
1
Чтобы всё работало, надо
Код:
$regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
MsgBox(0, "", "ProductID: "          & RegRead($regKey, "ProductId"))

заменить на
Код:
$regKey = "HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
MsgBox(0, "", "ProductID: "          & RegRead($regKey, "ProductId"))
 
Верх