Я написал службу 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, к которому принадлежит этот узел, и подключиться к нему.
Я думал, что смогу получить эту информацию из класса WMI MSCluster_Cluster, но это даст мне только виртуальное имя кластера, а не виртуальное имя кластера SQL.