Як дізнатися ключ активації встановленого 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 = "SOFTWARE \ Microsoft \ Office" foreach ($ computer in $ computerName) $ wmi = [WMIClass] "\\ $ computer \ root \ default: 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
  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).
  6. Дозволимо локальний запуск непідписаних скриптів:Set-ExecutionPolicy RemoteSignedНа запит тиснемо Y і Enter.
  7. Імпортуємо раніше збережений скрипт командою і викличемо функцію з нього:Import-Module C: \ Tools \ getmsofficekey.ps1; Get-MSOfficeProductKey
  8. На екран повинні бути виведена табличка, яка містить інформацію про всіх встановлених версіях Office. В поле ProductName міститиметься ім'я встановленого продукту, а в поле ProductKey - ключ активації.

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

Аналогічний скрипт для отримання ProducId і ключів MS Office на Vbscript

Const HKLM = & H80000002 Computer = "." Set objWMIService = GetObject ( "winmgmts: \\" & Computer & "\ root \ cimv2") Set Obj = objWMIService.ExecQuery ( "Select * from Win32_OperatingSystem") dim InsDate For Each item in Obj InsDate = item.InstallDate 'Gather Operating System Information Caption = Item.Caption OSArchitecture = Item.OSArchitecture CSDVersion = Item.CSDVersion Version = Item.Version Next dim NewDate NewDate = mid (InsDate, 9,2) & ":" & mid (InsDate, 11,2) & " : "& mid (InsDate, 13,2) NewDate = NewDate &" "& mid (InsDate, 7,2) &" / "& mid (InsDate, 5,2) &" / "& mid (InsDate, 1, 4) wscript.echo 'vbCrLf & "Office Keys" & vbCrLf QueryOfficeProductKeys () Function DecodeProductKey (arrKey, intKeyOffset) If Not IsArray (arrKey) Then Exit Function intIsWin8 = BitShiftRight (arrKey (intKeyOffset + 14), 3) And 1 arrKey ( intKeyOffset + 14) = arrKey (intKeyOffset + 14) And 247 Or BitShiftLeft (intIsWin8 And 2,2) i = 24 strChars = "BCDFGHJKMPQRTVWXY2346789" strKeyOutput = "" While i> -1 intCur = 0 intX = 14 While intX> -1 intCur = BitShiftLeft (i ntCur, 8) intCur = arrKey (intX + intKeyOffset) + intCur arrKey (intX + intKeyOffset) = Int (intCur / 24) intCur = intCur Mod 24 intX = intX - 1 Wend i = i - 1 strKeyOutput = Mid (strChars, intCur + 1,1) & strKeyOutput intLast = intCur Wend If intIsWin8 = 1 Then strKeyOutput = Mid (strKeyOutput, 2, intLast) & "N" & Right (strKeyOutput, Len (strKeyOutput) - (intLast + 1)) End If strKeyGUIDOutput = Mid (strKeyOutput, 1,5) & "-" & Mid (strKeyOutput, 6,5) & "-" & Mid (strKeyOutput, 11,5) & "-" & Mid (strKeyOutput, 16,5) & "- "& Mid (strKeyOutput, 21,5) DecodeProductKey = strKeyGUIDOutput End Function Function RegReadBinary (strRegPath, strRegValue) Set objReg = GetObject (" winmgmts: impersonationLevel = impersonate! \\. \ root \ default: StdRegProv ") objReg.GetBinaryValue HKLM, strRegPath, strRegValue, arrRegBinaryData RegReadBinary = arrRegBinaryData Set objReg = Nothing End Function Function BitShiftLeft (intValue, intShift) BitShiftLeft = intValue * 2 ^ intShift End Function Function BitShiftRight (intValue, intShift) BitShi ftRight = Int (intValue / (2 ^ intShift)) End Function Function QueryOfficeProductKeys () strBaseKey = "SOFTWARE \" strOfficeKey = strBaseKey & "Microsoft \ Office" Set objReg = GetObject ( "winmgmts: impersonationLevel = impersonate! \\. \ root \ default: StdRegProv ") objReg.EnumKey HKLM, strOfficeKey, arrOfficeVersionSubKeys intProductCount = 1 If IsArray (arrOfficeVersionSubKeys) Then For Each strOfficeVersionKey In arrOfficeVersionSubKeys Select Case strOfficeVersionKey Case" 11.0 "CheckOfficeKey strOfficeKey &" \ 11.0 \ Registration ", 52, intProductCount Case "12.0" CheckOfficeKey strOfficeKey & "\ 12.0 \ Registration", 52, intProductCount Case "14.0" CheckOfficeKey strOfficeKey & "\ 14.0 \ Registration", 808, intProductCount Case "15.0" CheckOfficeKey strOfficeKey & "\ 15.0 \ Registration", 808, intProductCount End Select Next End If strBaseKey = "SOFTWARE \ Wow6432Node \" strOfficeKey = strBaseKey & "Microsoft \ Office" Set objReg = GetObject ( "winmgmts: impersonationLevel = impersonate! \\. \ root \ default: StdRegProv") obj Reg.EnumKey HKLM, strOfficeKey, arrOfficeVersionSubKeys intProductCount = 1 If IsArray (arrOfficeVersionSubKeys) Then For Each strOfficeVersionKey In arrOfficeVersionSubKeys Select Case strOfficeVersionKey Case "11.0" CheckOfficeKey strOfficeKey & "\ 11.0 \ Registration", 52, intProductCount Case "12.0" CheckOfficeKey strOfficeKey & " \ 12.0 \ Registration ", 52, intProductCount Case" 14.0 "CheckOfficeKey strOfficeKey &" \ 14.0 \ Registration ", 808, intProductCount Case" 15.0 "CheckOfficeKey strOfficeKey &" \ 15.0 \ Registration ", 808, intProductCount End Select Next End If End Function 'Office Product Key Sub CheckOfficeKey (strRegPath, intKeyOffset, intProductCount) Set objReg = GetObject ( "winmgmts: impersonationLevel = impersonate! \\. \ root \ default: StdRegProv") objReg.EnumKey HKLM, strRegPath, arrOfficeRegistrations If IsArray (arrOfficeRegistrations ) Then For Each strOfficeRegistration In arrOfficeRegistrations objReg.GetStringValue HKLM, strRegPath & "\" & strOfficeRegistration, "ConvertToEdition", strOfficeEdit ion objReg.GetBinaryValue HKLM, strRegPath & "\" & strOfficeRegistration, "DigitalProductID", arrProductID If strOfficeEdition "" And IsArray (arrProductID) Then WriteData "Product", strOfficeEdition WriteData "Key", DecodeProductKey (arrProductID, intKeyOffset) & vbCrLf intProductCount = intProductCount + 1 End If Next End If End Sub Function RegReadBinary (strRegPath, strRegValue) Set objReg = GetObject ( "winmgmts: impersonationLevel = impersonate! \\. \ root \ default: StdRegProv") objReg.GetBinaryValue HKLM, strRegPath, strRegValue , arrRegBinaryData RegReadBinary = arrRegBinaryData Set objReg = Nothing End Function Function OsArch () Set objShell = WScript.CreateObject ( "WScript.Shell") If objShell.ExpandEnvironmentStrings ( "% ProgramFiles (x86)%") = "% ProgramFiles (x86)% "Then OsArch =" x86 "Else OsArch =" x64 "End If Set objShell = Nothing End Function Sub WriteData (strProperty, strValue) WScript.Echo strProperty &": "& Trim (strValue) End Sub 

Готовий файл * .vbs файл: get-office-keys-vbs.zip

Перевіримо отриманий ключ за допомогою стандартної функції, що дозволяє відобразити останні 5 символів ключа. Для 32 бітного Офісу на 64 бітної Windows команда така:

cscript "C: \ Program Files (x86) \ Microsoft Office \ Office14 \ OSPP.VBS" / dstatus

Частина ключа повинна збігатися з отриманими раніше даними.

Примітка. На скріншоті Office 2010, активоване KMS ключем).

SKU ID: 6f327760-8c5c-417c-9b61-836a98287e0c
LICENSE NAME: Office 14, OfficeProPlus-KMS_Client edition
LICENSE DESCRIPTION: Office 14, VOLUME_KMSCLIENT channel
LICENSE STATUS: --- LICENSED---
ERROR CODE: 0 as licensed
Last 5 characters of installed product key: H3GVB
REMAINING GRACE: 178 days (255897 minute (s) before expiring)