Ecco il mio Windows pila/protezione di .NET:Come avviare/arrestare un servizio Windows da un'applicazione ASP.NET - Sicurezza emette
- un servizio di Windows in esecuzione come LocalSystem su una macchina Windows Server 2003.
- un sito web NET 3.5 in esecuzione sulla stessa macchina, in "default" server di produzione IIS impostazioni (quindi probabilmente come utente NETWORKSERVICE?)
Sul mio ambiente predefinito VS2008 DEV Ho questo un metodo, che ottiene chiamato dalla app ASP.NET, che funziona bene:
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);
}
}
}
Quando eseguo questo sul server di produzione, ottengo il seguente errore dal ServiceController:
Sourc e: System.ServiceProcess -> System.ServiceProcess.ServiceController -> IntPtr GetServiceHandle (Int32) -> System.InvalidOperationException Messaggio: Impossibile aprire il servizio eTimeSheetReminderService sul computer ".".
Perché sta succedendo e come lo risolvo?
EDIT:
La risposta è al di sotto, per lo più nei commenti, ma per chiarire:
- Il problema era legato di sicurezza, e si è verificato perché l'account NetworkService non ha diritti sufficienti per Avviare/interrompere un servizio
- ho creato un account utente locale, e ha aggiunto al gruppo PowerUsers (questo gruppo ha i diritti di amministratore quasi)
- non voglio Tutta la mia app Web per impersonare quell'utente in ogni momento, quindi impersono solo nel metodo in cui manipolo il servizio. Lo faccio utilizzando le seguenti risorse per aiutarmi a fare nel codice:
MS KB article e this, just to get a better understanding
NOTA: Non impersonate tramite web.config, lo faccio in codice. Vedere l'articolo MS KB sopra.
Che tipo di eccezione era? Un 'System.InvalidOperationException'? – Phaedrus
@Phaedrus: hey, si, si lo era. Ho inserito ulteriori informazioni sull'errore nella mia modifica. evviva – andy