在PowerShell中获取MSSQL实例版本:Get-SqlInstance不可用的替代方案
获取运行中MSSQL实例版本信息的替代方案
你已通过以下PowerShell代码找到本地4个运行中的MSSQL实例:
$Hostname = (Get-WmiObject Win32_OperatingSystem).CSName $GetSQLInstance = Get-Service -ComputerName $Hostname | Where-Object { ($_.Name -eq 'mssqlserver' -or $_.Name -like 'mssql$*') -and $_.DisplayName -like 'SQL Server*'} $GetSQLInstance
输出:
Status Name DisplayName ------ ---- ----------- Running MSSQL$INSTANCE01 SQL Server (INSTANCE01) Running MSSQL$INSTANCE02 SQL Server (INSTANCE02) Running MSSQL$INSTANCE03 SQL Server (INSTANCE03) Running MSSQL$INSTANCE04 SQL Server (INSTANCE04)
由于未安装SqlServer模块,Get-SqlInstance命令无法使用,以下是几种无需额外安装模块的可靠方案:
方法1:通过SQL Server专属WMI类查询
使用SqlServiceAdvancedProperty类直接获取版本信息,这是最精准的方式之一:
# 获取所有运行中的SQL实例服务 $runningInstances = Get-Service | Where-Object { ($_.Name -eq 'mssqlserver' -or $_.Name -like 'mssql$*') -and $_.Status -eq 'Running' } foreach ($instance in $runningInstances) { # 处理默认实例和命名实例的名称格式 $instanceName = $instance.Name -eq 'mssqlserver' ? 'MSSQLSERVER' : $instance.Name.Substring(5) # 查询版本属性 $versionProp = Get-CimInstance -ClassName SqlServiceAdvancedProperty -Filter "ServiceName='$($instance.Name)' AND PropertyName='VERSION'" # 输出结构化结果 [PSCustomObject]@{ InstanceName = $instanceName DisplayName = $instance.DisplayName Version = $versionProp.PropertyStrValue } }
方法2:读取注册表信息
SQL Server会将版本、Edition等信息存储在注册表中,可直接读取:
$runningInstances = Get-Service | Where-Object { ($_.Name -eq 'mssqlserver' -or $_.Name -like 'mssql$*') -and $_.Status -eq 'Running' } foreach ($instance in $runningInstances) { $instanceName = $instance.Name -eq 'mssqlserver' ? 'MSSQLSERVER' : $instance.Name.Substring(5) # 确定注册表路径 if ($instance.Name -eq 'mssqlserver') { $regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLSERVER\Setup' } else { # 通过实例名称获取对应的Instance ID $instanceId = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL").$instanceName $regPath = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$instanceId\Setup" } # 读取并输出信息 if (Test-Path $regPath) { $setupDetails = Get-ItemProperty $regPath [PSCustomObject]@{ InstanceName = $instanceName DisplayName = $instance.DisplayName Version = $setupDetails.Version Edition = $setupDetails.Edition } } }
方法3:使用sqlcmd执行SQL查询
如果拥有实例的登录权限,可通过默认安装的sqlcmd工具执行查询获取详细版本信息:
$runningInstances = Get-Service | Where-Object { ($_.Name -eq 'mssqlserver' -or $_.Name -like 'mssql$*') -and $_.Status -eq 'Running' } foreach ($instance in $runningInstances) { # 构建服务器连接字符串 $server = $instance.Name -eq 'mssqlserver' ? '.' : ".\$($instance.Name.Substring(5))" # 执行@@VERSION查询,-h -1表示去掉表头和空行 $versionInfo = sqlcmd -S $server -Q "SELECT @@VERSION" -b -h -1 [PSCustomObject]@{ InstanceName = $instance.Name -eq 'mssqlserver' ? 'MSSQLSERVER' : $instance.Name.Substring(5) DisplayName = $instance.DisplayName FullVersionInfo = $versionInfo.Trim() } }
内容的提问来源于stack exchange,提问作者saturnSam
相关产品推荐
相关产品推荐

