2

我编写了一个 Windows 服务来从我们所有的 SQL 服务器收集信息。该服务安装到每台服务器上,并利用 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 集群的人,您不能直接连接到其中一个节点。相反,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) 作为两个输出:

名称: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

您可以将 WMI 查询与 mscluster WMI 类一起使用吗?

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

通过查询,我的意思是询问集群的所有资源/组以定位 SQL Server 网络名称。

于 2010-02-10T23:00:38.967 回答