2009-06-07 7 views
9

Je dois modifier l'utilisateur d'ouverture de session pour un service Windows par programme. Et je suis en utilisant le code suivant pour le faire:Modifier l'utilisateur du service Windows par programme

string objPath = string.Format("Win32_Service.Name='{0}'", ServiceName); 
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath))) 
{ 
object[] wmiParams = new object[11]; 

if (PredefinedAccount) 
    { 
     wmiParams[6] = "LocalSystem"; 
      wmiParams[7] = ""; 
    } 
    else 
    { 
     wmiParams[6] = ServiceUsername; // provided by user 
      wmiParams[7] = ServicePassword; // provided by user 
    } 

    object invokeResult = service.InvokeMethod("Change", wmiParams); 

// handle invokeResult - no error up to this point 
} 

Ce code fonctionne dans 90% des situations, mais dans un service de situations ne peut être démarré en raison de l'ouverture de session échec. Il n'y a généralement pas d'erreur sur InvokeMetod mais quand nous essayons de commencer le service que nous obtenons l'erreur suivante:

System.InvalidOperationException: Cannot start service X on computer '.'. --> System.ComponentModel.Win32Exception: The service did not start due to a logon failure.

La solution de contournement est simple, il suffit d'entrer les mêmes informations d'identification via l'interface Windows et problème est résolu. Donc, ma question est, quelqu'un a-t-il rencontré le même problème avec ManagementObject parce qu'il semble que dans certaines situations, il ne concerne pas le nom d'utilisateur et le mot de passe du service Windows?

+1

Je me demande si elle est due à votre déclaration à l'aide. Qu'est-ce que je veux dire est le ManagementObject se détruit avant qu'il ne soit autorisé à terminer? Je ne suis pas trop familier avec WMI, donc je ne suis pas sûr. – HVS

+0

Étant donné que le nom d'utilisateur et le mot de passe sont saisis par l'utilisateur, je rechercherais également des problèmes. Assurez-vous qu'ils sont des noms valides. "DOMAINE \ nom d'utilisateur" est bon dans n'importe quel système, mais "nom d'utilisateur @ DOMAINE" ne fonctionne pas dans Windows 2000 et plus tôt. – HVS

+0

Nous avons le même problème et je suis certain que le service a été installé avec un programme d'installation C#, .net 1.1. Je démarre le service à partir de la ligne de commande ('net start') et j'obtiens un échec de connexion. Étrangement, cela se produit avec 2 des 7 services installés sur la machine (probablement en utilisant le même code d'installation). Je n'ai pas encore eu le temps de le diagnostiquer, mais la machine est un serveur Windows 2003 avec les derniers service packs. Les services sont C# .net 2.0 code. La saisie manuelle du mot de passe le corrige jusqu'au redémarrage. – LegendLength

Répondre

0

Notez-vous des modèles parmi ces échecs? Même machine? Même OS Même utilisateur? L'utilisateur a-t-il les droits "logon as service" ou "logon interactivement"? Personnellement, je ne suis pas familier avec cette méthode de spécification de l'utilisateur pour un service. J'aurais pensé que vous auriez à redémarrer le service, mais je suppose que non, si cela fonctionne 90% du temps.

+0

Eh bien cela dépend, sur divers OS-s. Il n'y a pas de modèle. Parfois cela se produit si le mot de passe est court (moins de 7 caractères). Dans tous ces cas, le problème a été résolu lorsque l'utilisateur a entré le même nom d'utilisateur et mot de passe via l'interface par défaut de Windows. Nous supposons donc que c'est quelque chose dans notre code ou le ManagementObject que nous utilisons. – Anne

9

Je ne suis pas sûr si ce problème est résolu. Mais nous venons de rencontrer le même problème et nous avons compris que c'est parce que le compte n'a pas de privilège "Se connecter en tant que service". Vous devez utiliser LsaAddAccountRights pour ajouter un tel privilège au compte.

Voir cet article s'il vous plaît:

How To Manage User Privileges Programmatically in Windows NT

+0

Brillant! C'était mon problème, merci de l'avoir publié. – lidermin

Questions connexes