Accès refusé lors d’une tentative d’arrêt d’un service Windows C #

J’ai créé un service Web C # utilisant Visual Studio pour arrêter le service Windows “SMTP” appelé SMTPSVC.

Voici la méthode Web pour le faire:

[WebMethod] public ssortingng StopService() { Ssortingng status = ""; try { ServiceController scAlerter = new ServiceController("SMTPSVC"); Console.WriteLine(scAlerter.DisplayName); Console.WriteLine(scAlerter.CanStop); scAlerter.Stop(); Console.WriteLine("Service stopped"); status = "STOPPED"; } catch (Exception e) { Console.WriteLine("Exception caught here" + e.ToSsortingng()); status = "Exception" + e.ToSsortingng(); } return status; } 

J’ai publié ce service Web sur mon serveur IIS 5.1. Lorsque j’ai appelé le service, il lève l’exception suivante «Accès refusé».

   ExceptionSystem.InvalidOperationException: Cannot open SMTPSVC service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied --- End of inner exception stack trace --- at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) at System.ServiceProcess.ServiceController.Stop() at Service.RestartService() in c:\Inetpub\wwwroot\RestartService\App_Code\Service.cs:line 38  

Par défaut, le service utilise le compte d’utilisateur IUSER_system-name et j’ai ajouté ce compte d’utilisateur au groupe Administrateurs du système, ainsi ASPNET compte d’utilisateur ASPNET au groupe Administrateurs.

J’ai pu arrêter / démarrer ce service Windows du programme autonome C # avec succès.

Pouvez-vous me faire savoir quel est le problème? Les parameters d’autorisation ou les droits d’access des utilisateurs IIS devront-ils être modifiés pour pouvoir exécuter cette opération?

Faites-moi également savoir quel compte d’utilisateur ce service C # utiliserait pour arrêter le service Windows?

Votre aide est tres apprecie.

Merci d’avance, Yogi

Le compte IUSER_nom_ordinateur (IUSER en abrégé, dans la suite) est, pour de bonnes raisons, un compte relativement limité, avec un peu plus de privilèges qu’un compte invité. Il est interdit de démarrer et d’arrêter les services Windows, ni même de les interroger (pour obtenir leur statut, etc.).
Lorsqu’elle est exécutée dans le contexte d’un exe autonome, la logique ci-dessus est réussie car le compte sous-jacent est [probablement] vous qui êtes probablement membre du groupe Administrateurs, ou un compte assez puissant en tout cas.

Le moyen facile, mais non recommandé , de sortir de cette situation est de donner plus de privilèges au compte IUSER. Juste pour essayer d’append ce compte au groupe d’administrateurs, bam !, cela fonctionnera (mais introduira également une faille de sécurité potentiellement dangereuse).
Une meilleure approche consiste à créer la liste explicite des services Windows particuliers qu’il sera autorisé à gérer via IIS et à définir le descripteur de sécurité de service individuel sur afin que le compte IUSER (ou un autre compte / groupe créé pour l’occasion) être autorisé à les démarrer et / ou les arrêter comme vous le souhaitez.
La difficulté de la mise en œuvre de cette approche est qu’à ma connaissance, il n’existe ni interface graphique ni outil d’administration intuitif pour inspecter et modifier le descripteur de sécurité des services: vous devez utiliser sd et “apprendre” le langage SDDL. Voici quelques conseils pour le faire

  • Meilleures pratiques et conseils MSDN pour les rédacteurs de listes de contrôle d’access discrétionnaires de service
  • commande sdshow sc
  • commande sc sdset