我编写了一个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群集虚拟名称。
答案 0 :(得分: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 :(得分: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网络名称。