2010-05-21 3 views
2

Je suis en train d'interroger les valeurs clés Registre suivantes:RegistryKey ValueCount/SubKeyCount mal

HKLM \ SOFTWARE \ Microsoft \ MSSQLServer \ Client \ SharedMemoryOn HKLM \ SOFTWARE \ Microsoft \ MSSQLServer \ Client \ SuperSocketNetLib \ ProtocolOrder

Mais selon la machine sur laquelle j'exécute le programme, la requête renvoie null. Quand je debug sur ma machine locale et j'inspecte la valeur ValueCount pour:

HKLM \ SOFTWARE \ Microsoft \ MSSQLServer \ Client HKLM \ SOFTWARE \ Microsoft \ MSSQLServer \ Client \ SuperSocketNetLib

Le compte est 0 et OpenSubKey renvoie null.

Je suis un administrateur de domaine, dans le groupe d'administrateurs locaux et ont ajouté ce qui suit à mon app.manifest:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

Toute idée pourquoi?

 private static void ValidateSqlClientSettings() 
    { 
     Console.WriteLine("\r\n/////////////// LOCAL SQL CLIENT PROTOCOLS ////////////////"); 

     RegistryKey keyHKLM = Registry.LocalMachine; 
     ///TODO: nullreferenceexception - connect to remote machine and find out why 
     RegistryKey sqlClientKey = keyHKLM.OpenSubKey(@"SOFTWARE\Microsoft\MSSQLServer\Client"); 

     if (sqlClientKey == null) 
     { 
      WriteLine2Console(@"WARNING: unable to read registry key '{0}\SOFTWARE\Microsoft\MSSQLServer\Client'", ConsoleColor.Yellow); 
     } 

     var cliKeyNames = from k in sqlClientKey.GetSubKeyNames() 
          where k == "SuperSocketNetLib" 
          select k; 

     ///TODO: find out why these values are always missing (even if I can see them in regedit) 
     Console.Write("Shared Memory Disabled (cliconfg): "); 
     if (Convert.ToBoolean(sqlClientKey.GetValue("SharedMemoryOn"))) 
      WriteLine2Console("FAILED", ConsoleColor.Red); 
     else if(sqlClientKey.GetValue("SharedMemoryOn") == null) 
      WriteLine2Console(String.Format("WARNING - unable to read '{0}\\SharedMemoryOn'", sqlClientKey.Name), ConsoleColor.Yellow); 
     else 
      WriteLine2Console("PASS", ConsoleColor.Green); 

     Console.Write("Client Protocol Order (cliconfg - tcp first): "); 
     foreach (string cliKey in cliKeyNames) 
     { 
      RegistryKey subKey = sqlClientKey.OpenSubKey(cliKey); 
      object order = subKey.GetValue("ProtocolOrder"); 
      if (order != null && order.ToString().StartsWith("tcp") == false) 
      { 
       WriteLine2Console("FAILED", ConsoleColor.Red); 
      } 
      else if (order == null) 
      { 
       WriteLine2Console(String.Format("WARNING - unable to read '{0}\\ProtocolOrder'", subKey.Name), ConsoleColor.Yellow); 
      } 
      else 
      { 
       WriteLine2Console("PASS", ConsoleColor.Green); 
      } 
      subKey.Close(); 
     } 

     sqlClientKey.Close(); 
     keyHKLM.Close(); 
    } 

Répondre

4

Un autre facteur que vous devez faire attention à l'application est bitness. Sur Windows x64, votre build x86 recherchera les clés de registre sous (dans regedit) "SOFTWARE \ WOW6432Node \ Microsoft \ MSSQLServer \ Client", lorsque vous spécifiez (dans le code) "Software \ Microsoft \ MSSQLServer \ Client"

C'est une redirection WOW64 pour les clés de registre.

Comme Visual Studio 2010 crée par défaut exe en mode x86, vous devez faire attention à ce conseil.

+0

Merci! J'ai changé ma cible de plate-forme à "Any CPU" et cela a fonctionné. Je n'ai pas essayé le résultat sur une machine x86 bien que ce soit aussi important à vérifier. Mais je n'avais pas remarqué le défaut de x86 avant. –

0

Essayez de changer sqlclientkey à ce qui suit:

RegistryKey sqlClientKey = keyHKLM.OpenSubKey(@"SOFTWARE\\Microsoft\\MSSQLServer\\Client");