We need to collect the Windows Product Keys for the computers we have deployed (about 110 of them) in our company.  Microsoft Audit is requiring this information.  Is there a way to get the Product Key information, maybe from the Registry or something?

Answer Summary:
Below is the script to find out product keys.
0 Comments   [ - ] Hide Comments


Please log in to comment

Community Chosen Answer



From http://mspowershell.blogspot.com/2009/02/retrieveing-windows-product-key.html.

#Change for path that you are using.
$file= "c:\temp\keys.txt"
function Get-WindowsKey {
    ## function to retrieve the Windows Product Key from any PC
    ## by Jakob Bindslet (jakob@bindslet.dk)
    param ($targets = ".")
    $hklm = 2147483650
    $regPath = "Software\Microsoft\Windows NT\CurrentVersion"
    $regValue = "DigitalProductId"
    Foreach ($target in $targets) {
        $productKey = $null
        $win32os = $null
        $wmi = [WMIClass]"\\$target\root\default:stdRegProv"
        $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue)
        $binArray = ($data.uValue)[52..66]
        $charsArray = "B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9"
        ## decrypt base24 encoded binary data
        For ($i = 24; $i -ge 0; $i--) {
            $k = 0
            For ($j = 14; $j -ge 0; $j--) {
                $k = $k * 256 -bxor $binArray[$j]
                $binArray[$j] = [math]::truncate($k / 24)
                $k = $k % 24
            $productKey = $charsArray[$k] + $productKey
            If (($i % 5 -eq 0) -and ($i -ne 0)) {
                $productKey = "-" + $productKey
        $win32os = Get-WmiObject Win32_OperatingSystem -computer $target
        $obj = New-Object Object
        $obj | Add-Member Noteproperty Computer -value $target
        $obj | Add-Member Noteproperty Caption -value $win32os.Caption
        $obj | Add-Member Noteproperty CSDVersion -value $win32os.CSDVersion
        $obj | Add-Member Noteproperty OSArch -value $win32os.OSArchitecture
        $obj | Add-Member Noteproperty BuildNumber -value $win32os.BuildNumber
        $obj | Add-Member Noteproperty RegisteredTo -value $win32os.RegisteredUser
        $obj | Add-Member Noteproperty ProductID -value $win32os.SerialNumber
        $obj | Add-Member Noteproperty ProductKey -value $productkey
Get-WindowsKey | format-table ProductKey -HideTableHeaders|Out-File $file

Get-Content $file |select -Skip 1| Set-Content "$file-temp"
move "$file-temp" $file -Force


Then create a custom inventory rule to read the file c:\temp\keys.txt.

ShellCommandTextReturn(cmd.exe /c type c:\temp\keys.txt)

You should then be able to run a report based on the custom inventory.

Answered 06/11/2012 by: dugullett
Red Belt

  • This runs fine in ISE and when run as ps1 script directly in powershell, yet when ran via KACE script, the only output I get is BBBBB-...
    and a log full of "Cannot index into a null array" Trying to nut out why it would work in one place and not the other.

    Running as Online Shell Script with:
    powershell.exe -nologo -executionpolicy bypass -WindowStyle hidden -noprofile -file getMicroKey.ps1
Please log in to comment
Answer this question or Comment on this question for clarity



I'm using ProduKey to retrieve Windows, Office and related keys.  The potential list is fairly extensive and it's nice because it puts the info right into the Custom Fields section of the machine's inventory.  Mark O'Malley showed me this during my initial training.

Just one thing to be aware of is that Windows Defender (in Win7) may pick this up as a keylogger, but not an issue once it's allowed.



Here's my script info:

Online KScript

Product Keys

Retrieve Windows & Office product keys.

Uses ProduKey (http://www.nirsoft.net/utils/product_cd_key_viewer.html) to retrieve keys and then saves to file.  Can change output type by changing switch (i.e. /stxt, /stab, /shtml).

Run As User logged in to console.

Dependencies: ProduKey.exe

Verify: Always Fail



- File: ProduKey.exe

- Wait for startup (checked)

- Parameters: /WindowsKeys 0 /IEKeys 0 /SQLKeys 0 /ExchangeKeys 0 /stext c:\kbox\produkey.txt


Here's the Software item setup:

Display Name (Title):  * ProduKey Key Retrieval

Custom Inventory Rule: ShellCommandTextReturn(cmd /c type c:\KBOX\produkey.txt)

Answered 06/15/2012 by: jverbosk
Red Belt

  • I'm a newbie and was wondering about the fields to place your specific information in?
    • If you're new to scripting, this KKE video on scripting basics might help:

      • Thank you I will have to have my manager create an account for me.
      • now when I go to remediation it will not allow me to add a new step.
      • Yeah that didn't work for me. I am currently running produkey individually and it's not even pulling all the Microsoft licenses
Please log in to comment