Попытка начать службу Windows из приложения Windows, предоставив System.comPonentModel.Win32Exception: доступ запрещен
-
08-10-2019 - |
Вопрос
Я пытаюсь разработать приложение 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 () самостоятельно (кстати, вам нужно позвонить близко только утилизацию - документация для закрытия: отключить этот экземпляр сервисного контроля от службы и освобождает все ресурсы, которые выделены экземпляром.)
РЕДАКТИРОВАТЬ:
Щелкните правой кнопкой мыши на вашем файле EXE в Explorer и выберите «Беги» в качестве администратора. В Windows 7, если у вас нет UAC (Control Access Control) отключился, вы не выполняете программы в качестве администратора, пока вы не обратитесь к чему-либо запросу / или вас.