2012-08-30 13 views
12

サービスが開始または停止している場合は、このコードでpowershellスクリプトを実行しています。ServiceControllerステータスが実際のサービスステータスを正しく反映していない

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(); 
    } 

私はCMDプロンプト から私のサービスを殺すとき、それは正常に動作しています。しかし、私のサービスが稼働している場合でも、PowerShellスクリプト自体を実行し続けて(それは、コンピュータ上のファイルを追加) 任意のアイデアなぜですか?

+0

powershellはこの質問とは正反対であり、*本物の*質問は、なぜ私の 'StartPending' /' Stopped'チェックが正しく動作しないのでしょうか? –

+0

正確に何が起こっているかを見るためにブレークポイントを入れてみましたか? –

答えて

28

ServiceController.Statusプロパティは、常にライブであるとは限りません。;初めて要求されたときに怠惰に評価されますが(要求されない限り)その時; Statusへのその後のクエリでは、は実際のサービスを通常は確認しません。

sc.Refresh(); 

をご.Statusチェックする前に:追加、これを強制的に

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

そのsc.Refresh()がなければ、それは(例えば)Stoppedした場合、最初は、それは常にStoppedを言うだろう。

+2

ありがとうございました。それはとてもかっこ悪いです... – Will

+0

ああ!真剣に、Microsoft?どうして私はおそらく自分自身をやってしまうのでしょうか?あるいは少なくとも、それを明白にする 'Status.Refresh'メソッドを持っています。 – SteveCinq

+1

ワウマン!!あなたは私の一日を作った。最新の状態を確認するためにsc.Refresh()を呼び出さなければならないことを理解することは明らかではありません。 –

関連する問題