В этой статье мы поговорим о том, как можно узнать ключ Windows 8, с помощью которого активирована система. Напомним, в Windows 8, как и в предыдущих ОС семейства Microsoft – ключ продукта представляет собой последовательность из 25 символов, разделенных на 5 групп по 5 символов в каждой (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX). Данный ключ используется для активации всех версий Windows 8.
При активации 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.
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
Готовый vbs скрипт можно скачать тут:get_windows_8_key_vbs.zip.
Узнать ключ установленной Windows 8 можно также с помощью Powerhell.
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 } }
Set-ExecutionPolicy RemoteSigned
Import-Module d:\myfile.ps1; Get-WindowsKey
Готовый powershell скрипт находится тут:get_windows_8_key_ps.zip
<pre escaped="true" lang="powershell">## Декларация функции получения ключа продукта 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 ## <24> символа использующиеся в ключах продукта 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
Original https://kb.vmware.com/s/article/2042141 Backing up ESXi host configuration data To synchronize the configuration changed with persistent…
vCenter Converter Standalone 6.6.0 download (далее…)
VMware remote console (VMRC) 12.0.5 download Last version: VMware Remote Console 12.0.5 28 NOV 2023…
SELECT col_sizes.TABLE_SCHEMA, col_sizes.TABLE_NAME, SUM(col_sizes.col_size) AS EST_MAX_ROW_SIZE FROM ( SELECT cols.TABLE_SCHEMA, cols.TABLE_NAME, cols.COLUMN_NAME, CASE cols.DATA_TYPE WHEN…
UPDATE DB SET column = DATE(STR_TO_DATE(column, '%Y-%d-%m')) WHERE DATE(STR_TO_DATE(column, '%d-%m-%Y')) <> '0000-00-00'
echo 1 > /sys/class/block/sda/device/rescan #maybe run under root> sudo fdisk /dev/sda2 > d > 2…