====== Windows - Get the Windows Product Key - Using Powershell ====== ===== RunProdKey.bat ===== This runs the powershell script **Get-ProductKey.ps1**. @ECHO OFF Powershell.exe -executionpolicy remotesigned -File ./Get-ProductKey.ps1 **NOTE:** This sets the Powershell script bypass for running the powershell script. ---- ===== Get-ProductKey.ps1 ===== start-process -FilePath "CDKey.vbs" -Wait -Passthru $SLS = wmic path SoftwareLicensingService get OA3xOriginalProductKey $RLS = Get-ItemPropertyValue 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform' -Name BackupProductKeyDefault $SLSKey = $SLS.Split(" ",[System.StringSplitOptions]::RemoveEmptyEntries) $DPID = Get-ItemPropertyValue 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey2' -Name DigitalProductId $EditionID = Get-ItemPropertyValue 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey2' -Name EditionId function ConvertTo-ProductKey { param ( [parameter(Mandatory = $True, Position = 0)] $Registry, [parameter()] [Switch]$x64 ) begin { $map = "BCDFGHJKMPQRTVWXY2346789" } process { $ProductKey = "" $prodkey = $Registry[0x34 .. 0x42] for ($i = 24; $i -ge 0; $i--) { $r = 0 for ($j = 14; $j -ge 0; $j--) { $r = ($r * 256) -bxor $prodkey[$j] $prodkey[$j] = [math]::Floor([double]($r/24)) $r = $r % 24 } $ProductKey = $map[$r] + $ProductKey if (($i % 5) -eq 0 -and $i -ne 0) { $ProductKey = "-" + $ProductKey } } $ProductKey } } $x = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -name DigitalProductId key = ConvertTo-ProductKey $x.DigitalProductId $prodKey = "Windows Backup Product Key Default: $RLS `nOEM Software Licensing Service Key: $SLSKey `nDigital Product ID Windows Key: $key" Add-Content .\ProductKey.txt===== Get-ProductKey.ps1 ===== start-process -FilePath "CDKey.vbs" -Wait -Passthru $SLS = wmic path SoftwareLicensingService get OA3xOriginalProductKey $RLS = Get-ItemPropertyValue 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform' -Name BackupProductKeyDefault $SLSKey = $SLS.Split(" ",[System.StringSplitOptions]::RemoveEmptyEntries) $DPID = Get-ItemPropertyValue 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey2' -Name DigitalProductId $EditionID = Get-ItemPropertyValue 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey2' -Name EditionId function ConvertTo-ProductKey { param ( [parameter(Mandatory = $True, Position = 0)] $Registry, [parameter()] [Switch]$x64 ) begin { $map = "BCDFGHJKMPQRTVWXY2346789" } process { $ProductKey = "" $prodkey = $Registry[0x34 .. 0x42] for ($i = 24; $i -ge 0; $i--) { $r = 0 for ($j = 14; $j -ge 0; $j--) { $r = ($r * 256) -bxor $prodkey[$j] $prodkey[$j] = [math]::Floor([double]($r/24)) $r = $r % 24 } $ProductKey = $map[$r] + $ProductKey if (($i % 5) -eq 0 -and $i -ne 0) { $ProductKey = "-" + $ProductKey } } $ProductKey } } $x = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -name DigitalProductId $key = ConvertTo-ProductKey $x.DigitalProductId $prodKey = "Windows Backup Product Key Default: $RLS `nOEM Software Licensing Service Key: $SLSKey `nDigital Product ID Windows Key: $key" Add-Content .\ProductKey.txt $prodKey ---- $prodKey ---- ===== CDKey.vbs ===== This script is run from the **Get-ProductKey.ps1** powershell script. The powershell script finds the keys such as the OEM Key and the registry BackupProductKeyDefault then appends it to the text file. 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 'Save Data to a file Save ProductData '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") fName = ".\ProductKey.txt" Set fso = CreateObject("Scripting.FileSystemObject") Set txt = fso.CreateTextFile(fName) txt.Writeline Data txt.Close End Function ---- ===== References ===== https://optionkey.blogspot.com/ https://www.techspot.com/articles-info/1760/images/Win10KeyFinder.txt