Ключ установки Microsoft Office после активации продукта продолжает хранится в реестре системы. Для защиты ключ продукта хранится не в открытом, а в шифрованном с помощью кодировки Base64 виде. Этот метод кодировки не является стойким, поэтому не составляет труда извлечь его с помощью простого скрипта (аналогичную методику мы рассматривали в статье, описывающей извлечения ключа установки Windows 8). В этой статье мы приведем как с помощью PowerShell и vbs скриптов без использования сторонних утилит получить код активации уже установленной копии MS Office.
Данные скрипты удобно использовать при утрате документов или наклеек с ключами установки Microsoft Office.
Сначала рассмотрим скрипт получения ключа на PowerShell
- Создайте новый текстовый файл (в том же notepad.exe)
- Скопируйте в него следующий код:
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 }
- Сохраните файл с расширением .ps1
- В зависимости от версии MS Office: если используется 32 битная версия Office, запустите с правами администратора 32-битную консоль PowerShell. В случае использования 64 битного Office, запускайте 64 битную консоль PowerShell.Советы. Office 2007 и ниже бывают только 32 разрядные. Office 2010, 2013 и 2016 – бывают как 32 так и 64 разрядные. На 32 разрядной Windows нельзя установить 64 битную версию Office.
- В нашем примере на 64 битной Windows установлена 32 битная версия Office, поэтому запускаем Windows PoweShell (x86).
- Разрешим локальный запуск неподписанных скриптов:
Set-ExecutionPolicy RemoteSigned
На запрос жмем Y и Enter. - Импортируем ранее сохраненный скрипт командой и вызовем функцию из него:
Import-Module C:\Tools\getmsofficekey.ps1; Get-MSOfficeProductKey
- На экран должны быть выведена табличка, содержащая информацию о всех установленных версиях 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(intCur,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)
BitShiftRight = 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")
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
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",strOfficeEdition
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
Часть ключа должна совпадать с полученными ранее данными.
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)
На mak-ключи распространяется?
MAK ключи вроде в реестре не сохраняются (MAK ключ от Windows точно не сохраняется), если есть возможность проверить на Office — поделитесь результатом.
По поводу офиса не знаю есть ли способ, не гуглил.
Встречал на просторах способ получить мак-ключ Windows.
Не разу им пользовался, не было необходимости.
Суть способа в правке реестра, отвечающего за ключ.
Windows восстанавливает тот параметр. Этот момент восстановления ловится и получаем мак-ключ. Сам способ можно попытаться нагуглить. Хотя это непросто)
Я никогда даже и не подумал бы об этом. Спасибо, всё по полочкам. И ваши ремарки и советы в тему.
Не работает ни один из способов, первый способ — нет никакой информации о лицензионном ключе, 2 способ — ничего не происходит. Мною всё сделано верно, Офис 2016.
Хотя бы частичный ключ удается получить (последние 5 символов)?
cscript «C:\Program Files (x86)\Microsoft Office\Office14\OSPP.VBS» /dstatus
У меня частичный ключ кажет. 5 символов. По вашим методам — тоже тишина. Офис 2016 32bit Винда 7 32bit.
Та же самая проблема.
Офис 2013 32bit, Windows 7 Prof 64bit
Краткий ключ виден, но ни одна программа (AIDA, ProduKey и т.п.) и ни один скрипт из вышеуказанных ключ не показывают в принципе. Такое ощущение, что товарищи из Microsoft ключик перепрятали
Подскажите, как сохранить отображаемый ключ на раб. стол или в ту папку откуда запускается vbs-скрипт?
Замените код функции Sub WriteData(strProperty,strValue) на:
Sub WriteData(strProperty,strValue)
Set WshShell = CreateObject(«WScript.Shell»)
Set objFSO=CreateObject(«Scripting.FileSystemObject»)
strCurDir = WshShell.CurrentDirectory
outFile = strCurDir & «\office_key.txt»
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write strProperty & «: » & Trim(strValue) & vbCrLf
objFile.Close
Set WshShell = Nothing
End Sub
Ошибку выбивает — недопустимый знак с кодом 800A0408
Каждый способ выдаёт разные результаты (к-лю-чи). Какой реальный? Винда семёрка обновлённая до десятки.
Реальный OSPP.VBS /dstatus
Значит, скрипты для получения ключа на PowerShell и VBs работают не правильно. В них нужно изменить написание. Windows 32-х битная. Это важно.
Как он может показывать неправильный ключ? Скрипт должен ибо показывать, либо нет.
Ну или показывать прописанный в скрипте ключ, а скрипт сам предназначен не для поиска ключа ))))
как удалить ключ офиса старого из системы не знаешь?
produkey показывает ключи для 2х офисов. надо один убрать. где они хранятся кроме реестра?
hklm\software\microsoft\office\ нет папок registration нигде
Не получается узнать номер Office 2016. Подскажите как это можно сделать.
Nuclear Coffee Recover Keys 8.0.3.113 Enterprise. 2016 ключ виден, как и все ключи что есть на компе.
К сожалению эта программа показывает только последнюю группу серийного номера. А это можно получить более простым способом.
Пробовал версию Recover Keys Enterprise 9.0.3.168
Испробовал.
VBS — не дал результата, в первом окне пишет Microsoft products.
во втором пустое окно.
PowerShell — запустил обычный (х64), после импорта скрипта — никакой реакции.
запустил (x86), после импорта показал ключ.
Но блин! Это не тот ключ, это не ключ продукта которым он активирован.
Пытаюсь получить информацию с компов в доменной сети (добавил получение списка компов из AD командлеттом Get-ADComputer, потом сохраняю Get-MSOfficeProductKey $Comp.Name | Out-File «D:\OfficeKeys.txt» -Append), ProductName пустой, на большинстве 99% одинаковые ключи, вот думаю, пиратил прошлый админ или скрипт так себе…
Добрый день! попробовал активировать офис 2016 при помощи kmsauto-net-2015-v1.4.0-portable. Написало все успешно активировало, но при запуске офиса требует активации. подскажите чего делать. Заранее благодарен.
Вы ошиблись. На этом сайте не обсуждаются проблемы, вызванные «активаторами» и другими нелегальными способами обхода защиты ПО.
Автор, большое спасибо за труд!
Я правильно понял, что скрипт не заточен под 16-ый офис? Можете выложить исправление скрипта под 16-ый офис?
По идее скрипт универсальный, но могут быть нюансы с Office x64. У вас какая версия, разрядность и тип лицензии MS Office (см тут https://winitpro.ru/index.php/2017/12/05/proverka-statusa-aktivacii-office-2016-365/)?
x32 для дома и бизнеса 2016.
PRODUCT ID: 00343-80000-00000-AA703
SKU ID: 6379f5c8-baa4-482e-a5cc-38ade1a57348
LICENSE NAME: Office 16, Office16HomeBusinessR_Grace edition
LICENSE DESCRIPTION: Office 16, RETAIL(Grace) channel
BETA EXPIRATION: 01.01.1601
LICENSE STATUS: —OOB_GRACE—
ERROR CODE: 0x4004F00C
ERROR DESCRIPTION: The Software Licensing Service reported that the application is running within the valid grace period.
До удаления офиса проблем с лицензией не было.
Хотел перейти на x64 как описано на сайте Microsoft…
Скрипты ps1 и vbs выдали разные лицензии, но они не совпадают с ключом данного офиса.
Скрипты для извлечения ключа MS office 2016 не дают требуемый результат.
ОС Windows 10 Prox64
MS Office 2016 x86
Какой тип ключа (лицензии) Office 16 у вас используется (License Name)? Его можно узнать с помощью:
cscript ospp.vbs /dstatus
Здравствуйте!
Как узнать ключ виндовс 7 и офис 10 на диске со сломанным загрузчиком (требуется переустановка системы)? Диск подключен как второй.
Вам нужно загрузить в редактор реестра файл с веткой SOFTWARE нерабочей Windows из файла \system32\config\software. Эта ветка подключается под некоторым именем, вам нужно изменить скрипт, указав путь к вашей ветке со смонтированной веткой в переменной
$path = "hklm_localhive\SOFTWARE\Microsoft\Office"
Нашёл файл software на нерабочем диске. Зашел в реестр Hkey_local_machine — software. Что дальше, не понял.
Ветка F:\Windows\System32\config\SOFTWARE
В реестре как? Импорт и указать этот файл?
В редакторе реестра встаете на ветку HKEY_LOCAL_Machine и в меню выберите пункт «Загрузить куст». Укажите файл F:\Windows\System32\config\SOFTWARE
а как посмотреть в офисе код продукта который вводится активацией по телефону?! а то не успел заскринить обратный код
Программой Aida64 можно.
Перепробовал многое. А удалось только последние пять символов получить. Скрипты показывают как будто нет офиса и ключей тоже. По предложенному решению пустые поля. А он стоит, Офис 2016 для дома и бизнеса. Говорят коробочный был. А коробку то ли стащали, то ли потеряли. А тут стоит вопрос переустановки. Как добыть это ключ?
Нельзя получить ключи для Office 2013, Office 2016 с помощью предложенных скриптов. Наверно это не возможно сделать. Печаль
Да. Для офисов выше 2010 вроде или даже с 2010 нельзя получить ключи. Они не хранятся в реестре. Это официальный ответ майкрософт — только последние 5 цифр официальным способом указанным выше.
2010 можно, с 2013 нельзя
vbs скрипт который под Скопируйте в него следующий код:
не работает в отличие от того который в архиве
видимо всё дело в форматировании
автор поправь используя сервисы js beatiful и подобные
и ещё зачем на vbs скрипт выкладывать когда код занимает больше места чем на powershell?