22

Throughout the office we have several computers running Windows 10 (a dozen or so) but we have no clear idea which of our licenses are activated on which computer. Is it possible to extract the currently used license key from each computer?

We don't use AD or a KMS or anything like that, each computer is set up solely for the individual working on it. We are aware of which keys we own, but we don't know which are in use and where. We have a mix of OEM, MSDN and "regular" licenses.

31

You can use NirSoft's 'ProduKey'. You can download it on nirsoft.net. This is a freeware utility which allows you not only to see Windows keys, but also various other Microsoft product keys.

This method works for volume licenses, as well as for OEM and other standalone licenses.

Note that it does not officially support Windows 10, but my experience so far has been successful.

| improve this answer | |
  • 3
    Office keys through, I think, 2010, but not later versions (which don't store their keys in the registry in full). For those, you can get the last five digits of the key using ospp.vbs, which is installed in C:\Program Files (x86)\Microsoft Office\Office16 Substitute 15, 14 etc for earlier versions of Office. 2019 and 365 are both under 16. That's for 32-bit Office. For 64-bit, substitute Program Files for Program Files (x86) – Steve Rindsberg Jun 15 at 15:43
  • 3
    There are several decent articles on the web about ospp, or refer people to the ospp.html file in the same directory as the VBS. It lists lots of other interesting command line parms. BTW, I tried ProduKey in a recently updated Win10 VM with Office 365 and it couldn't find either key. So our mileage may vary, as they say. But the nirsoft utility is fast and simple to try; well worth having a go with it. – Steve Rindsberg Jun 15 at 15:53
  • 1
    Thanks a lot for going through this. I adjusted my answer to make it slightly more vague but also more accurate when it comes to these keys. – BramMooij Jun 15 at 15:55
  • 1
    This seems to work on my machine, I'll go and try it out on a few other machines and report back :) – MMM Jun 16 at 6:55
  • 2
    @BramMooij Thanks, this seems to be working on other machines as well! – MMM Jun 16 at 9:19
15

Enter:

wmic path softwareLicensingService get OA3xOriginalProductKey 

into Command Prompt (Admin)

This will show the original Windows 10 product key for each machine.

NOTE: This only works for OEM licenses.

| improve this answer | |
  • I've tried running this in both powershell and cmd, as regular user and admin, but it returns nothing. – MMM Jun 15 at 14:32
  • 1
    Use an Admin Command prompt. It returned the Key here. – John Jun 15 at 14:38
  • @John I have, as I mentioned, but it's not returning anything. All I get is OA3xOriginalProductKey followed by three (empty) lines. – MMM Jun 15 at 14:39
  • 1
    Make sure you know how you got the keys, who from, and how you paid for them. answers.microsoft.com/en-us/windows/forum/all/… – John Jun 15 at 14:55
  • 4
    @MMM - The command suggested by this answer only applies to OEM keys. If the command returns nothing it means your not running it on a machine with an OEM key. In fact, every answer you have received so far, only works for OEM keys. – Ramhound Jun 15 at 17:03
5

If you are running windows on a genuine windows copy that is connected to the motherboard (an OEM key), you can use this command i windows administrator command prompt:

wmic path softwareLicensingService get OA3xOriginalProductKey

or in Administrator Powershell

$(Get-WmiObject -query 'select * from SoftwareLicensingService').OA3xOriginalProductKey

however, if you entered a product key or have a digital liscence connected to the computer, this won't work. You can get the product key that is on your computer with a VBScript as shown here authored by Hackoo. There are many different VBScripts well known to get your product key and most of them are based on the registry since the registry stores your product key formatted in a specific way (semi-encrypted but not really if you will).

Sometimes, the registry values change or get removed so in that case, I would use extra third-party software if that is not a limitation or of concern. My favorite right now is ProduKey


VBScript by Hackoo below

const HKEY_LOCAL_MACHINE = &H80000002

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "DigitalProductId"
strComputer = "."
dim iValues()

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
  strComputer & "\root\default:StdRegProv")
