news 2026/9/25 3:22:32

SQL Server 扩展安全更新(ESU)注册信息采集脚本实战指南:T-SQL 单实例查询与 PowerShell 批量发现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL Server 扩展安全更新(ESU)注册信息采集脚本实战指南:T-SQL 单实例查询与 PowerShell 批量发现
  • 示例工程
  • 数据库
  • 教程
  • 后端

【免费下载链接】sql-server-samples

Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge

项目地址:https://gitcode.com/gh_mirrors/sq/sql-server-samples
点击查看免费下载

本文围绕 sql-server-samples 仓库中 sql-server-extended-security-updates 模块提供的三套 ESU 注册信息采集脚本展开,完整讲解如何用 T-SQL 脚本采集单个实例的注册信息,以及如何用 PowerShell 脚本自动发现单机全部实例或清单文件中列出的多台机器实例,并批量生成可供 ESU 订阅批量注册使用的 CSV 文件。读完本文,你将掌握 ESU 注册所需字段(name / version / edition / cores / hostType)的采集逻辑、脚本的运行方式、CSV 输出格式以及上传前必须复核的校验要点。

SQL Server 扩展安全更新(Extended Security Updates,简称 ESU)面向已停止主流支持、进入生命周期末期的 SQL Server 版本,订阅用户在 Azure 门户中注册受保护的实例后可继续获得安全更新。注册环节的关键前置步骤之一,就是为每台实例采集标准化的注册信息——包括实例名、SQL Server 版本、版本类型(Edition)、物理核心数与宿主机类型——并整理成可批量上传的 CSV。本文所讲解的脚本正是为此设计的官方示例实现,对应说明文档为 scripts.md。

注册信息包含哪些字段

无论采用哪套脚本,最终输出的注册信息都围绕以下五个核心字段(Azure 虚拟机场景下还会追加订阅级字段):

字段含义采集方式
nameSQL Server 实例名(机器名\实例名,默认实例为机器名)SERVERPROPERTY('ServerName')或服务发现
version大版本标识(如2008、2008R2、2012)由SERVERPROPERTY('ProductVersion')前四位映射
edition版本类型(如 Enterprise、Standard、Developer)SERVERPROPERTY('Edition')取第一个空格前词
cores逻辑/物理核心数T-SQL 取sys.dm_os_sys_info.hyperthread_ratio;PowerShell 用 WMI 累加物理核心
hostType宿主机类型(Physical Server / Virtual Machine / Azure Virtual Machine)读取 BIOS 制造商或 Azure 上下文推断

版本号到版本名称的映射是两套脚本共用的核心逻辑,对应关系如下:

ProductVersion 前缀版本名称
10.02008
10.52008R2
11.02012
12.02014
13.02016
14.02017
15.02019
其他Other / Unknown

该映射覆盖了 2008~2019 的大版本区间,识别范围之外的版本会落入Other兜底分支,便于后续人工确认。

三套脚本的适用场景总览

脚本采集范围运行位置输出
EOS_DataGenerator_SingleInstance.sql单个 SQL Server 实例直接在该实例的查询窗口执行(SSMS / Azure Data Studio)单行结果集
EOS_DataGenerator_LocalDiscovery.ps1本机上的所有 SQL Server 实例目标机器本地,以管理员身份运行 PowerShellCSV 文件(保存在脚本所在目录)
EOS_DataGenerator_InputList.ps1文本清单中列出的所有实例任一可访问目标机器的 Windows 主机CSV 文件(保存在脚本所在目录)

其中 LocalDiscovery 既可用于 Azure 虚拟机,也可用于本地物理服务器或本地虚拟机;InputList 则适合一次性批量处理分散在多台机器上的实例清单。两套 PowerShell 脚本生成的 CSV 均可直接用于 ESU 订阅的批量注册(Bulk Register)。

使用 T-SQL 脚本采集单实例注册信息

官方示例脚本 EOS_DataGenerator_SingleInstance.sql 是采集单个实例注册信息的最小实现,完整代码如下:

