重新安裝/遷移 SQL Server 時需原產品金鑰。安裝完成後,金鑰以 **Base24 編碼** 存儲於註冊表 DigitalProductId 中。本文提供 **T-SQL 讀取 + PowerShell 解碼** 完整方案,支援 SQL Server 2008/2008 R2/2012/2014/2016/2017/2019。
| 版本 | 註冊表路徑 (HKLM) | 關鍵值名 |
|---|---|---|
| 2008 / 2008 R2 | SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\Setup | DigitalProductId (二進位) |
| 2012 | SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\Setup | DigitalProductId |
| 2014 | SOFTWARE\Microsoft\Microsoft SQL Server\120\Tools\Setup | DigitalProductId |
| 2016 | SOFTWARE\Microsoft\Microsoft SQL Server\130\Tools\Setup | DigitalProductId |
| 2017 | SOFTWARE\Microsoft\Microsoft SQL Server\140\Tools\Setup | DigitalProductId |
| 2019 | SOFTWARE\Microsoft\Microsoft SQL Server\150\Tools\Setup | DigitalProductId |
注意:ProductCode 僅為產品代碼 (GUID)、**非金鑰**。Express 版免費,**無 DigitalProductId**。
-- SQL Server 2012 範例 (其他版本修改路徑版本號即可)
USE master;
GO
EXEC xp_regread
'HKEY_LOCAL_MACHINE',
'SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\Setup',
'DigitalProductId';
-- 回傳二進位資料 (十六進位顯示),需複製後用 PowerShell 解碼
警告:xp_regread 為未文檔化擴展預存程序,未來版本可能移除,僅限診斷用途。
BCDFGHJKMPQRTVWXY2346789,**移除易混淆字元 (0,O,1,I,A,E,U,L,N,S,+,/,=)**,專用於產品金鑰顯示/輸入。function Get-SQLServerProductKey {
<# .SYNOPSIS 解碼註冊表 DigitalProductId 取得 SQL Server 產品金鑰
.PARAMETER Version 版本號: 100=2008/2008R2, 110=2012, 120=2014, 130=2016, 140=2017, 150=2019
.PARAMETER ComputerName 目標電腦 (預設本機)
#>
param(
[Parameter(Mandatory)][ValidateSet('100','110','120','130','140','150')][string]$Version,
[string]$ComputerName = '.'
)
$hklm = 2147483650 # HKEY_LOCAL_MACHINE
$regPath = "SOFTWARE\Microsoft\Microsoft SQL Server\$Version\Tools\Setup"
$regValue = 'DigitalProductId'
$wmi = [WMIClass]"\\$ComputerName\root\default:stdRegProv"
$data = $wmi.GetBinaryValue($hklm, $regPath, $regValue)
if ($data.ReturnValue -ne 0) { throw "讀取註冊表失誤: $($data.ReturnValue)" }
# 版本差異:2008/2008R2 位移 52~66 (15 bytes);2012+ 位移 0~16 (17 bytes)
$offsetStart = if ($Version -in '100') { 52 } else { 0 }
$offsetEnd = if ($Version -in '100') { 66 } else { 16 }
$binArray = $data.uValue[$offsetStart..$offsetEnd]
$chars = 'B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'
$key = ''
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]::Floor($k / 24)
$k = $k % 24
}
$key = $chars[$k] + $key
if ($i % 5 -eq 0 -and $i -ne 0) { $key = '-' + $key }
}
# 附加版本/版本資訊
$ver = $wmi.GetStringValue($hklm, $regPath, 'PatchLevel').svalue
$edition = $wmi.GetStringValue($hklm, $regPath, 'Edition').svalue
[PSCustomObject]@{
ComputerName = $ComputerName
SQLVersion = $ver
Edition = $edition
ProductKey = $key
}
}
# 使用範例
# SQL Server 2012
Get-SQLServerProductKey -Version '110'
# SQL Server 2019 遠端機器
Get-SQLServerProductKey -Version '150' -ComputerName 'SQLPROD01'
ComputerName : . SQLVersion : 11.2.5058.0 Edition : Developer Edition ProductKey : *****-G8T4R-QW4XX-BVH62-*****
(首尾字元為安全已遮罩)
HKLM 及 WMI。Office、Windows、Visual Studio 等同樣將 Base24 編碼金鑰存於各自註冊表路徑,只需調整 $regPath 即可複用本函數。
**註冊表 → xp_regread/PowerShell WMI 讀取二進位 → Base24 解碼 → 25 字元金鑰 (5-5-5-5-5)**。提供的 Get-SQLServerProductKey 函數參數化版本號、支援遠端、輸出物件化,可直接納入自動化巡檢/資產管理腳本。記住:**合法合規使用,妥善保管金鑰。**