Comment démarrer / arrêter un service Windows à partir d'une application ASP.NET - Problèmes de sécurité
Voici mon Windows/.FILET de sécurité de la pile:
- Un Service Windows exécute en tant que système local sur un Serveur Windows 2003 boîte.
- Un .NET 3.5 le Site web fonctionnant sur la même case, en vertu de l' "par défaut" serveur de production, les paramètres IIS (probablement en tant que service réseau de l'utilisateur?)
Sur mon défaut VS2008 environnement de DEV, j'ai cette méthode, qui est appelée à partir de la ASP.NET application, qui fonctionne très bien:
private static void StopStartReminderService() {
ServiceController svcController = new ServiceController("eTimeSheetReminderService");
if (svcController != null) {
try {
svcController.Stop();
svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
svcController.Start();
} catch (Exception ex) {
General.ErrorHandling.LogError(ex);
}
}
}
Lorsque je l'exécute sur le serveur de production, j'obtiens l'erreur suivante à partir de la ServiceController:
Source: Système D'.ServiceProcess ->
Système.ServiceProcess.ServiceController -> IntPtr
GetServiceHandle(Int32) -> Système.InvalidOperationException Message:
Ne peut pas ouvrir eTimeSheetReminderService service sur l'ordinateur '.'.
Pourquoi est-ce qui se passe, et comment puis-je résoudre ce problème?
EDIT:
La réponse est ci-dessous, pour la plupart, dans les commentaires, mais pour clarifier:
- Le problème était lié à la Sécurité, et s'est produite parce que le compte service réseau n'a pas de droits suffisants pour Démarrer/Arrêter un service
- J'ai créé un Compte d'Utilisateur Local, et de l'ajouter à la PowerUsers Groupe (ce groupe a près de droits d'administrateur)
- Je ne veux pas tout mon Web App pour usurper l'identité de cet utilisateur tous les temps, donc je usurper l'identité que dans la méthode où je manipule le service. J'ai ce faire, utilisez les ressources suivantes pour m'aider à le faire dans le code:
Article base de connaissances microsoft et ceci, juste pour obtenir une meilleure compréhension
REMARQUE: je n'ai pas usurper l'identité via le web.config, je le fais dans le code. Consultez l'Article base de connaissances microsoft ci-dessus.
source d'informationauteur andy
Vous devez vous connecter pour publier un commentaire.
Essayer en ajoutant ceci à votre site Web.Config.
Pour donner IIS autorisation pour démarrer/arrêter un service particulier:
subinacl /service {yourServiceName} /grant=IIS_WPG=F
Cela donne le plein contrôle du service des droits pour ce service en particulier le groupe IIS_WPG. (Cela fonctionne pour IIS6 /Win2k3.) YMMV pour les nouvelles versions de IIS.)
C'était une bonne question qui m'a intrigué...
Voici donc ce que j'ai fait pour résoudre ce problème:
Étape 3: Utiliser l'emprunt d'identité pour usurper l'identité de l'utilisation créé à l'Étape 1 pour démarrer et arrêter le Service
Mise à jour pour IIS 8 (et peut-être un petit peu des versions antérieures)
Le groupe d'utilisateurs IIS_WPG n'existe plus. Il a changé de IIS_IUSRS.
Aussi, de commencer à arrêter un service, il n'est pas nécessaire de donner des autorisations complètes (F). Les autorisations pour démarrer, arrêter ou mettre en pause un service (en HAUT) devrait être suffisant. Comme telle, la commande doit être:
Noter que vous devez pointer l'invite de commande (de préférence élevée pour exécuter en tant qu'administrateur) pour
C:\Windows\System32
Dossier avant d'exécuter cette commande.Assurez-vous également que vous avez copié l'subinacl.exe fichier
C:\Windows\System32
dans le répertoire d'installation si il y a une erreur.Juste une intuition, mais il ne semble pas pour moi l'erreur est nécessairement liée à la sécurité. Avez-vous donner le service du même nom sur le serveur de production?
Si votre application web est la base de données et service windows peut y accéder, il vous suffit d'utiliser le drapeau dans la base de données pour redémarrer le service. Dans le service, vous pouvez lire ce drapeau et le redémarrer si pas occupé etc. Seulement dans le cas où si vous pouvez modifier le code de service.
Si c'est un tiers de service, vous pouvez créer votre propre service de windows et de l'utilisation de la base de données configuration de contrôle (redémarrer). C'est la manière la plus sûre et vous donne beaucoup plus de flexibilité et de sécurité.