Попытка начать службу Windows из приложения Windows, предоставив System.comPonentModel.Win32Exception: доступ запрещен

StackOverflow https://stackoverflow.com/questions/4407796

Вопрос

Я пытаюсь разработать приложение Windows для запуска / остановки и монитора состояния двух конкретных услуг.

Проблема в том, что я получаю

System.comPonentModel.Win32Exception: доступ запрещен

Обратите внимание, что оба сервиса являются локальной системой

Ниже приведен мой код

private void StartService(string WinServiceName)
{
  ServiceController sc = new ServiceController(WinServiceName,".");
try
{
  if (sc.ServiceName.Equals(WinServiceName))
  {
  //check if service stopped
    if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
    {
       sc.Start();
    }
    else if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Paused))
    {
        sc.Start();
    }
  }

}
catch (Exception ex)
{
  label3.Text = ex.ToString();
  MessageBox.Show("Could not start " + WinServiceName + "Service.\n Error : " + ex.ToString(), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
   sc.Close();
   sc.Dispose();
   // CheckStatus();
}
}
Это было полезно?

Решение

Попробуйте то, что leppie предложил в своем комментарии, если это не работает, вам нужно сказать нам, какую строку бросает исключение - когда вы создаете ServiceController, когда вы пытаетесь начать его или где-то еще.

Кстати, вы не должны вызывать SC.Start (), если сервис приостановлен, вы должны позвонить SC.Continue ().

Кроме того, это, вероятно, лучше использовать идею с использованием построить, чем попробуйте / Наконец, как это:

private void StartService(string WinServiceName)
{
    try
    {
        using(ServiceController sc = new ServiceController(WinServiceName,"."))
        {
            if (sc.ServiceName.Equals(WinServiceName))
            {
                //check if service stopped
                if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
                {
                   sc.Start();
                }
                else if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Paused))
                {
                    sc.Continue();
                }
            }
        }
    }
    catch (Exception ex)
    {
        label3.Text = ex.ToString();
        MessageBox.Show("Could not start " + WinServiceName + "Service.\n Error : " + ex.ToString(), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Таким образом, вам не нужно вызывать sc.lose () самостоятельно (кстати, вам нужно позвонить близко только утилизацию - документация для закрытия: отключить этот экземпляр сервисного контроля от службы и освобождает все ресурсы, которые выделены экземпляром.)

РЕДАКТИРОВАТЬ: alt text

Щелкните правой кнопкой мыши на вашем файле EXE в Explorer и выберите «Беги» в качестве администратора. В Windows 7, если у вас нет UAC (Control Access Control) отключился, вы не выполняете программы в качестве администратора, пока вы не обратитесь к чему-либо запросу / или вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top