2

すべての 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 クラスターの仮想名は取得できません。

4

2 に答える 2

2

このコードで:

using System.Management;

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\MSCluster", "SELECT * FROM MSCluster_Resource"); 

foreach (ManagementObject queryObj in searcher.Get())
{
    Console.WriteLine("Name: {0}", queryObj["Name"]);
}

SQL クラスター名 ( 2008CLUSTERSQL) が 2 つの出力として表示されます。

名前: SQL IP アドレス i ( 2008CLUSTERSQL)

名前: SQL ネットワーク名 ( 2008CLUSTERSQL)

これは役に立ちますか?名前を抽出できると思いますか?

このコードは、WMI Code Creator ( http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en ) から取得しました。これは、さまざまな WMI 名前空間を参照するための非常に便利なツールです。クラス/プロパティ。

于 2010-03-04T21:50:14.547 に答える
1

mscluster WMIクラスでWMIクエリを使用できますか?

http://technet.microsoft.com/en-us/library/cc780572(WS.10).aspx http://blogs.msdn.com/clustering/archive/2008/01/08/7024031.aspx

クエリとは、すべてのクラスターのリソース/グループに問い合わせて、SQLServerネットワーク名を見つけることを意味します。

于 2010-02-10T23:00:38.967 に答える