我已經寫了一個Windows服務,從我們所有的SQL服務器收集信息。該服務被安裝到每個服務器上,並且利用WMI和SMO將相關的系統信息返回到中央數據庫。爲了獲得SQL信息,我使用以下c#代碼:編程越來越SQL羣集虛擬名稱
List<Server> sqlServers = new List<Server>(); //List of Smo.Server objects
string registrySubKey = @"SOFTWARE\Microsoft\Microsoft SQL Server";
string registryValue = "InstalledInstances";
try
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey(registrySubKey);
string[] instances = (string[])rk.GetValue(registryValue);
if (instances.Length > 0)
{
foreach (string element in instances)
{
Server s;
string serverInstance;
if (element == "MSSQLSERVER") //If default instance
{
serverInstance = System.Environment.MachineName;
}
else
{
serverInstance = System.Environment.MachineName + @"\" + element;
}
s = new Server(serverInstance);
if (s != null)
{
sqlServers.Add(s);
}
}
}
}
我遇到的唯一問題是在我們的SQL羣集上。對於那些不熟悉主動/被動sql羣集的人,您不能直接連接到其中一個節點。相反,sql羣集會獲取客戶端將連接到的虛擬名稱和另一個IP地址。當前的代碼將嘗試連接到NodeName \ instanceName,這顯然不適用於羣集。相反,我需要以編程方式查找此節點所屬的SQL羣集虛擬名稱並連接到該虛擬名稱。我想我可能能夠得到來自MSCluster_Cluster WMI類信息,但只會讓我的羣集虛擬名稱,而不是SQL羣集虛擬名稱。提前致謝。