以编程方式获取SQL群集虚拟名称

问题描述 投票:2回答: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群集虚拟名称。

c# .net sql-server wmi smo
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名称空间/类/属性。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.