Come faccio a installare un servizio di Windows che viene eseguito come un amministratore?
-
04-10-2019 - |
Domanda
ho scritto un programma di installazione che installa un servizio di Windows (A) che ha bisogno di start / stop un altro servizio (B). Tuttavia, quando un tenta di start / stop B, ottengo questa eccezione:
System.InvalidOperationException: Impossibile servizio MyService aperta nel computer ''. ---> System.ComponentModel.Win32Exception: Accesso negato
Il programma di installazione consente di installare il servizio come un servizio locale, e richiede diritti di amministratore attraverso l'UAC pop-up, che mi concedo. Ho anche aggiunto un file app.manifest al servizio che è impostato per chiedere diritti di amministratore:
Ma io sto ancora ricevendo questo errore.
Questo è il modo di iniziare il servizio (arresto è lo stesso, tranne che chiama Stop, ovviamente):
using (Mutex mutex = new Mutex(false, "MyServiceLock"))
{
mutex.WaitOne();
if (ServiceExists(serviceName) == true)
{
using (ServiceController serviceController = new ServiceController(serviceName, "."))
{
serviceController.Start(); // this line throws the exception
}
}
mutex.ReleaseMutex();
}
Perché l'accesso a questo servizio potrebbe essere negato?
Soluzione
Un servizio non può chiedere un controllo account utente. Sembra a me che il prompt UAC che descrivi è effettivamente richiesto dal programma di installazione, non il servizio. Servizi eseguiti con un account molto privilegiata già, LocalSystem per impostazione predefinita. Facciamo in modo che si configura il servizio per utilizzare un account come privilegiati, non un account utente limitato.
Altri suggerimenti
Come un test rapido, se si apre fino services.msc
e controllare il vostro server per "Esegui come" e immettere le credenziali, non l'errore di andare via? Può essere che il LocalService non ha accesso per arrestare altri servizi. Fornire il prompt UAC è permesso probabilmente solo consente di installare il servizio in primo luogo, non dicendogli di eseguire come amministratore.