Як дізнатися ключ Windows 8

У цій статті ми поговоримо про те, як можна дізнатися ключ Windows 8, за допомогою якого активована система. Нагадаємо, в Windows 8, як і в попередніх ОС сімейства Microsoft - ключ продукту являє собою послідовність з 25 символів, розділених на 5 груп по 5 символів в кожній (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX). Даний ключ використовується для активації всіх версій Windows 8.

При активації Windows 8 потрібно враховувати наступні моменти:

  • Ключ Windows 8 можна використовувати тільки для активації тієї редакції Windows 8, для якої він призначений, і не для якої іншої (тобто за допомогою ключа Windows 8 Pro не вийде активувати Windows 8 home).
  • OEM ключ можна використовувати для активації OEM-ної копії Windows 8 на тому ж самому комп'ютері, на якому він був активований вперше і ні на якому іншому
  • ключем retail можна активувати Windows 8 на будь-якому комп'ютері, але тільки на одному одночасно

При покупці retail версії Windows 8 ключ продукту поставляється у вигляді наклейки, яку можна наклеїти на системний блок або ноутбук, в разі покупці пристрою з попередньо встановленою Windows 8,  OEM- ключ вже буде приклеєний до корпусу девайса. Ця наклейка називається Certificate of Authenticity (COA).

Однак нерідко трапляється, що з якої-небудь "трагічної причини", текст на такий ліцензійної наклейці стає нечитабельним (пролився кави, стерся про коліна, просто загубився і т.д.). Як в цьому випадку можна програмно знайти ключ Windows 8, щоб можна було в подальшому при перевстановлення системи її знову активувати? Крім того може виникнути необхідність перевірки системи на ліцензійність і збіг встановленого в системі ключа і ключа на наклейці.

Ключ активації Windows 8 зберігається в системному реєстрі, але не у відкритому вигляді, а в зашифрованому (кодування base 24). І в принципі його можна звідти витягти, розшифрувати і переписати на папірець. Інформація про ключі зберігається в ключі реєстру HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ DigitalProductId, нам потрібно лише його витягти і розшифрувати.

У загальному випадку активоване ключ можна витягти через WMI. Зробити це можна без використання сторонніх програм засобами, засобами вже наявними в складі ОС Windows 8: VBScrit і Powershell. Нижче наведемо обидва способи, що дозволяють визначити ключ Windows 8.

