Sql server 枚举服务器上存在两个不同版本SQL Server的SQL Server服务

Sql server 枚举服务器上存在两个不同版本SQL Server的SQL Server服务,sql-server,powershell,smo,Sql Server,Powershell,Smo,我正试图通过Powershell脚本使用SMO收集有关远程计算机上SQL Server服务的信息。当服务器上存在多个相同SQL server版本的实例时,我的代码似乎可以正常工作 我的问题是,当安装了两个不同版本的SQL Server实例时,我正在创建的ManagedComputer对象中只存在一组服务 具体来说,我有一个SQLServer2008R2的快速安装,作为一个名为“SQLEXPRESS”的命名实例。SQL Server的默认实例是2012。以下代码给出了以下输出,该输出缺少2012服

我正试图通过Powershell脚本使用SMO收集有关远程计算机上SQL Server服务的信息。当服务器上存在多个相同SQL server版本的实例时,我的代码似乎可以正常工作

我的问题是,当安装了两个不同版本的SQL Server实例时,我正在创建的ManagedComputer对象中只存在一组服务

具体来说,我有一个SQLServer2008R2的快速安装,作为一个名为“SQLEXPRESS”的命名实例。SQL Server的默认实例是2012。以下代码给出了以下输出,该输出缺少2012服务:

PS C:\od\scripts\Powershell\ServerInventory> [void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")

PS C:\od\scripts\Powershell\ServerInventory> $s = New-Object -typeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer myComputer

PS C:\od\scripts\Powershell\ServerInventory> $s.services.name
MSSQL$SQLEXPRESS
SQLAgent$SQLEXPRESS
SQLBrowser

PS C:\od\scripts\Powershell\ServerInventory> $s


ConnectionSettings : Microsoft.SqlServer.Management.Smo.Wmi.WmiConnectionInfo
Services           : {MSSQL$SQLEXPRESS, SQLAgent$SQLEXPRESS, SQLBrowser}
ClientProtocols    : {}
ServerInstances    : {MSSQLSERVER, SQLEXPRESS}
ServerAliases      : {}
Urn                : ManagedComputer[@Name='myComputer']
Name               : myComputer
Properties         : {}
UserData           : 
State              : Existing
对于ManagedComputer对象,除了我正在运行的计算机名之外,我看不到向它传递任何信息的能力,没有特定于SQL Server实例的信息


我正在寻找一种方法来收集有关这两个实例服务的信息。

要在网络中搜索SQL Server实例,我使用以下脚本:

clear
#get all servers with SQL Server
$servers = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 
#loop through them and get properties
ForEach ($comp in $servers) { 
    $machine = $comp.ServerName

    try {
        Get-WmiObject win32_Service -Computer $machine |
            where {$_.DisplayName -match "SQL Server \("} | 
            select SystemName, DisplayName, Name, State, Status, StartMode, StartName, Caption

    } catch {
        Write-Host("Error retrieving data from $machine")
    }
}
输出如下:

SystemName  : MACHINENAME
DisplayName : SQL Server (INSTANCE1)
Name        : MSSQL$INSTANCE1
State       : Running
Status      : OK
StartMode   : Auto
StartName   : WORK\USSR$DBEngine
Caption     : SQL Server (INSTANCE1)

SystemName  : MACHINENAME
DisplayName : SQL Server (INSTANCE2)
Name        : MSSQL$INSTANCE2
State       : Running
Status      : OK
StartMode   : Auto
StartName   : WORK\USSR$DBEngine
Caption     : SQL Server (INSTANCE2)

Error retrieving data from NextMachineName
..etc

正如您在
MACHINENAME
上看到的,有2个实例正在运行。我们没有任何具有两个不同版本SQL Server的服务器,因此我无法检查此问题。

要在网络中搜索SQL Server实例,我使用以下脚本:

clear
#get all servers with SQL Server
$servers = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 
#loop through them and get properties
ForEach ($comp in $servers) { 
    $machine = $comp.ServerName

    try {
        Get-WmiObject win32_Service -Computer $machine |
            where {$_.DisplayName -match "SQL Server \("} | 
            select SystemName, DisplayName, Name, State, Status, StartMode, StartName, Caption

    } catch {
        Write-Host("Error retrieving data from $machine")
    }
}
输出如下:

SystemName  : MACHINENAME
DisplayName : SQL Server (INSTANCE1)
Name        : MSSQL$INSTANCE1
State       : Running
Status      : OK
StartMode   : Auto
StartName   : WORK\USSR$DBEngine
Caption     : SQL Server (INSTANCE1)

SystemName  : MACHINENAME
DisplayName : SQL Server (INSTANCE2)
Name        : MSSQL$INSTANCE2
State       : Running
Status      : OK
StartMode   : Auto
StartName   : WORK\USSR$DBEngine
Caption     : SQL Server (INSTANCE2)

Error retrieving data from NextMachineName
..etc


正如您在
MACHINENAME
上看到的,有2个实例正在运行。我们没有任何服务器具有两个不同版本的SQL Server,因此我无法检查此问题。

我无法复制此问题。什么是我的计算机?它不是有效的名称或变量。
myComputer
是您机器的实际名称吗?也许你连接错了机器。尝试使用
而不是
myComputer
是的,
myComputer
是计算机名,我将其从实际计算机名更改为。我尝试在机器上远程连接,但没有成功,同时使用名称和
@Panagiotis。您有运行两个不同版本SQL server的服务器吗?是的。2014年和2016年,SSIS、SSAS和报告服务同时运行。它们都显示正确。服务可能停止了吗?您能在“服务”小程序中看到它们吗?2008 R2实例的服务实际上与浏览器服务一起关闭和禁用。它们仍然是ManagedComputer对象中显示的唯一对象。2012年的服务已经启动并运行。使用services.msc和SQL Server Configuration Manager可以正确显示所有服务。我已尝试打开和关闭服务(包括浏览器),结果相同。我无法复制此结果。什么是我的计算机?它不是有效的名称或变量。
myComputer
是您机器的实际名称吗?也许你连接错了机器。尝试使用
而不是
myComputer
是的,
myComputer
是计算机名,我将其从实际计算机名更改为。我尝试在机器上远程连接,但没有成功,同时使用名称和
@Panagiotis。您有运行两个不同版本SQL server的服务器吗?是的。2014年和2016年,SSIS、SSAS和报告服务同时运行。它们都显示正确。服务可能停止了吗?您能在“服务”小程序中看到它们吗?2008 R2实例的服务实际上与浏览器服务一起关闭和禁用。它们仍然是ManagedComputer对象中显示的唯一对象。2012年的服务已经启动并运行。使用services.msc和SQL Server Configuration Manager可以正确显示所有服务。我尝试过打开和关闭服务(包括浏览器),结果是一样的。可以肯定,这是一个简单的解决方法。但是我希望使用ManagedComputer类,因为它提供了我正在寻找的服务,而不必检查显示名称。我们得到了
SQL Server WMI提供程序在XXXX上不可用
当使用
ManagedComputer
类时:|好吧,祝你好运找到答案!显然,这一条上也有一个bug:[链接]。谢谢你的回复。谢谢你的链接!平心而论,这是一个简单的解决办法。但是我希望使用ManagedComputer类,因为它提供了我正在寻找的服务,而不必检查显示名称。我们得到了
SQL Server WMI提供程序在XXXX上不可用
当使用
ManagedComputer
类时:|好吧,祝你好运找到答案!显然,这一条上也有一个bug:[链接]。谢谢你的回复。谢谢你的链接!