DECLARE @SystemManufacturer NVARCHAR(128), @Edition NVARCHAR(20), @HostType NVARCHAR(30), @Cores int, @SQLVersion NVARCHAR(50) DECLARE @machineinfo TABLE ([Value] NVARCHAR(256), [Data] NVARCHAR(256)) INSERT INTO @machineinfo EXEC xp_instance_regread 'HKEY_LOCAL_MACHINE','HARDWARE\DESCRIPTION\System\BIOS','SystemManufacturer'; SELECT @SystemManufacturer = [Data] FROM @machineinfo WHERE [Value] = 'SystemManufacturer'; SET @HostType = 'Physical Server' IF LOWER(@SystemManufacturer) = 'microsoft' OR LOWER(@SystemManufacturer) = 'vmware' SET @HostType = 'Virtual Machine' SELECT @Cores = hyperthread_ratio FROM sys.dm_os_sys_info; SELECT @Edition = CONVERT(NVARCHAR(20), SERVERPROPERTY('Edition')) SELECT @SQLVersion = CONVERT(NVARCHAR(50), SERVERPROPERTY('ProductVersion')) SELECT SERVERPROPERTY('ServerName') AS [name], CASE LEFT(@SQLVersion,4) WHEN '10.0' THEN '2008' WHEN '10.5' THEN '2008R2' WHEN '11.0' THEN '2012' WHEN '12.0' THEN '2014' WHEN '13.0' THEN '2016' WHEN '14.0' THEN '2017' WHEN '15.0' THEN '2019' ELSE 'Other' END AS [version], LEFT(@Edition,CHARINDEX(' ', @Edition,0)-1) AS edition, @Cores AS cores, @HostType AS hostType;

脚本执行流程与原理

  1. 识别宿主机类型:脚本调用系统存储过程xp_instance_regread读取注册表HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS下的SystemManufacturer键值,得到 BIOS 固件制造商。默认假设为Physical Server(物理服务器);若制造商的小写值等于microsoft或vmware,则判定为Virtual Machine(虚拟机)。这是根据"微软自家的 Hyper-V 与 VMware 是主流虚拟化平台"这一经验规则做出的推断,所以脚本末尾专门提示:执行后务必人工核对 Host Type 是否与实例实际运行环境一致。
  2. 统计核心数:从动态管理视图sys.dm_os_sys_info取出hyperthread_ratio作为核心数。需要说明的是,该值在启用超线程(Hyper-Threading)的环境下反映的是逻辑处理器与物理处理器的比值,实际返回的数值更接近逻辑核心口径,与下方 PowerShell 脚本用 WMI 累加物理核心(Win32_Processor.NumberOfCores)的统计方式不同,若两种方式结果存在差异,属于正常现象。
  3. 读取版本信息:SERVERPROPERTY('Edition')返回完整版本名称(如Enterprise Edition (64-bit)),脚本用LEFT(@Edition, CHARINDEX(' ', @Edition, 0) - 1)截取第一个空格前的单词得到简化的edition字段;SERVERPROPERTY('ProductVersion')返回10.0.xxxx这类构建版本号,取其前四位(LEFT(@SQLVersion, 4))并按上文的映射表转换为2008/2008R2/2012等版本名称。
  4. 组装输出:最终返回一行包含name(SERVERPROPERTY('ServerName'))、version、edition、cores、hostType五个字段的结果集。

在 SSMS 或 Azure Data Studio 中连接到目标实例、切换到任意用户数据库后执行即可看到结果。该脚本的输出结构恰好与 PowerShell 脚本生成的 CSV 表头一一对应,便于与批量采集结果对齐。

使用 PowerShell 脚本批量发现本机实例

EOS_DataGenerator_LocalDiscovery.ps1 面向"一台机器上可能安装多个 SQL Server 实例"的常见场景:它先枚举本机全部 SQL Server 服务,再逐个连接查询,最终把所有实例的信息汇总写成一个 CSV 文件。

运行方式:在脚本所在目录执行.\EOS_DataGenerator_LocalDiscovery.ps1。脚本开头以交互方式提示两个关键输入:

  • 输出 CSV 文件名:默认保存在脚本所在目录,若未以.csv结尾会自动补全后缀;
  • 是否为 Azure 虚拟机(Y/N):回答Y时,脚本会进入 Azure 上下文处理分支。

Azure 虚拟机场景的额外处理