Отримуємо ключ активації Windows 8 за допомогою VBScript

  1. Створіть новий текстовий файл з ім'ям get_windows_8_key.vbs і збережіть його на робочому столі
  2. Вставте в нього наступний код
    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 (is Win8 = 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
  3. Двічі клацніть по файлу, після чого має з'явитися вікно, з відображеним в ньому ключем продукту. У нашому випадку система активована ключем Windows 8 Release Preview.

Готовий vbs скрипт можна скачати тут: get_windows_8_key_vbs.zip.

Як дізнатися ключ активації Windows 8 за допомогою Powershell

Дізнатися ключ встановленою Windows 8 можна також за допомогою Powerhell.

  1. Створіть файл з розширенням get_windows_8_key.ps1 і скопіюйте в нього наступний код:
    function Get-WindowsKey ## get the Windows Product Key from any PC param ($ targets = ".") $ hklm = 2147483650 $ regPath = "Software \ Microsoft \ Windows NT \ CurrentVersion" $ regValue = "DigitalProductId" Foreach ($ target in $ targets) $ productKey = $ null $ win32os = $ null $ wmi = [WMIClass] "\\ $ target \ root \ default: stdRegProv" $ data = $ wmi.GetBinaryValue ($ hklm, $ regPath, $ regValue ) $ binArray = ($ data.uValue) [52 ... 66] $ charsArray = "B", "C", "D", "F", "G", "H", "J", "K", "M", "P", "Q", "R", "T", "V", "W", "X", "Y", "2", "3", "4", "6 "," 7 "," 8 "," 9 "## decrypt base24 encoded binary data For ($ i = 24; $ i -ge 0; $ i--) $ k = 0 For ($ j = 14; $ j -ge 0; $ j--) $ k = $ k * 256 -bxor $ binArray [$ j] $ binArray [$ j] = [math] :: truncate ($ k / 24) $ k = $ k% 24 $ productKey = $ charsArray [$ k] + $ productKey If (($ i% 5 -eq 0) -and ($ i -ne 0)) $ productKey = "-" + $ productKey $ win32os = Get-WmiObject Win32_OperatingSystem -computer $ target $ obj = New-Object Object $ obj | Add-Member Noteproperty Computer -value $ target $ obj | Add-Member Noteproperty Caption -value $ win32os.Caption $ obj | Add-Member Noteproperty CSDVersion -value $ win32os.CSDVersion $ obj | Add-Member Noteproperty OSArch -value $ win32os.OSArchitecture $ obj | Add-Member Noteproperty BuildNumber -value $ win32os.BuildNumber $ obj | Add-Member Noteproperty RegisteredTo -value $ win32os.RegisteredUser $ obj | Add-Member Noteproperty ProductID -value $ win32os.SerialNumber $ obj | Add-Member Noteproperty ProductKey -value $ productkey $ obj
  2. Запустіть командний рядок з правами адміністратора і для відкриття консолі PoSh виконайте в ній команду powershell
  3. У вікні потрібно дозволити виконання непідписаних скриптів командою:
    Set-ExecutionPolicy RemoteSigned
  4. виконайте команди
    Import-Module d: \ myfile.ps1; Get-WindowsKey
  5. В результаті у вікні Powershell відобразиться ключ встановленою Windows
  6. Якщо потрібно дізнатися ключі активації на віддалених комп'ютерах, скористайтеся командою Get-WindowsKey «computer1», «serv-dc2», «romp-buh02»

Готовий powershell скрипт знаходиться тут: get_windows_8_key_ps.zip

Ще одна версія Powershell скрипта з коментарів від akaNeo

   
## Декларація функції отримання ключа продукту Windows ## Скрипт призначений PowerShell версії 2.0 (актуальна для всіх версії Windows) Function Get-WindowsProduct ## Функція повертає ключ встановленої Windows з будь-якої машини в мережі, плюс коротку інфу за встановленою версією. Виклик без ключів має на увазі звернення до хосту param ($ Targets = [System.Net.Dns] :: GetHostName ()) function PIDDecoderFromRegistry ($ digitalProductId) New-Variable -Name base24 -Value 'BCDFGHJKMPQRTVWXY2346789' ## -Option Const ## символу використовуються в ключах продукту Windows і Office New-Variable -Name decodeStringLength -Value 24 ## -Option Const ## 'Чистий' довжина зашифрованого ключа продукту New-Variable -Name decodeLength -Value 14 ## -Option Const ## довжина зашифрованого ключа продукту в байтах (символи зберігаються в напівбайтів) New-Variable -Name decodedKey -Value ([System.String] :: Empty) ## Рядок містить розшифрований ключ продукту ## Перевірка, чи містить ключ продукту 'N' (таке можливо для Windows 8 Office 15) $ containsN = ($ digitalProductId [$ decodeLength] / 8) -bAnd 1 ## ($ digitalProductId [$ decodeLength] -shr 3) -bAnd 1 ## PS 4.0 $ digitalProductId [$ decodeLength] = [System.Byte ] ($ digitalProductId [$ decodeLength] -bAnd [System.Convert] :: ToByte ( 'F7', 16)) ## 247 ## Власне процес розшифровки for ($ i = $ decodeStringLength; $ I -ge 0; $ I--) $ digitMapIndex = 0 for ($ j = $ decodeLength; $ j -ge 0; $ j--) $ digitMapIndex = $ digitMapIndex * 256 -bXor $ digitalProductId [$ j] ## $ digitMapIndex - shl 8 -bXor $ digitalProductId [$ j] ## PS 4.0 $ digitalProductId [$ j] = [System.Math] :: Truncate ($ digitMapIndex / $ base24.Length) $ digitMapIndex = $ digitMapIndex% $ base24.Length $ decodedKey = $ decodedKey.Insert (0, $ base24 [$ digitMapIndex]) ## Видалення першого символу в ключі і приміщення 'N' в потрібну позицію if ([System.Boolean] $ containsN) $ firstLetterIndex = 0 for ($ index = 0; $ index -lt $ decodeStringLength; $ index ++) if ($ decodedKey [0] -ne $ base24 [$ index]) continue $ firstLetterIndex = $ index break $ keyWithN = $ decodedKey $ keyWithN = $ keyWithN.Remove (0, 1) $ keyWithN = $ keyWithN.Substring (0, $ firstLetterIndex) + 'N' + $ keyWithN.Remove (0, $ firstLetterIndex) $ decodedKey = $ keyWithN;  $ ReturnValue = $ decodedKey ## Вставка тире через кожні п'ять символів for ($ t = 20; $ t -ge 5; $ t - = 5) $ returnValue = $ returnValue.Insert ($ t, '-') return $ returnValue ## Main New-Variable -Name hklm -Value 2147483650 ## -Option Const New-Variable -Name regPath -Value 'Software \ Microsoft \ Windows NT \ CurrentVersion' ## -Option Const New-Variable -Name regValue -Value 'DigitalProductId' ## -Option Const Foreach ($ target in $ Targets) $ win32os = $ null $ wmi = [WMIClass] "\\ $ target \ root \ default: stdRegProv" $ binArray = $ wmi.GetBinaryValue ( $ hklm, $ regPath, $ regValue) .uValue [52 ... 66] $ win32os = Get-WmiObject -Class 'Win32_OperatingSystem' -ComputerName $ target $ product = New-Object -TypeName System.Object ## Конструктор $ product | Add-Member -MemberType 'NoteProperty' -Name 'Computer' -Value $ target $ product | Add-Member -MemberType 'NoteProperty' -Name 'Caption' -Value $ win32os.Caption $ product | Add-Member -MemberType 'NoteProperty' -Name 'CSDVersion' -Value $ win32os.CSDVersion $ product | Add-Member -MemberType 'NoteProperty' -Name 'OSArch' -Value $ win32os.OSArchitecture $ product | Add-Member -MemberType 'NoteProperty' -Name 'BuildNumber' -Value $ win32os.BuildNumber $ product | Add-Member -MemberType 'NoteProperty' -Name 'RegisteredTo' -Value $ win32os.RegisteredUser $ product | Add-Member -MemberType 'NoteProperty' -Name 'ProductID' -Value $ win32os.SerialNumber $ product | Add-Member -MemberType 'NoteProperty' -Name 'ProductKey' -Value (PIDDecoderFromRegistry ($ binArray)) Write-Output $ product ## End Get-WindowsProduct