2014-01-28 39 views
1

我想創建一個腳本,通過我們所有的SQL Server實例的一個文本文件,自動迭代,並添加每個上,如果它不存在於CMS。我想通過SMO嘗試這樣做,而不是硬編碼SQL字符串。下面是我迄今爲止,但它似乎並沒有工作。任何幫助,將不勝感激。謝謝。添加SQL Server實例中央管理服務器組使用PowerShell

最終,我會添加更多的如果語句分配情況,以某些羣體,但現在我只是想獲得它填充了一切。

$CMSInstance = "cmsinstancename" 
$ServersPath = "C:\Scripts\InPutFiles\servers.txt" 

#Load SMO assemplies 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Management.RegisteredServers') | out-null 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Management.Common') | out-null 

$connectionString = "Data Source=$CMSINstance;Initial Catalog=master;Integrated Security=SSPI;" 
$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString) 
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection) 
$CMSStore = new-object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($conn) 
$CMSDBStore = $CMSStore.ServerGroups["DatabaseEngineServerGroup"] 

$Servers = Get-Content $ServersPath; 

foreach($Server in $Servers) 
{ 
     #Put this in loop to deal with duplicates in list itself 
     $AlreadyRegisteredServers = @() 
     $CMSDBStore.GetDescendantRegisteredServers() 

     $RegServerName = $Server.Name 
     $RegServerInstance = $Server.Instance 

     if($AlreadyRegisteredServers -notcontains $RegServerName) 
     { 
      Write-Host "Adding Server $RegServerName" 
      $NewServer = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($CMSDBStore, "$RegServerName") 
      $NewServer.SecureConnectionString = "server=$RegServerInstance;integrated security=true" 
      $NewServer.ConnectionString = "server=$RegServerInstance;integrated security=true" 
      $NewServer.ServerName = "$RegServerInstance" 
      $NewServer.Create() 
     } 
     else 
     { 
      Write-Host "Server $RegServerName already exists - cannot add." 
     } 
} 
+0

什麼錯誤你好嗎? 「它似乎沒有工作」並不是非常具體。 – dpw

+0

開始小一點。選擇一個您知道不在CMS中的服務器並嘗試添加該服務器。 –

+0

它不添加服務器是什麼不對的地方,我已經嘗試添加一臺服務器,我知道心不是有已,香港專業教育學院甚至試圖清除CMS表在msdb中,從頭開始,這並不工作之一:/ – Skunny11

回答

3

我把你的腳本簡化爲基本的,它適用於我。我不得不將連接命令更改爲在我的環境中工作,但除此之外,註冊SQL Server的默認實例沒有錯誤。一旦我刷新了CMS服務器,新註冊的服務器就可以看到並且可以訪問。

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Management.RegisteredServers') | Out-Null 

$CMSInstance = 'CMS_ServerName' 
$connectionString = "Data Source=$CMSInstance;Initial Catalog=master;Integrated Security=SSPI;" 
$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString) 
$conn = New-Object System.Data.SqlClient.SqlConnection("Server=$CMSInstance;Database=master;Integrated Security=True") 
$CMSStore = new-object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($conn) 
$CMSDBStore = $CMSStore.ServerGroups["DatabaseEngineServerGroup"] 

$RegServerName = 'ServerToRegister' 
$RegServerInstance = $RegServerName 
$NewServer = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($CMSDBStore, "$RegServerName") 
$NewServer.SecureConnectionString = "server=$RegServerInstance;integrated security=true" 
$NewServer.ConnectionString = "server=$RegServerInstance;integrated security=true" 
$NewServer.ServerName = "$RegServerInstance" 
$NewServer.Create()
+0

謝謝,我會盡快測試一下,並讓你知道它是如何發展的。 – Skunny11

+0

謝謝你的工作,我會打開一個新的問題,讓它遍歷我的服務器列表並添加每個服務器實例。 – Skunny11

+0

很高興幫助。我希望命名實例能夠正常工作,但沒有通過腳本嘗試過。我明天可能會嘗試。或者你可以試試看,讓我們知道。 – Bruce

相關問題