我正在尝试开发一个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();
}
}
答案 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实例与服务的连接并释放实例的所有资源分配的。)
修改强>:
在资源管理器中右键单击您的exe文件,然后选择以管理员身份运行。在Windows 7中,除非您关闭了UAC(用户访问控制),否则在您明确请求/或要求您这样做之前,您不会以管理员身份运行程序。