Как узнать ключ активации установленного MS Office

Ключ установки Microsoft Office после активации продукта продолжает хранится в реестре системы. Для защиты ключ продукта хранится не в открытом, а в шифрованном с помощью кодировки Base64 виде. Этот метод кодировки не является стойким, поэтому не составляет труда извлечь его с помощью простого скрипта (аналогичную методику мы рассматривали в статье, описывающей извлечения ключа установки Windows 8 ). В этой статье мы приведем как с помощью PowerShell и vbs скриптов без использования сторонних утилит получить код активации уже установленной копии MS Office.

Данные скрипты удобно использовать при утрате документов или наклеек с ключами установки Microsoft Office.

Сначала рассмотрим скрипт получения ключа на PowerShell

  1. Создайте новый текстовый файл (в том же notepad.exe)
  2. Скопируйте в него следующий код:
    function Get-MSOfficeProductKey { param( [string[]]$computerName = "." ) $product = @() $hklm = 2147483650 $path = "SOFTWAREMicrosoftOffice" foreach ($computer in $computerName) { $wmi = [WMIClass]"\$computerrootdefault:stdRegProv" $subkeys1 = $wmi.EnumKey($hklm,$path) foreach ($subkey1 in $subkeys1.snames) { $subkeys2 = $wmi.EnumKey($hklm,"$path$subkey1") foreach ($subkey2 in $subkeys2.snames) { $subkeys3 = $wmi.EnumKey($hklm,"$path$subkey1$subkey2") foreach ($subkey3 in $subkeys3.snames) { $subkeys4 = $wmi.EnumValues($hklm,"$path$subkey1$subkey2$subkey3") foreach ($subkey4 in $subkeys4.snames) { if ($subkey4 -eq "digitalproductid") { $temp = "" | select ComputerName,ProductName,ProductKey $temp.ComputerName = $computer $productName = $wmi.GetStringValue($hklm,"$path$subkey1$subkey2$subkey3","productname") $temp.ProductName = $productName.sValue $data = $wmi.GetBinaryValue($hklm,"$path$subkey1$subkey2$subkey3","digitalproductid") $valueData = ($data.uValue)[52..66] # decrypt base24 encoded binary data $productKey = "" $chars = "BCDFGHJKMPQRTVWXY2346789" for ($i = 24; $i -ge 0; $i--) { $r = 0 for ($j = 14; $j -ge 0; $j--) { $r = ($r * 256) -bxor $valueData[$j] $valueData[$j] = [math]::Truncate($r / 24) $r = $r % 24 } $productKey = $chars[$r] + $productKey if (($i % 5) -eq 0 -and $i -ne 0) { $productKey = "-" + $productKey } } $temp.ProductKey = $productKey $product += $temp } } } } } } $product } 
  3. Сохраните файл с расширением .ps1 Powershell скрипт для извлечения ключа установки Office 2010
  4. В зависимости от версии MS Office: если используется 32 битная версия Office, запустите с правами администратора 32-битную консоль PowerShell. В случае использования 64 битного Office, запускайте 64 битную консоль PowerShell.
    Советы . Office 2007 и ниже бывают только 32 разрядные. Office 2010, 2013 и 2016 – бывают как 32 так и 64 разрядные. На 32 разрядной Windows нельзя установить 64 битную версию Office.
  5. В нашем примере на 64 битной Windows установлена 32 битная версия Office, поэтому запускаем Windows PoweShell (x86). Запуск PowerShell x86 с правами администратора
  6. Разрешим локальный запуск неподписанных скриптов: Set-ExecutionPolicy RemoteSigned На запрос жмем Y и Enter. Set-ExecutionPolicy RemoteSigned
  7. Импортируем ранее сохраненный скрипт командой и вызовем функцию из него: Import-Module C:Toolsgetmsofficekey.ps1; Get-MSOfficeProductKey
  8. На экран должны быть выведена табличка, содержащая информацию о всех установленных версиях Office. В поле ProductName будет содержаться имя установленного продукта, а в поле ProductKey – ключ активации. Ключ установки MS Office

Готовый Powershell скрипт можно скачать тут: getmsofficekey-posh.zip

Аналогичный скрипт для получения ProducId и ключей MS Office на Vbscript

Const HKLM = &H80000002_x000D__x000D_Computer = "."_x000D_Set objWMIService = GetObject("winmgmts:\" & Computer & "rootcimv2")_x000D_Set Obj = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")_x000D__x000D_dim InsDate_x000D__x000D_For Each item in Obj_x000D_ InsDate = item.InstallDate_x000D_ ' Gather Operating System Information_x000D_ Caption = Item.Caption_x000D_ OSArchitecture = Item.OSArchitecture_x000D_ CSDVersion = Item.CSDVersion_x000D_ Version = Item.Version_x000D_ Next_x000D__x000D_dim NewDate_x000D__x000D_NewDate = mid(InsDate,9,2) & ":" & mid(InsDate,11,2) & ":" & mid(InsDate,13,2)_x000D_NewDate = NewDate & " " & mid(InsDate,7,2) & "/" & mid(InsDate,5,2) & "/" & mid(InsDate,1,4)_x000D__x000D_wscript.echo 'vbCrLf & "Office Keys" & vbCrLf_x000D__x000D_QueryOfficeProductKeys()_x000D__x000D_Function DecodeProductKey(arrKey, intKeyOffset)_x000D_ If Not IsArray(arrKey) Then Exit Function_x000D_ intIsWin8 = BitShiftRight(arrKey(intKeyOffset + 14),3) And 1 _x000D_ arrKey(intKeyOffset + 14) = arrKey(intKeyOffset + 14) And 247 Or BitShiftLeft(intIsWin8 And 2,2)_x000D_ i = 24_x000D_ strChars = "BCDFGHJKMPQRTVWXY2346789"_x000D_ strKeyOutput = ""_x000D_ While i > -1_x000D_ intCur = 0_x000D_ intX = 14_x000D_ While intX > -1_x000D_ intCur = BitShiftLeft(intCur,8)_x000D_ intCur = arrKey(intX + intKeyOffset) + intCur_x000D_ arrKey(intX + intKeyOffset) = Int(intCur / 24) _x000D_ intCur = intCur Mod 24_x000D_ intX = intX - 1_x000D_ Wend_x000D_ i = i - 1_x000D_ strKeyOutput = Mid(strChars,intCur + 1,1) & strKeyOutput_x000D_ intLast = intCur_x000D_ Wend_x000D_ If intIsWin8 = 1 Then_x000D_ strKeyOutput = Mid(strKeyOutput,2,intLast) & "N" & Right(strKeyOutput,Len(strKeyOutput) - (intLast + 1)) _x000D_ End If_x000D_ strKeyGUIDOutput = Mid(strKeyOutput,1,5) & "-" & Mid(strKeyOutput,6,5) & "-" & Mid(strKeyOutput,11,5) & "-" & Mid(strKeyOutput,16,5) & "-" & Mid(strKeyOutput,21,5)_x000D_ DecodeProductKey = strKeyGUIDOutput_x000D_End Function_x000D__x000D_Function RegReadBinary(strRegPath,strRegValue)_x000D_ Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.rootdefault:StdRegProv")_x000D_ objReg.GetBinaryValue HKLM,strRegPath,strRegValue,arrRegBinaryData_x000D_ RegReadBinary = arrRegBinaryData_x000D_ Set objReg = Nothing_x000D_End Function_x000D__x000D_Function BitShiftLeft(intValue,intShift)_x000D_ BitShiftLeft = intValue * 2 ^ intShift_x000D_End Function_x000D__x000D_Function BitShiftRight(intValue,intShift)_x000D_ BitShiftRight = Int(intValue / (2 ^ intShift))_x000D_End Function_x000D__x000D_Function QueryOfficeProductKeys()_x000D__x000D_ strBaseKey = "SOFTWARE"_x000D__x000D_ strOfficeKey = strBaseKey & ""MicrosoftOffice""_x000D_ Set objReg = GetObject(""winmgmts:{impersonationLevel=impersonate}!\.rootdefault:StdRegProv"")_x000D_ objReg.EnumKey HKLMstrOfficeKeyarrOfficeVersionSubKeys_x000D_ intProductCount = 1_x000D_ If IsArray(arrOfficeVersionSubKeys) Then_x000D__x000D_ For Each strOfficeVersionKey In arrOfficeVersionSubKeys_x000D_ Select Case strOfficeVersionKey_x000D_  Case ""11.0""_x000D_ CheckOfficeKey strOfficeKey & ""11.0Registration""

EnglishRussianUkrainian