Windows Product key is important if you want to activate the Windows, even though you already have an activated copy of Windows but you still need the product key in case you need to reinstall the Windows. The Windows product key is actually stored in the registry which can be retrieved using command. If you are unable to find the Windows key, use this article will show you simple steps, commands and script to find and retrieve Windows 11 product key.
Content Summary
Method 1: Use command prompt to execute SoftwareLicensingService class
Method 2: Use PowerShell to execute SoftwareLicensingService class
Method 3: Retrieve DigitalProductId Registry Key using VBScript
Method 4: Execute Get-ProductKey function with PowerShell script
Reference
Method 1: Use command prompt to execute SoftwareLicensingService class
Step 1: Click on the Search icon in the Taskbar to open Search box.
Step 2: Type cmd
in the Search box.
Step 3: Click the Run as administrator to open elevated Command Prompt.
Step 4: The User Account Control (UAC) window will prompt. Click Yes to run the Windows Command Prompt as Administrator.
Step 5: Type or copy-paste the following command into the elevated command prompt and press Enter:
wmic path SoftwareLicensingService get OA3xOriginalProductKey
Step 6: The Windows product key will display below OA3xOriginalProductKey.
In the event that product key not displaying or showing blank result.
This is because your Windows copy is activated with a digital license instead of firmware-embedded activation key. This command will only works if you are using product key instead of digital license. Proceed to the next method.
Method 2: Use PowerShell to execute SoftwareLicensingService class
Step 1: Click on the Search icon in the Taskbar to open Search box.
Step 2: Type powershell
in the Search box.
Step 3: Right-click on the Windows PowerShell and click on the Run as administrator option from the context menu to open elevated PowerShell.
Step 4: The User Account Control (UAC) window will prompt. Click Yes to run the PowerShell as Administrator.
Step 5: Type or copy-paste the following command into the elevated command prompt and press Enter:
powershell “(Get-WmiObject -query ‘select * from SoftwareLicensingService’).OA3xOriginalProductKey”
Step 6: The Windows product key will display.
In the event that product key not displaying or showing blank result.
This is because your Windows copy is activated with a digital license instead of firmware-embedded activation key. This command will only works if you are using product key instead of digital license. Proceed to the next method.
Method 3: Retrieve DigitalProductId Registry Key using VBScript
Step 1: Click on the Search icon in the Taskbar to open Search box.
Step 2: Type notepad
in the Search box.
Step 3: Right-click on the Notepad and click on the Run as administrator option to open elevated Notepad.
Step 4: The User Account Control (UAC) window will prompt. Click Yes to open the Notepad as Administrator.
Step 5: Copy and paste the following code into the Notepad.
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
keypart1 = Mid(KeyOutput, 2, Last)
insert = "N"
KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
If Last = 0 Then KeyOutput = insert & KeyOutput
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
Step 6: Click on File > Save As… option.
Step 7: Choose All Files for the Save as type, set Encoding to ANSI, and enter the file name as Non-OA3-ProductKey.vbs (with the .vbs extension).
Step 8: Click on the Save button.
Step 9: Locate the vbs file and then double-click on it to execute the script.
Step 10: A message box will prompt to display the Product Name, Product ID, and Installed Key. Click on Yes button to save the information into text file or click on No button to close the message box.
Method 4: Execute Get-ProductKey function with PowerShell script
Step 1: Click on the Search icon in the Taskbar to open Search box.
Step 2: Type notepad
in the Search box.
Step 3: Right-click on the Notepad and click on the Run as administrator option to open elevated Notepad.
Step 4: The User Account Control (UAC) window will prompt. Click Yes to open the Notepad as Administrator.
Step 5: Copy and paste the following code into the Notepad.
$computers = 'localhost' #comma separated list of computer names
$cred = Get-Credential #domain administrator credentials in domain\user format
Invoke-Command -Credential $cred -ComputerName $computers -ScriptBlock {
function Get-ProductKey {
<#
.SYNOPSIS
Retrieves the product key and OS information from a local or remote system/s.
.DESCRIPTION
Retrieves the product key and OS information from a local or remote system/s. Queries of 64bit OS from a 32bit OS will result in
inaccurate data being returned for the Product Key. You must query a 64bit OS from a system running a 64bit OS.
.PARAMETER Computername
Name of the local or remote system/s.
.NOTES
Author: Boe Prox
Version: 1.1
-Update of function from https://powershell.com/cs/blogs/tips/archive/2012/04/30/getting-windows-product-key.aspx
-Added capability to query more than one system
-Supports remote system query
-Supports querying 64bit OSes
-Shows OS description and Version in output object
-Error Handling
.EXAMPLE
Get-ProductKey -Computername Server1
OSDescription Computername OSVersion ProductKey
------------- ------------ --------- ----------
Microsoft(R) Windows(R) Server 2003, Enterprise Edition Server1 5.2.3790 bcdfg-hjklm-pqrtt-vwxyy-12345
Description
-----------
Retrieves the product key information from 'Server1'
#>
[cmdletbinding()]
Param (
[parameter(ValueFromPipeLine=$True,ValueFromPipeLineByPropertyName=$True)]
[Alias("CN","__Server","IPAddress","Server")]
[string[]]$Computername = $Env:Computername
)
Begin {
$map="BCDFGHJKMPQRTVWXY2346789"
}
Process {
ForEach ($Computer in $Computername) {
Write-Verbose ("{0}: Checking network availability" -f $Computer)
If (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {
Try {
Write-Verbose ("{0}: Retrieving WMI OS information" -f $Computer)
$OS = Get-WmiObject -ComputerName $Computer Win32_OperatingSystem -ErrorAction Stop
} Catch {
$OS = New-Object PSObject -Property @{
Caption = $_.Exception.Message
Version = $_.Exception.Message
}
}
Try {
Write-Verbose ("{0}: Attempting remote registry access" -f $Computer)
$remoteReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Computer)
If ($OS.OSArchitecture -eq '64-bit') {
$value = $remoteReg.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('DigitalProductId4')[0x34..0x42]
} Else {
$value = $remoteReg.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('DigitalProductId')[0x34..0x42]
}
$ProductKey = ""
Write-Verbose ("{0}: Translating data into product key" -f $Computer)
for ($i = 24; $i -ge 0; $i--) {
$r = 0
for ($j = 14; $j -ge 0; $j--) {
$r = ($r * 256) -bxor $value[$j]
$value[$j] = [math]::Floor([double]($r/24))
$r = $r % 24
}
$ProductKey = $map[$r] + $ProductKey
if (($i % 5) -eq 0 -and $i -ne 0) {
$ProductKey = "-" + $ProductKey
}
}
} Catch {
$ProductKey = $_.Exception.Message
}
$object = New-Object PSObject -Property @{
Computername = $Computer
ProductKey = $ProductKey
OSDescription = $os.Caption
OSVersion = $os.Version
}
$object.pstypenames.insert(0,'ProductKey.Info')
$object
} Else {
$object = New-Object PSObject -Property @{
Computername = $Computer
ProductKey = 'Unreachable'
OSDescription = 'Unreachable'
OSVersion = 'Unreachable'
}
$object.pstypenames.insert(0,'ProductKey.Info')
$object
}
}
}
}
Get-ProductKey
} | ft Computername,OSDescription,OSVersion,ProductKey
Step 6: Click on File > Save As… option.
Step 7: Choose All Files for the Save as type, set Encoding to ANSI, and enter the file name as Non-OA3-ProductKey.ps1 (with the .ps1 extension).
Step 8: Click on the Save button.
Step 9: Follow below steps to change the network profile type from Public to Private.
Step 10: Press Windows + i key on the keyboard to open the Settings app. Alternatively, you can click the Start menu and select the Settings gear icon located at the top of the menu by default.
Step 11: Click on the Network & internet option.
Step 12: Click on the Ethernet or Wireless, depend on how you connect to Internet.
Step 13: Select the radio button for Private network profile type then close the Settings windows.
Step 14: Click on the Search icon in the Taskbar to open Search box.
Step 15: Type powershell
in the Search box.
Step 16: Right-click on the Windows PowerShell and click on the Run as administrator option from the context menu to open elevated PowerShell.
Step 17: The User Account Control (UAC) window will prompt. Click Yes to run the PowerShell as Administrator.
Step 18: Type or copy-paste the following command into the elevated command prompt and press Enter: WinRM quickconfig
Note: WinRM has to be enabled in order to retrieve product key. Follow below steps to enable WinRM using PowerShell.
Step 19: Type y and press on Enter when the PowerShell ask whether to Make these changes.
The status show is now show:
WinRM firewall exception enabled. Configured LocalAccountTokenFilterPolicy to grant administrative rights remotely to local users.
If the following error message show:
Error number: -2144108183 0x80338169
WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.
In order to resolve this error, apply above mentioned steps to change the network profile type from Public to Private.
Step 20: Type or copy-paste the following command into the elevated command prompt and press Enter: Set-ExecutionPolicy RemoteSigned
Note: This command will allow the PowerShell to execute script.
Step 21: Type y and press on Enter when the PowerShell ask: Do you want to change the execution policy.
Step 22: Inside the PowerShell windows, navigate to folder which store the ps1 file created previously.
Step 23: Execute the script using command as below and press Enter: .\Non-OA3-ProductKey.ps1
Step 24: Enter the Administrator credential in Windows PowerShell credential request dialog box.
Step 25: The Windows product key will display.
If the following error message show:
cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Plicies at https:/go.microsoft.com/fwlink/?LinkID=135170.
In order to resolve this error, apply above mentioned steps to change the script execution policy.
Step 26: Close the PowerShell windows.
Reference
- Microsoft Docs > SoftwareLicensingService class
- Microsoft Docs > Deploy Windows 10 Enterprise licenses
- Microsoft Docs > Set-ExecutionPolicy