# Tested on Windows client versions from SQL Server 2014-2022 -->All went success. function GetSqlServerProductKey($InstanceName="MSSQL13.MSSQLSERVER") { $localmachine = [Microsoft.Win32.RegistryHive]::LocalMachine $defaultview = [Microsoft.Win32.RegistryView]::Default $reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey($localmachine, $defaultview) $key = "SOFTWARE\Microsoft\Microsoft SQL Server\$InstanceName\Setup" $encodedData = $reg.OpenSubKey($key).GetValue("DigitalProductID") $reg.Close() try { $binArray = ($encodedData)[0..66] $productKey = $null $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" $isNKey = ([math]::truncate($binArray[14] / 0x6) -band 0x1) -ne 0; if ($isNKey) { $binArray[14] = $binArray[14] -band 0xF7 } $last = 0 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 $last = $k } if ($isNKey) { $part1 = $productKey.Substring(1, $last) $part2 = $productKey.Substring(1, $productKey.Length-1) if ($last -eq 0) { $productKey = "N" + $part2 } else { $productKey = $part2.Insert($part2.IndexOf($part1) + $part1.Length, "N") } } $productKey = $productKey.Insert(20, "-").Insert(15, "-").Insert(10, "-").Insert(5, "-") } catch { $productkey = "Cannot decode product key." } $productKey } ========================================= --Replace with your ms sql server name GetSqlServerProductKey("MSSQL11.SQL2012") GetSqlServerProductKey("MSSQL12.SQL2014") GetSqlServerProductKey("MSSQL13.SQL2016PROD") GetSqlServerProductKey("MSSQL14.SQL2017") GetSqlServerProductKey("MSSQL15.SQL2019PROD") GetSqlServerProductKey("MSSQL15.SQL2019STANDARD") GetSqlServerProductKey("MSSQL16.SQL2022PROD") GetSqlServerProductKey("MSSQL16.SQLEXPRESS2022")