Подтвердить что ты не робот

Статус ServiceController неправильно отражает фактический статус службы

У меня этот код работает с powershell script, если моя служба запускается или останавливается.

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 script продолжает выполнять сам (он добавляет файл на компьютер) Любая идея почему?

4b9b3361

Ответ 1

Свойство 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.