Get-ProductKey.ps1
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. .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-CimInstance -ClassName Win32_OperatingSystem -ComputerName $Computer -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 } } } } |