2016-10-10 39 views
1

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

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

具体来说,我有一个名为'SQLEXPRESS'的命名实例,SQL Server 2008 R2的EXPRESS安装。 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实例的计算机名称。

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

+0

我不能重现这一点。什么是'myComputer'?这不是有效的名称或变量。 myComputer是你机器的实际名称吗?也许你正在连接到错误的机器。用'.'代替'myComputer'试试 –

+0

是的,'myComputer'是计算机名称,我将它从实际的计算机名称中更改。我尝试远程连接并在机器本身无济于事,使用名称和'.' – SQLEnforcer

+0

@Panagiotis你有一台服务器与两个不同版本的SQL Server运行? – SQLEnforcer

回答

0

要搜索网络中的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的服务器,所以我无法检查这个问题。

+0

这是一个简单的解决方法,当然。但我希望使用ManagedComputer类,因为它提供了我正在查找的服务,而不必检查显示名称。 – SQLEnforcer

+0

当使用'ManagedComputer'类时,我们得到'SQL Server WMI提供程序在XXXX上不可用':|那么,祝你好运找到答案! – gofr1

+0

显然也有一个错误:[链接] https://connect.microsoft.com/SQLServer/feedback/details/1070235/sql-2014-smo-cant-query-sql-2012-instances-sql-服务器的WMI提供程序是 - 不使用[链接]。感谢您的回复。 – SQLEnforcer