J'ai écrit un service Windows pour collecter des informations sur tous nos serveurs SQL. Le service est installé sur chaque serveur et, en utilisant WMI et SMO, insère les informations système pertinentes dans une base de données centrale. Afin d'obtenir les informations SQL, j'utilise le code C# suivant:Obtention par programme du nom virtuel du cluster SQL
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);
}
}
}
}
Le seul problème que je vais avoir est sur nos clusters SQL. Pour ceux d'entre vous qui ne connaissent pas le clustering SQL actif/passif, vous ne pouvez pas vous connecter directement à l'un des nœuds. Au lieu de cela, le cluster sql obtient un nom virtuel et une autre adresse IP à laquelle les clients se connecteraient. Le code actuel que je vais essayer de se connecter à NodeName \ instanceName qui, évidemment, ne fonctionnera pas sur le cluster. Au lieu de cela, j'ai besoin de trouver par programme le nom virtuel du cluster SQL auquel ce nœud appartient et de s'y connecter à la place. Je pensais que je pourrais obtenir cette information de la classe WMI MSCluster_Cluster, mais cela me donnera seulement le nom virtuel du cluster, pas le nom virtuel du cluster SQL. Merci d'avance.