oReg.GetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,iValues

Dim arrDPID
arrDPID = Array()
For i = 52 to 66
  ReDim Preserve arrDPID( UBound(arrDPID) + 1 )
  arrDPID( UBound(arrDPID) ) = iValues(i)
Next
' <--- Create an array to hold the valid characters for a microsoft Product Key --->
Dim arrChars
arrChars = Array("B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9")

' <--- The clever bit !!! (Decrypt the base24 encoded binary data) --->
For i = 24 To 0 Step -1
  k = 0
  For j = 14 To 0 Step -1
    k = k * 256 Xor arrDPID(j)
    arrDPID(j) = Int(k / 24)
    k = k Mod 24
  Next
  strProductKey = arrChars(k) & strProductKey
  ' <--- add the "-" between the groups of 5 Char --->
  If i Mod 5 = 0 And i <> 0 Then strProductKey = "-" & strProductKey
Next
strFinalKey = strProductKey

' <--- This part of the script displays operating system Information and the license Key --->
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
  ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
  strOS   = objOperatingSystem.Caption
  strBuild   = objOperatingSystem.BuildNumber
  strSerial   = objOperatingSystem.SerialNumber
  strRegistered  = objOperatingSystem.RegisteredUser
Next

Set wshShell=CreateObject("wscript.shell")
strPopupMsg = strOS & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Build Number:  " & strBuild & vbNewLine
strPopupMsg = strPopupMsg & "PID:  " & strSerial & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Registered to:  " & strRegistered & vbNewLine & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Your Windows Product Key is:" & vbNewLine & vbNewLine & strFinalKey
strPopupTitle = "Microsoft Windows License Information"
wshShell.Popup strPopupMsg,,strPopupTitle,vbCancelOnly+vbinformation

Another VBScript that works

Option Explicit
Dim objshell,path,DigitalID, Result
Set objshell = CreateObject("WScript.Shell")
'Set registry key path
Path = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
'Registry key value
DigitalID = objshell.RegRead(Path & "DigitalProductId")
Dim ProductName,ProductID,ProductKey,ProductData
'Get ProductName, ProductID, ProductKey
ProductName = "Product Name: " & objshell.RegRead(Path & "ProductName")
ProductID = "Product ID: " & objshell.RegRead(Path & "ProductID")
ProductKey = "Installed Key: " & ConvertToKey(DigitalID)
ProductData = ProductName & vbNewLine & ProductID & vbNewLine & ProductKey
'Show messbox if save to a file
If vbYes = MsgBox(ProductData & vblf & vblf & "Save to a file?", vbYesNo + vbQuestion, "BackUp Windows Key Information") then
Save ProductData
End If
'Convert binary to chars
Function ConvertToKey(Key)
Const KeyOffset = 52
Dim isWin8, Maps, i, j, Current, KeyOutput, Last, keypart1, insert
'Check if OS is Windows 8
isWin8 = (Key(66) \ 6) And 1
Key(66) = (Key(66) And &HF7) Or ((isWin8 And 2) * 4)
i = 24
Maps = "BCDFGHJKMPQRTVWXY2346789"
Do
Current= 0
j = 14
Do
Current = Current* 256
Current = Key(j + KeyOffset) + Current
Key(j + KeyOffset) = (Current \ 24)
Current=Current Mod 24
j = j -1
Loop While j >= 0
i = i -1
KeyOutput = Mid(Maps,Current+ 1, 1) & KeyOutput
Last = Current
Loop While i >= 0

