尝试从Windows应用程序启动Windows服务,给出System.ComponentModel.Win32Exception:访问被拒绝

时间:2010-12-10 10:18:51

标签: c# system.componentmodel servicecontroller

我正在尝试开发一个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();
}
}

1 个答案:

答案 0 :(得分:3)

尝试leppie在评论中提出的建议,如果它不起作用你需要告诉我们哪一行抛出异常 - 当你创建ServiceController时,当你试图启动它或其他地方时。

顺便说一下,如果服务暂停,你不应该调用sc.Start(),你应该调用sc.Continue()。

此外,最好使用使用构造而不是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只有Dispose是多余的 - 关闭文档:断开这个ServiceController实例与服务的连接并释放实例的所有资源分配的。)

修改alt text

在资源管理器中右键单击您的exe文件,然后选择以管理员身份运行。在Windows 7中,除非您关闭了UAC(用户访问控制),否则在您明确请求/或要求您这样做之前,您不会以管理员身份运行程序。