2

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

1 回答 1

3

尝试 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 Dispose 是多余的 - 关闭文档:将此 ServiceController 实例与服务断开连接并释放实例分配的所有资源。)

编辑替代文字

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

于 2010-12-10T11:33:32.620 回答