If (isWin8 = 1) Then
keypart1 = Mid(KeyOutput, 2, Last)
insert = "N"
KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
If Last = 0 Then KeyOutput = insert & KeyOutput
End If
ConvertToKey = Mid(KeyOutput, 1, 5) & "-" & Mid(KeyOutput, 6, 5) & "-" & Mid(KeyOutput, 11, 5) & "-" & Mid(KeyOutput, 16, 5) & "-" & Mid(KeyOutput, 21, 5)
End Function
'Save data to a file
Function Save(Data)
Dim fso, fName, txt,objshell,UserName
Set objshell = CreateObject("wscript.shell")
'Get current user name
UserName = objshell.ExpandEnvironmentStrings("%UserName%")
'Create a text file on desktop
fName = "C:\Users\" & UserName & "\Desktop\WindowsKeyInfo.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set txt = fso.CreateTextFile(fName)
txt.Writeline Data
txt.Close
End Function
| improve this answer | |
  • @Hackoo is not the original author of the code, you can read the conversations below. Hackoo also shown a link of the original author, but that's broken – Wasif Hasan Jun 17 at 3:47
  • 5
    This answer is a combination of the answers that were already there. May I ask why you posted an answer that doesn't seem to add anything to the answers that were there? Or am I missing something? – BramMooij Jun 17 at 9:42
  • This is not intended to be a collection of the current answers but does happen to be so. I have encountered this task before when transferring keys from 1 computer to another one and this is what I did from my limited experience of a student. – Neko Musume Jun 18 at 3:19
0

You can use this excellent VBScript code found at https://stackoverflow.com/questions/30255656/vbscript-to-return-windows-product-key

const HKEY_LOCAL_MACHINE = &H80000002

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "DigitalProductId"
strComputer = "."
dim iValues()

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
  strComputer & "\root\default:StdRegProv")
oReg.GetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,iValues

Dim arrDPID
arrDPID = Array()
For i = 52 to 66
  ReDim Preserve arrDPID( UBound(arrDPID) + 1 )
  arrDPID( UBound(arrDPID) ) = iValues(i)
Next
' <--- Create an array to hold the valid characters for a microsoft Product Key --->
Dim arrChars
arrChars = Array("B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9")

' <--- The clever bit !!! (Decrypt the base24 encoded binary data) --->
For i = 24 To 0 Step -1
  k = 0
  For j = 14 To 0 Step -1
    k = k * 256 Xor arrDPID(j)
    arrDPID(j) = Int(k / 24)
    k = k Mod 24
  Next
  strProductKey = arrChars(k) & strProductKey
  ' <--- add the "-" between the groups of 5 Char --->
  If i Mod 5 = 0 And i <> 0 Then strProductKey = "-" & strProductKey
Next
strFinalKey = strProductKey


' <--- This part of the script displays operating system Information and the license Key --->
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
  ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
  strOS   = objOperatingSystem.Caption
  strBuild   = objOperatingSystem.BuildNumber
  strSerial   = objOperatingSystem.SerialNumber
  strRegistered  = objOperatingSystem.RegisteredUser
Next

Set wshShell=CreateObject("wscript.shell")
strPopupMsg = strOS & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Build Number:  " & strBuild & vbNewLine
strPopupMsg = strPopupMsg & "PID:  " & strSerial & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Registered to:  " & strRegistered & vbNewLine & vbNewLine & vbNewLine
strPopupMsg = strPopupMsg & "Your Windows Product Key is:" & vbNewLine & vbNewLine & strFinalKey
strPopupTitle = "Microsoft Windows License Information"
wshShell.Popup strPopupMsg,,strPopupTitle,vbCancelOnly+vbinformation

It will pop up a message including OS version, build number, OEM product ID and the product key from registry. Activation is required before doing this, otherwise it will return wrong product key. To find product key without activation, you can try KeyFinder https://www.magicaljellybean.com/keyfinder/

| improve this answer | |
  • 2
    This appears to return a different key than @BramMooij's answer – MMM Jun 16 at 6:55
-1

get a copy of RecoverKeys recover-keys.com It will also work (if you choose) to scan across network or on a second drive in our machine (example, I moved an old C: drive into my new machine and RK found the serials and prod #'s on that drive too.

Then you can save all keys to a database it keeps

| improve this answer | |
-1

You can use Belarc Advisor, downloadable from Belarc.com.

It will give you a comprehensive list of the software on the computer, as well as their license keys.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.