Попытка запустить службу Windows из приложения Windows, дающего System.ComponentModel.Win32Exception: Доступ запрещен

Я пытаюсь разработать приложение 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();
}
}

person IanCian    schedule 10.12.2010    source источник
comment
У вас будет то же самое, если вы запустите под администратором?   -  person leppie    schedule 10.12.2010
comment
Я нахожусь в учетной записи администратора ПК   -  person IanCian    schedule 10.12.2010
comment
Нет, я имел в виду запуск с повышенными привилегиями. Щелкните правой кнопкой мыши, запустите от имени администратора.   -  person leppie    schedule 10.12.2010


Ответы (1)


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

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

Кроме того, вероятно, лучше использовать конструкцию using, чем try/finally, например:

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.Close() самостоятельно (кстати, вам нужно вызывать только Close).

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

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

person Mihailo    schedule 10.12.2010
comment
привет михайло, спасибо за ваши предложения. до сих пор они мне нравились :) программа выдает ошибку, когда дело доходит до sc.Start(); - person IanCian; 10.12.2010
comment
просто чтобы убедиться, как я могу проверить, работаю ли я под администратором. (я знаю, что я в учетной записи администратора, но, похоже, у меня нет полного доступа) - person IanCian; 10.12.2010
comment
какой sc.Start() ? у вас есть два :) - если вы запускаете свое приложение в Windows 7 или Vista, вам, возможно, придется щелкнуть правой кнопкой мыши свое приложение, и должна быть возможность запустить его от имени администратора (это связано с UAC, представленным в Vista) - если вы используете Win XP, вы запускаете все как администратор, если вы находитесь в группе администраторов. - person Mihailo; 10.12.2010
comment
Я работаю в Windows 7 и говорю о первом sc.Start(); - person IanCian; 10.12.2010
comment
Установил приложение и запустил установку от имени администратора. вдруг он начинает нормально работать. 10x за вашу помощь. Все еще есть способ избежать этого? - person IanCian; 10.12.2010
comment
Я не знаю, извините, есть способ попросить пользователя запустить программу от имени администратора, но я не знаю, я не занимаюсь разработкой Win 7, я просто использую Win 7 - person Mihailo; 10.12.2010
comment
@IanCian: Посмотрите на app.config, там есть комментарий, позволяющий приложению запрашивать повышенные привилегии. - person leppie; 10.12.2010