Windows Product Key Audit

Posted: October 27, 2011 in Active Directory, Information Technology, Networking, Scripts

Generate a CSV of product keys for all machines in your AD.
This script is about 90% . All the hard work was already done. What I’ve added is:

  • Ping to check if machine is online
  • If OS is 2008/2008 R2, modify the registry search string, as noted in the comments at JB’s
  • Get a list of all the computer out of AD
  • Recurse the check for all these machines and output hostname, OS and product key to a CSV
  • Output is directed to C:\Scripts\ProductKeys.csv, so either modify that or make a C:\Scripts\ folder. Also, make sure you change the domain name.

    function Get-WindowsKey {
    ## function to retrieve the Windows Product Key from any PC
    ## by Jakob Bindslet (jakob@bindslet.dk)
    param ([string] $targets, [string] $OSVer)
    $hklm = 2147483650
    $regPath = “Software\Microsoft\Windows NT\CurrentVersion”
    If ($OSVer -eq “2008”) {
    $regValue = “DigitalProductId4”
    }
    Else {
    $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
    $obj.Computer + “,” + $obj.Caption + “,” + $obj.ProductKey | Out-File C:\Scripts\ProductKeys.csv -Append
    }
    }
    $Computers = Get-QADComputer -Service yourdomain.com -SizeLimit 0

    ForEach ($Computer in $Computers){
    ping -n 1 $Computer.Name
    If ($?) {
    If ($Computer.OSName -Match “2008”) {
    Get-WindowsKey $Computer.Name “2008”
    }
    Else {
    Get-WindowsKey $Computer.Name “Other”
    }

    }
    }

    Advertisements

    Leave a Reply

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Change )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Change )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Change )

    Google+ photo

    You are commenting using your Google+ account. Log Out / Change )

    Connecting to %s