gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:47:30 25 4
gpt4 key购买 nike

我编写了一个 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 ( http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en ) 获得了这段代码,这是一个非常有用的工具,可以浏览不同的 WMI 命名空间/类/属性。

关于c# - 以编程方式获取 SQL 集群虚拟名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com