2016-10-10 40 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