首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 安裝後如何從註冊表找回產品金鑰 (序列號) 完整指南:含 PowerShell 解碼腳本

     編輯:關於SqlServer

背景

重新安裝/遷移 SQL Server 時需原產品金鑰。安裝完成後,金鑰以 **Base24 編碼** 存儲於註冊表 DigitalProductId 中。本文提供 **T-SQL 讀取 + PowerShell 解碼** 完整方案,支援 SQL Server 2008/2008 R2/2012/2014/2016/2017/2019。

一、註冊表儲存位置

版本註冊表路徑 (HKLM)關鍵值名
2008 / 2008 R2SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\SetupDigitalProductId (二進位)
2012SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\SetupDigitalProductId
2014SOFTWARE\Microsoft\Microsoft SQL Server\120\Tools\SetupDigitalProductId
2016SOFTWARE\Microsoft\Microsoft SQL Server\130\Tools\SetupDigitalProductId
2017SOFTWARE\Microsoft\Microsoft SQL Server\140\Tools\SetupDigitalProductId
2019SOFTWARE\Microsoft\Microsoft SQL Server\150\Tools\SetupDigitalProductId

注意:ProductCode 僅為產品代碼 (GUID)、**非金鑰**。Express 版免費,**無 DigitalProductId**。

二、T-SQL 讀取註冊表原始二進位值

-- SQL Server 2012 範例 (其他版本修改路徑版本號即可)
USE master;
GO
EXEC xp_regread 
    'HKEY_LOCAL_MACHINE',
    'SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\Setup',
    'DigitalProductId';
-- 回傳二進位資料 (十六進位顯示),需複製後用 PowerShell 解碼

警告:xp_regread 為未文檔化擴展預存程序,未來版本可能移除,僅限診斷用途。

三、Base24 編碼原理與 PowerShell 解碼腳本

Base24 vs Base64

  • Base64:64 字元 (A-Z, a-z, 0-9, +, /, =),用於傳輸編碼。
  • Base24:24 字元 BCDFGHJKMPQRTVWXY2346789,**移除易混淆字元 (0,O,1,I,A,E,U,L,N,S,+,/,=)**,專用於產品金鑰顯示/輸入。

通用 PowerShell 解碼函數 (支援 2008~2019)

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-*****

(首尾字元為安全已遮罩)

四、安全性與合規提醒

  • 授權合規:僅用於**合法授權環境**的重裝/遷移/審計。嚴禁用於破解/盜版/超授權使用。
  • 權限需求:需本機/遠端 **Administrator** 權限讀取 HKLM 及 WMI。
  • 備份建議:將解碼後的金鑰加密存儲於密碼管理器 (如 KeePass, 1Password, Azure Key Vault),避免依賴註冊表單點故障。
  • MSDN/VS 訂閱 ISO**:通常內建金鑰 (PID.txt),安裝時自動填入,**無需手動輸入/提取**。

五、其他產品同理可查

Office、Windows、Visual Studio 等同樣將 Base24 編碼金鑰存於各自註冊表路徑,只需調整 $regPath 即可複用本函數。

總結

**註冊表 → xp_regread/PowerShell WMI 讀取二進位 → Base24 解碼 → 25 字元金鑰 (5-5-5-5-5)**。提供的 Get-SQLServerProductKey 函數參數化版本號、支援遠端、輸出物件化,可直接納入自動化巡檢/資產管理腳本。記住:**合法合規使用,妥善保管金鑰。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved