2010-05-04 4 views
1

J'essaie d'utiliser SMO (VS 2010, SQL Server 2008) pour me connecter à SQL Server et voir la configuration du protocole du serveur. Je peux me connecter et répertorier les services et les protocoles client ainsi que le compte service MSSQLSERVER s'exécute sous. Toutefois, la collection ServerInstances est vide. La seule instance sur le serveur cible est la valeur par défaut (MSSQLSERVER), ne devrait-elle pas être dans la collection? Comment puis-je obtenir une instance pour inspecter la collection ServerProtocols? Voici le code que je utilise:SMO ManagedComputer.ServiceInstances est vide

class Program 
{ 
    static void Main(string[] args) 
    { 
     //machine hosting installed sql server instance 
     ManagedComputer host = new ManagedComputer("fully-qualified.host.name"); 


     if (host.ServerInstances.Count != 0) 
     { 
      //why is this 0? Is it because only the DEFAULT instance exists? 
      Console.WriteLine("/////////////// INSTANCES ////////////////"); 
      foreach (ServerInstance inst in host.ServerInstances) 
      { 
       Console.WriteLine(inst.Name); 
      } 
     } 

     Console.WriteLine("/////////////// SERVICES ////////////////"); 
     // enumerate sql services (looking for MSSSQLSERVER) 
     foreach (Service svc in host.Services) 
     { 
      Console.WriteLine(svc.Name); 
     } 

     Console.WriteLine("/////////////// DETAILS ////////////////"); 

     // get name of MSSQLSERVER instance from user (pick from list above) 
     Service mssqlserver = host.Services["MSSQLSERVER"]; 

     // print service account: .\{account} == "local account", "LocalSystem", "NetworkService", {domain}\{account} == "domain account" 
     Console.WriteLine("Service Account: {0}", mssqlserver.ServiceAccount); 

     // get client protocols 
     foreach (ClientProtocol cp in host.ClientProtocols) 
     { 
      Console.WriteLine("{0} {1} ({2})", cp.Order, cp.DisplayName, cp.IsEnabled ? "Enabled" : "Disabled"); 
     } 

    } 
} 

J'ai aussi essayé:

  Urn u = new Urn("ManagedComputer[@Name='fully-qualified.host.name']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']"); 
     ServerProtocol tcp = host.GetSmoObject(u) as ServerProtocol; 
     if (tcp != null) 
     { 
      Console.WriteLine("{0}", tcp.DisplayName); 
     } 

Mais je reçois un message d'erreur indiquant: "les expressions de l'enfant ne sont pas pris en charge." Des idées ce qui ne va pas?

Répondre

0

Donc, je n'ai jamais trouvé la réponse à cette question, mais j'ai trouvé une solution de contournement.

  ManagedComputer host = new ManagedComputer(hostName); 

     Server server = new Server(); 
     Console.WriteLine("TcpEnabled: {0}", server.TcpEnabled); 

Ce me fait ce que je dois, je préférerais être en mesure d'énumérer les ServerProtocols, mais cela va me permettre de vérifier le strict minimum.

2

Pour obtenir des résultats dans la liste des ServerInstances, vous devez définir explicitement:

host.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use64bit;

ou

host.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use32bit;