среда, 2 февраля 2011 г.

А где лицензионные ключи хранятся у Windows?

Да, был такой вопрос...
Правильный ответ - на оранжевой или желтой наклейке на задней стороне коробки компакт- или DVD-диска. Если используемая система Windows была установлена производителем компьютера, наклейка с ключом продукта Windows может находиться на корпусе компьютера.

Что делать, если ключ потребовался, но был утерян?
Или нужно определить с каким ключем была установлена текущая копия Windows.
Или нужно реализовать проверку VLK-ключей в масштабах предприятия для удовлетворения требований политики...

Ответ на вопрос хранится в реестре, в ключе "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" параметр "DigitalProductID".
Открыв редактор реестра и посмотрев на значение параметра, можно сперва огорчиться:

Рис1. Куча циферок...

Однако, есть хитрый способ выковыривания ключика из значения параметра:
__________________________________________________________________________________

'Сохраняем в C:\SCRIPT\windows.vbs и запускаем

Public Function sGetXPCDKey()
Dim bDigitalProductID
Dim bProductKey()
Dim bKeyChars(24)
Dim ilByte
Dim nCur
Dim sCDKey
Dim ilKeyByte
Dim ilBit

ReDim Preserve bProductKey(14)
Set objShell = CreateObject("WScript.Shell")
bDigitalProductID = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductID")
Set objShell = Nothing
For ilByte = 52 To 66
bProductKey(ilByte - 52) = bDigitalProductID(ilByte)
Next

'Возможные символы CD Key:
bKeyChars(0) = Asc("B")
bKeyChars(1) = Asc("C")
bKeyChars(2) = Asc("D")
bKeyChars(3) = Asc("F")
bKeyChars(4) = Asc("G")
bKeyChars(5) = Asc("H")
bKeyChars(6) = Asc("J")
bKeyChars(7) = Asc("K")
bKeyChars(8) = Asc("M")
bKeyChars(9) = Asc("P")
bKeyChars(10) = Asc("Q")
bKeyChars(11) = Asc("R")
bKeyChars(12) = Asc("T")
bKeyChars(13) = Asc("V")
bKeyChars(14) = Asc("W")
bKeyChars(15) = Asc("X")
bKeyChars(16) = Asc("Y")
bKeyChars(17) = Asc("2")
bKeyChars(18) = Asc("3")
bKeyChars(19) = Asc("4")
bKeyChars(20) = Asc("6")
bKeyChars(21) = Asc("7")
bKeyChars(22) = Asc("8")
bKeyChars(23) = Asc("9")

For ilByte = 24 To 0 Step -1
nCur = 0
For ilKeyByte = 14 To 0 Step -1
'повторяется для каждого байта Product Key
nCur = nCur * 256 Xor bProductKey(ilKeyByte)
bProductKey(ilKeyByte) = Int(nCur / 24)
nCur = nCur Mod 24
Next

sCDKey = Chr(bKeyChars(nCur)) & sCDKey
If ilByte Mod 5 = 0 And ilByte <> 0 Then sCDKey = "-" & sCDKey
Next

sGetXPCDKey = sCDKey
End Function

Public Function Question()
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim strUserName
Dim strCompName
Dim objNetwork
Dim SGetWindowsName
Dim SGetWindowsPID
Set objShell = CreateObject("WScript.Shell")
SGetWindowsPID = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID")
SGetWindowsName = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
Set objNetwork = WScript.CreateObject("WScript.Network")
strUserName = objNetwork.UserName
strCompName = objNetwork.ComputerName
Set oOutFile = objFSO.CreateTextFile("C:\SCRIPT\" & strUserName & "." & strCompName & "-windows.txt")
oOutFile.WriteLine "Лицензия на:" & strCompName
oOutFile.WriteLine ""
oOutFile.WriteLine "Версия Windows"
oOutFile.WriteLine SGetWindowsName
oOutFile.WriteLine ""
oOutFile.WriteLine "Windows CD-Key"
oOutFile.WriteLine sGetXPCDKey
oOutFile.WriteLine ""
oOutFile.WriteLine "Windows Product ID"
oOutFile.WriteLine SGetWindowsPID
End Function

call Question

'Конец
____________________________________________________________________________

Да, кстати, способ работает для многих других программных продуктов Microsoft :)