24

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.

MMM
  • 2,652
  • 5
  • 25
  • 43
  • 2
    Does this answer your question? [Where is the Windows license key on Windows 10?](https://superuser.com/questions/1506522/where-is-the-windows-license-key-on-windows-10) – TylerH Nov 24 '21 at 05:02
  • @TylerH it does not - That question is focused on extracting the key without being able to enter the windows desktop environment and relies on tools that work under linux. – MMM Nov 24 '21 at 08:04
  • I don't see that it relies on that at all. OP just happened to be searching for a physical key value in the hard drive somewhere via Linux in-between Windows installations. As you can see from the accepted answer, they were happy to find a solution that has nothing to do with/doesn't require Linux whatsoever. In fact, *none* of the answers there even *work* on Linux. – TylerH Nov 24 '21 at 15:06

6 Answers6

33

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.

BramMooij
  • 789
  • 4
  • 17
  • 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 '20 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 '20 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 '20 at 15:55
  • For me, both Office 2010 and 2016 do not list the 'ospp.vbs' file you refer to. Perhaps that's why it works for me. – BramMooij Jun 15 '20 at 16:01
  • Odd. I've got both (and scads of others in vms) It's there in all of them. Do you have a case of Nasty IT Admin? ;-) – Steve Rindsberg Jun 15 '20 at 21:50
  • We do have custom installer packages, so probably yes. They tell you to turn off UAC as well, so definitely yes – BramMooij Jun 15 '20 at 22:01
  • 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 '20 at 06:55
  • 2
    @BramMooij Thanks, this seems to be working on other machines as well! – MMM Jun 16 '20 at 09:19
15

Enter:

wmic path softwareLicensingService get OA3xOriginalProductKey 

into Command Prompt (Admin), then hit enter.

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

NOTE: This only works for OEM licenses.

Virtuality
  • 1,280
  • 1
  • 9
  • 35
  • I've tried running this in both powershell and cmd, as regular user and admin, but it returns nothing. – MMM Jun 15 '20 at 14:32
  • 2
    Use an Admin Command prompt. It returned the Key here. – John Jun 15 '20 at 14:38
  • 1
    @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 '20 at 14:39
  • At such a machine, right click on My Computer (PC) and select Properties. You should see on the first GUI screen that it has been Activated and the MSDN Key. I assume you got a paid subscription for the keys. – John Jun 15 '20 at 14:44
  • It also does not work for me, but we have licenses activated over a server (KMS). From what I read, this fix only works for OEM licenses. – BramMooij Jun 15 '20 at 14:50
  • This works on my side too. – Virtuality Jun 15 '20 at 14:51
  • Yes, I'm pretty sure this doesn't work if you use a license activated over a server such as a Volume License. – Virtuality Jun 15 '20 at 14:53
  • 1
    Make sure you know how you got the keys, who from, and how you paid for them. https://answers.microsoft.com/en-us/windows/forum/all/information-about-msdn-product-key/b9622868-ea8c-486b-825f-da2e78aba37b – John Jun 15 '20 at 14:55
  • There are some videos on YouTube which mention that you can 'activate Windows for free'; these videos , in fact, just activate the license over a server and do not give you a hardware-specific license for your machine, these also expire when not renewed by the host of the server. – Virtuality Jun 15 '20 at 14:56
  • This method should work with an OEM license. – Virtuality Jun 15 '20 at 15:01
  • @John that is not the problem, we know which keys we have, we don't know which are used and where. – MMM Jun 15 '20 at 15:16
  • 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 '20 at 17:03
4

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
Nico Nekoru
  • 270
  • 1
  • 10
  • @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 Jun 17 '20 at 03:47
  • 6
    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 '20 at 09: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. – Nico Nekoru Jun 18 '20 at 03: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/

Wasif
  • 7,984
  • 2
  • 19
  • 32
-3

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.

wgr
  • 5
  • 2
-4

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