2012-08-30 17 views
12

Ho questo codice che esegue uno script PowerShell se il servizio è in corso o interrotto.Lo stato di ServiceController non riflette correttamente lo stato attuale del servizio

Timer timer1 = new Timer(); 

ServiceController sc = new ServiceController("MyService"); 

protected override void OnStart(string[] args) 
    { 
     timer1.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
     timer1.Interval = 10000; 
     timer1.Enabled = true; 
    } 

    private void OnElapsedTime(object source, ElapsedEventArgs e) 
    { 
     if ((sc.Status == ServiceControllerStatus.StartPending) || (sc.Status == ServiceControllerStatus.Stopped)) 
     { 
      StartPs(); 
     } 
    } 

    private void StartPs() 
    { 
     PSCommand cmd = new PSCommand(); 
     cmd.AddScript(@"C:\windows\security\dard\StSvc.ps1"); 
     PowerShell posh = PowerShell.Create(); 
     posh.Commands = cmd; 
     posh.Invoke(); 
    } 

Sta funzionando bene quando ho ucciso mio servizio da cmd prompt dei Ma anche se il mio servizio è attivo e funzionante, lo script PowerShell continua l'esecuzione in sé (si aggiunge un file sul computer) Qualsiasi idea del perché?

+0

Sarebbe corretto dire che PowerShell è ortogonale a questa domanda e la domanda * real * è: perché il mio controllo 'StartPending' /' Stopped' non funziona correttamente? –

+0

Hai provato a inserire dei punti di interruzione per vedere cosa sta succedendo esattamente? –

risposta

28

La proprietà ServiceController.Statusnon è sempre attiva; è pigramente valutato la prima volta che viene richiesto, ma (se non richiesto) solo; le query successive a Statusnon corrispondono a in genere per verificare il servizio effettivo. Per forzare questo, aggiunge:

sc.Refresh(); 

prima del check .Status:

private void OnElapsedTime(object source, ElapsedEventArgs e) 
{ 
    sc.Refresh(); 
    if (sc.Status == ServiceControllerStatus.StartPending || 
     sc.Status == ServiceControllerStatus.Stopped) 
    { 
     StartPs(); 
    } 
} 

Senza che sc.Refresh(), se fosse Stopped (per esempio), inizialmente, sarà sempre dire Stopped.

+2

Grazie per quello; E 'piuttosto noioso e antipatico ... – Will

+0

Ugh! Seriamente, Microsoft? Perché non creare un aggiornamento nella chiamata 'Status' stessa (come probabilmente finirò per fare me stesso) ?? O almeno avere un metodo 'Status.Refresh' per renderlo ovvio. – SteveCinq

+1

Wow Man !! @ Marc Hai fatto il mio giorno. Non è ovvio capire che dobbiamo chiamare sc.Refresh() per essere sicuri dello stato più recente. –

Problemi correlati