安装完成后如何找回SQL Server实例安装时的序列号
当需要再次安装SQLServer时,如果序列号找不到了,可以试着从已经安装的实例里找回序列号,因为安装完SQLServer后,序列号(ProductKey)被保存在注册表里;
MSDN订阅下载的安装包是内置序列号的,则没有这个困扰。
一.序列号保存在哪
通过无文档记载的扩展存储过程xp_regread读取注册表:
--ForSQLServer2008,2008R2 usemaster GO execxp_regread'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MicrosoftSQLServer\100\Tools\Setup','ProductCode' execxp_regread'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MicrosoftSQLServer\100\Tools\Setup','DigitalProductID' GO --ForSQLServer2012 usemaster GO execxp_regread'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MicrosoftSQLServer\110\Tools\Setup','ProductCode' execxp_regread'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MicrosoftSQLServer\110\Tools\Setup','DigitalProductId' GO
不要被ProductCode迷惑,就算只安装了SQLServer客户端,注册表里也会有这个键值,并不是序列号,DigitalProductID才是,但经过了Base24编码,需要解码才行。
可以看到,对于不同版本,注册表的路径不一样,但是键是一致的。
Express版是免费的,没有序列号,从而注册表也没DigitalProductID这个键。
二.如何解码序列号
1.Base24,Base64编码简介
可能很多人听说过Base64编码,它用于对比较长的字符串进行编码,以方便传输;
Base24编码主要应用在序列号生成上,两者的实现思路是类似的,只是编码的模式有点变化。
Base64所对应的编码表是:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
共计64个字符。
Base24所对应的编码表是:
BCDFGHJKMPQRTVWXY2346789
共计24个字符,这里主要去掉了一些对于序列号来说不容易识别和容易混淆的字符。
SQLServer的序列号采用的是Base24编码,对编码后的字符进行解码,即可以得到原文。
编码/解码并不是加密/解密,没有秘钥的说法,只有字符转换的规则,Base24,Base64详细的算法可以在网上找到。
2.利用Powershell解码
以下powershell函数用于解码/找回SQLServer序列号,在SQLServer2008,2008R2实例上测试通过:
functionGet-SQLServerKey{ ##functiontoretrievethelicensekeyofaSQL2008Server. param($targets=".") $hklm=2147483650 $regPath="SOFTWARE\Microsoft\MicrosoftSQLServer\100\Tools\Setup" $regValue1="DigitalProductId" $regValue2="PatchLevel" $regValue3="Edition" Foreach($targetin$targets){ $productKey=$null $win32os=$null $wmi=[WMIClass]"\\$target\root\default:stdRegProv" $data=$wmi.GetBinaryValue($hklm,$regPath,$regValue1) [string]$SQLver=$wmi.GetstringValue($hklm,$regPath,$regValue2).svalue [string]$SQLedition=$wmi.GetstringValue($hklm,$regPath,$regValue3).svalue $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" ##decryptbase24encodedbinarydata For($i=24;$i-ge0;$i--){ $k=0 For($j=14;$j-ge0;$j--){ $k=$k*256-bxor$binArray[$j] $binArray[$j]=[math]::truncate($k/24) $k=$k%24 } $productKey=$charsArray[$k]+$productKey If(($i%5-eq0)-and($i-ne0)){ $productKey="-"+$productKey } } $win32os=Get-WmiObjectWin32_OperatingSystem-computer$target $obj=New-ObjectObject $obj|Add-MemberNotepropertyComputer-value$target $obj|Add-MemberNotepropertyOSCaption-value$win32os.Caption $obj|Add-MemberNotepropertyOSArch-value$win32os.OSArchitecture $obj|Add-MemberNotepropertySQLver-value$SQLver $obj|Add-MemberNotepropertySQLedition-value$SQLedition $obj|Add-MemberNotepropertyProductKey-value$productkey $obj } }
SQLServer2012序列号里字符的格式发生了变化,$binArray=($data.uValue)[0..16]不同于SQLServer2008的$binArray=($data.uValue)[52..66],同时别忘了改下注册表路径$regPath="SOFTWARE\Microsoft\MicrosoftSQLServer\110\Tools\Setup",修改后如下,在SQLServer2012实例上测试通过:
functionGet-SQLServerKey{ ##functiontoretrievethelicensekeyofaSQL2012Server. ##byJakobBindslet(jakob@bindslet.dk) ##2012ModificationbyXianWang(daanno2@gmail.com) param($targets=".") $hklm=2147483650 $regPath="SOFTWARE\Microsoft\MicrosoftSQLServer\110\Tools\Setup" $regValue1="DigitalProductId" $regValue2="PatchLevel" $regValue3="Edition" Foreach($targetin$targets){ $productKey=$null $win32os=$null $wmi=[WMIClass]"\\$target\root\default:stdRegProv" $data=$wmi.GetBinaryValue($hklm,$regPath,$regValue1) [string]$SQLver=$wmi.GetstringValue($hklm,$regPath,$regValue2).svalue [string]$SQLedition=$wmi.GetstringValue($hklm,$regPath,$regValue3).svalue $binArray=($data.uValue)[0..16] $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" ##decryptbase24encodedbinarydata For($i=24;$i-ge0;$i--){ $k=0 For($j=14;$j-ge0;$j--){ $k=$k*256-bxor$binArray[$j] $binArray[$j]=[math]::truncate($k/24) $k=$k%24 } $productKey=$charsArray[$k]+$productKey If(($i%5-eq0)-and($i-ne0)){ $productKey="-"+$productKey } } $win32os=Get-WmiObjectWin32_OperatingSystem-computer$target $obj=New-ObjectObject $obj|Add-MemberNotepropertyComputer-value$target $obj|Add-MemberNotepropertyOSCaption-value$win32os.Caption $obj|Add-MemberNotepropertyOSArch-value$win32os.OSArchitecture $obj|Add-MemberNotepropertySQLver-value$SQLver $obj|Add-MemberNotepropertySQLedition-value$SQLedition $obj|Add-MemberNotepropertyProductKey-value$productkey $obj } }
3.调用powershell函数并输出序列号
打开powershell,把上面的函数贴进去,回车,输入Get-SQLServerKey并回车;
或者把上面的函数存为.ps1文件直接引用:
PSC:\Windows\system32>.C:\Users\username\Desktop\pk.ps1 PSC:\Windows\system32>Get-SQLserverKey
输出结果如下,首尾几个字符被人为改成星号,没有贴出来。
Computer:. OSCaption:MicrosoftWindowsServer2012R2Standard OSArch:64-bit SQLver:11.2.5058.0 SQLedition:DeveloperEdition ProductKey:*****-G8T4R-QW4XX-BVH62-*****
对于SQLServer2000,2005,由于手头没有环境,没有测试;对于Office,Windows系统,应该也都可以通过类似的方式拿到序列号。
以上内容就是关于安装完成后如何找回SQLServer实例安装时的序列号,希望大家有所帮助。