2010-11-16 25 views
2

Ce que je dois faire est de lire une valeur de chaîne spécifique à l'application à partir de HKLM à partir d'un service Windows. La ruche et les valeurs du registre ont été ajoutées à l'aide d'un formulaire Windows, un outil permettant de modifier les valeurs de configuration du service Windows. Je ne suis pas en mesure de lire les valeurs de mon service Windows, "l'accès au Registre demandé n'est pas autorisé". J'essaie d'ouvrir et de lire comme suit:Lecture de HKLM à partir du service Windows sur Windows 7

rk = Registry.LocalMachine.OpenSubKey(key, RegistryKeyPermissionCheck.ReadSubTree); 
if (rk != null) 
{ 
    value = rk.GetValue(setting).ToString(); 
} 
+1

Pouvez-vous également publier le code depuis votre application Winforms qui ajoute la clé? Il s'agit clairement d'un problème d'autorisations, mais si la clé de registre avait des autorisations par défaut pour HKLM, cela aurait dû fonctionner. Le fait que cela ne fonctionne pas me dit que les autorisations par défaut ne sont pas * non *. –

+0

J'ai frotté ma boule de cristal et dit que vous utilisez votre service avec un compte d'utilisateur 'non standard'. LocalSystem et les amis sont très privilégiés. Le compte qui exécute votre application winform n'est généralement pas btw. –

Répondre

1

L'application et le service s'exécutent-ils sous des informations d'identification différentes? L'application de configuration peut être soumise à une virtualisation de registre (http://msdn.microsoft.com/en-us/library/aa965884.aspx). OU il peut y avoir une différence entre le nombre de bits de l'application de configuration et le service et vous voyez différentes vues du registre (http://msdn.microsoft.com/en-us/library/aa384232.aspx).

+0

Ceci est ma conjecture (en particulier votre conjecture # 1) –

+0

Oui, # 1 semble l'être. J'empêche le formulaire de créer ces clés et de créer à partir du package d'installation de service. Toujours disponible pour la mise à jour à partir du formulaire lorsqu'il est exécuté en tant qu'administrateur. Et je peux les lire du service. – moakley

2

Je fais cela à partir d'un service Windows .NET maintenant avec ce code.

public const string REG_KEY_MINE = @"SOFTWARE\Mine\Test"; 

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(REG_KEY_MINE, false)) 
{ 

    UDP_PORT = (int) key.GetValue("UdpPort", 43221); 
    TCP_PORT = (int) key.GetValue("TcpPort", 8005); 
} 

Donc, il est possible que vous exécutiez votre service pas sous les privilèges d'administrateur par défaut ???

+0

Si vous lisez simplement des valeurs, vous devez passer 'false' comme second paramètre de' OpenSubKey'. Vous n'avez pas besoin de courir sous un compte administratif pour * lire * à partir de HKLM. –

+0

Vous avez absolument raison, je peux ouvrir cela comme FAUX. Je vais mettre à jour le code. – Melloware