2010-02-03 4 views
2

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.

Répondre

1

Avec ce code:

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"]); 
} 

Je peux voir mon nom de cluster SQL (2008CLUSTERSQL) comme deux des sorties:

Nom: SQL Adresse IP i (2008CLUSTERSQL)

Nom: Nom du réseau SQL (2008CLUSTERSQL)

Cela aidera-t-il? Je suppose que vous pouvez extraire le nom de sortir?

J'ai reçu ce code de WMI Code Creator (http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en), un outil très utile pour parcourir les différents espaces/classes/propriétés WMI.

Harold

Questions connexes