我编写了一个 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 群集虚拟名称。
有了这个代码:
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 获得了这段代码(),一个非常有用的工具,用于浏览不同的 WMI 命名空间/类/属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)