我们想要检索 SQL Server 的产品密钥。 我们有多个版本的 SQL,并且了解每个版本的产品密钥路径都会发生变化。我们不想对路径进行硬编码,因此需要寻找通用逻辑。 由于每个版本都有不同的文件夹结构来存储产品密钥,因此我们使用 Switch 语句作为
switch (majorVersion)
{
case "8":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\80\Registration";
break;
case "9":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\90\ProductId";
break;
case "10":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\ClientSetup";
break;
case "11":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\ClientSetup";
break;
case "12":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\120\Tools\ClientSetup";
break;
case "13":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\130\Tools\Setup";
break;
case "13.1":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\130\Tools\Setup\Client_Components_Full\1033";
break;
case "14":
registryPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\140\Tools\Setup";
break;
default:
registryPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion";
break;
}
想要避免此切换并在不指定硬编码路径的情况下检索密钥。
我们如何获得任何已安装的sql版本的正确产品密钥?
(仅寻找 sql 脚本解决方案,而不是 power shell。)
以动态方式执行此操作的技巧是查看
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names
并读取子项的值。例如MSSQL14.MSSQLSERVER、SSRS、...
使用
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.MSSQLSERVER\Setup
中的子键值读入 Version
值。需要版本号来更改旧版本的行为。
当前两位数字大于11时,读入同一位置的
DigitalProductID
值。
这里是一些 C# 示例代码。 Max Volkov 的博客 对此进行了进一步解释。它还概述了有关二进制密钥的 Base24 解码的一些问题。
可以在 T-SQL 中重新创建代码,但对我来说,它似乎不是实现这一切的理想语言。
有一个 cmdlet Get-DbaProductKey,是 https://github.com/dataplat/dbatools 的一部分。
由于此页面在搜索结果中排名靠前,因此这是检索密钥的另一种方法:
了解如何查找 SQL Server Reporting Services 的产品密钥 (SSRS) 2017 和 2019,以便您可以在生产环境中安装服务器 环境。
这从注册表中读取:
Declare @Val nvarchar(4000)
Exec master .dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\Setup',
N'ProductCode',
@Val output
Select @Val As ProductCode