当回答Y时,脚本依次执行:

  1. Install-Module -Name Az -AllowClobber -Scope CurrentUser安装/升级 Azure PowerShell 模块,并Import-Module Az;
  2. Connect-AzAccount -Subscription $subscriptionName交互式登录 Azure 账号;
  3. 通过Get-AzSubscription取得订阅 ID,再用Get-AzVM -Name $env:computername按本机计算机名定位虚拟机,得到资源组名与 VM 名称;
  4. 用 WMI 的Win32_OperatingSystem.Caption识别操作系统的 Windows Server 版本(2008 / 2008 R2 / 2012 / 2012 R2 / 2016 / 2019),作为azureVmOS字段。

这些订阅级信息会追加到 CSV 中,用于在 Azure 侧把实例归属到正确的订阅与资源组。

实例发现:从服务枚举到实例名

核心函数Get-SQLInstance的实现思路是:

$services = Get-Service -Computer $env:computername -DisplayName "SQL Server (*)" # Remove MSSQL$ qualifier to get instance name $ServerNames = $services.Name | ForEach-Object {$env:computername + "\" + ($_).Replace("MSSQL`$","")} If ($ServerNames -like "*MSSQLSERVER") { $ServerNames = $env:computername }

即通过Get-Service按显示名SQL Server (*)枚举本机所有 SQL Server 服务(含命名实例),把服务名中的MSSQL$前缀去掉后拼成机器名\实例名;若发现默认实例(服务名含MSSQLSERVER),则直接用机器名表示。这样无论机器上装了几个实例,都能被一次性纳入采集范围。

实例信息采集:连接、查询与 WMI

对每个实例,Get-Info函数通过System.Data.SqlClient.SqlConnection(连接串server=$ServerName;Trusted_Connection=true,即 Windows 集成认证)建立连接,执行:

SELECT SERVERPROPERTY('Edition') AS Edition, SERVERPROPERTY('ProductVersion') AS Version;

随后对版本号取前四位做与 T-SQL 脚本一致的版本映射,Edition取空格前第一个单词。宿主机类型的判定规则为:

  • 存在订阅上下文($subscriptionId非空)→Azure Virtual Machine;
  • 否则按 WMIWin32_ComputerSystem.Manufacturer判断:以Microsoft*或VMWare*开头 →Virtual Machine;
  • 其余情况 →Physical Server。

核心数统计通过遍历Get-WmiObject Win32_Processor完成,累加每个物理处理器的NumberOfCores(同时统计CPUs数量)。

CSV 输出

脚本末尾按是否处于 Azure 上下文输出不同列结构的 CSV:

Get-SQLInstance | Foreach-Object {Get-Info $_ $subscriptionId $resourceGroup $IsAzureVMName $IsAzureVMOS} ` | Select-Object "name", "version", "edition", "cores", "hostType" ` | ConvertTo-Csv -NoTypeInformation ` | % { $_ -Replace '"', ""} ` | Out-File -FilePath $CSVfilename

Azure 场景下会额外追加subscriptionId、resourceGroup、azureVmName、azureVmOS四列。仓库中附带的示例输出 MyAzureVMs.csv 展示了 Azure 场景的完整格式(如ProdServerUS1\SQL01,2008 R2,Enterprise,12,Azure Virtual Machine,61868ab8-...,RG,VM1,2012),而 MyPhysicalServers.csv 则对应非 Azure 场景的五列格式。

生成的 CSV 即为 Azure 门户中 ESU 批量注册(Bulk Register)所需的输入文件。门户中从"SQL Server 注册表"页面点击↑ Bulk Register进入批量注册流程,即可上传该 CSV 完成实例批量注册:

使用 PowerShell 脚本批量采集清单中的实例

当实例分散在多台机器、不适合逐台登录执行脚本时,可以使用 EOS_DataGenerator_InputList.ps1:把目标实例逐行写进一个文本文件,脚本会逐行读取、逐个连接采集,最终输出汇总 CSV。

运行方式同样为.\EOS_DataGenerator_InputList.ps1,交互式输入两个参数:

  • 输入清单文件名:必须是位于脚本目录下的文本文件;
  • 输出 CSV 文件名:保存在脚本目录,自动补.csv后缀。

输入文件的参考格式见 ServerInstances.txt,每行一个实例,命名实例用机器名\实例名,默认实例直接写机器名:

Server1\SQL2008 Server1\SQL2008R2 Server2\SQL2008R2 Server3\SQL2008 Server4\SQL2008 Server4

脚本的核心处理管线为:

Get-Content $SQLServerList | Foreach-Object {Get-Info $_ } ` | Select-Object "name", "version", "edition", "cores", "hostType" ` | ConvertTo-Csv -NoTypeInformation ` | % { $_ -Replace '"', ""} ` | Out-File -FilePath $CSVfilename -Encoding UTF8

Get-Info函数对每个清单项执行与前文一致的连接、SERVERPROPERTY查询与版本映射;宿主机类型按 WMI 制造商判断(Microsoft*/VMWare*→Virtual Machine,否则Physical Server);核心数与 CPU 数量同样通过 WMI 统计。与 LocalDiscovery 的区别在于:它不做 Azure 上下文探测,因此输出固定为五列格式(name,version,edition,cores,hostType),且 WMI 查询需能访问到目标机器(脚本会从查询结果中取得机器名用于后续 WMI 调用,前提是当前账号对目标机器具有相应 WMI 权限)。

使用注意事项与校验要点

  1. 必须复核 Host Type:scripts.md与两套 PowerShell 脚本均反复强调,上传 CSV 前要逐一核对hostType字段。T-SQL 与 InputList 脚本仅凭 BIOS 制造商(Microsoft / VMware)判断虚拟化,LocalDiscovery 则多了一个 Azure 订阅上下文判定;对于嵌套虚拟化、自研虚拟化平台或云厂商定制镜像等场景,自动判定结果可能与实际不符,需人工修正后上传。
  2. 权限前提:PowerShell 脚本使用 Windows 集成认证连接实例(Trusted_Connection=true),要求运行账号具备目标实例的访问权限与目标机器的 WMI 查询权限;T-SQL 脚本通过xp_instance_regread读取注册表,需在能访问实例注册表的上下文中执行。
  3. 输出位置与编码:所有 CSV 均保存在脚本所在目录,InputList 脚本显式使用-Encoding UTF8输出,便于在 Azure 门户批量注册时正确解析。
  4. 脚本性质声明:三套脚本均为 Microsoft 提供的示例脚本,脚本头部的 Disclaimer 明确指出:示例脚本不受任何 Microsoft 标准支持计划或服务支持,按"原样(AS IS)"提供,不附带任何明示或默示担保,使用风险由使用者自行承担。生产环境使用前请先在测试实例上验证输出结果。
  5. 版本覆盖范围:版本映射表以脚本编写时的 ESU 覆盖版本(SQL Server 2008、2008 R2 等)为核心目标,同时兼容到 2019;对更新版本会落入Other/Unknown,如需支持请自行扩展映射分支。

延伸阅读

  • 模块总览与 ESU 背景说明:readme.md
  • 官方脚本说明文档:scripts.md
  • T-SQL 单实例脚本:EOS_DataGenerator_SingleInstance.sql
  • 本地全实例发现脚本:EOS_DataGenerator_LocalDiscovery.ps1
  • 清单批量采集脚本:EOS_DataGenerator_InputList.ps1
  • 输入清单样例:ServerInstances.txt
  • 输出样例(Azure 场景):MyAzureVMs.csv;输出样例(非 Azure 场景):MyPhysicalServers.csv
  • 示例工程
  • 数据库
  • 教程
  • 后端

【免费下载链接】sql-server-samples

Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge

项目地址:https://gitcode.com/gh_mirrors/sq/sql-server-samples
点击查看免费下载

相关推荐

上一篇:RapidOCR实时推理优化:从毫秒级到微秒级的终极性能突破指南
下一篇:UniTask WebGL异步存储:实现浏览器本地数据的高效管理

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 3:20:14

基于微信小程序的四六级词汇系统:SSM全栈开发与艾宾浩斯复习实战

简介:这份资源是面向英语四六级备考学习者与小程序开发初学者的毕业设计文档,围绕基于微信小程序的四六级词汇系统展开,解决考生随时随地背词、管理学习数据的需求。压缩包内共1个docx文件,约3.79MB,内容涵盖摘要、绪论…

作者头像 李华
网站建设 2026/9/25 3:19:17

源师兄开源硬件全解析:原理图、PCB与引脚图资料一站式汇总

源师兄开源硬件全解析:原理图、PCB与引脚图资料一站式汇总 【免费下载链接】源师兄L0_开源大师兄 基于海思3861芯片平台的源师兄开源项目硬件资料,包括硬件原理图和PCB layout文档。 项目地址: https://gitcode.com/yuanshixiong/ysx-v0 源师兄&a…

作者头像 李华