すべての SQL サーバーから情報を収集する Windows サービスを作成しました。このサービスは各サーバーにインストールされ、WMI と SMO を利用して、関連するシステム情報を中央データベースに挿入します。SQL 情報を取得するために、次の C# コードを使用します。
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 クラスタリングに慣れていない方のために説明すると、ノードの 1 つに直接接続することはできません。代わりに、SQL クラスターは仮想名と、クライアントが接続する別の IP アドレスを取得します。
私が持っている現在のコードは NodeName\instanceName に接続しようとしますが、これは明らかにクラスターでは機能しません。代わりに、このノードが属する SQL クラスターの仮想名をプログラムで見つけて、それに接続する必要があります。
MSCluster_Cluster WMI クラスからこの情報を取得できるのではないかと考えましたが、取得できるのはクラスターの仮想名だけで、SQL クラスターの仮想名は取得できません。