16

サービスが開始または停止している場合、このコードでpowershellスクリプトを実行しています。

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スクリプトは引き続き実行されます(コンピューターにファイルを追加します)理由は?

4

1 に答える 1

39

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

于 2012-08-30T08:03:03.520 に答える