ServiceController.start()和ServiceController.stop()抛出异常?

时间:2011-02-22 21:58:31

标签: asp.net vb.net windows-services

以下代码抛出异常。我没有弄到我在代码中犯的错误。有人可以帮我搞清楚吗。我认为这是一些担保权问题。如果是这样,我如何赋予任何用户或应用程序安全权限以编程方式访问此Windows服务?

Dim sc As New ServiceController        
sc.ServiceName = "DataLoad"   
If sc.Status = ServiceControllerStatus.Stopped Then     
    sc.Start()    
Else  
    sc.Stop()  
End If

异常

System.InvalidOperationException: Cannot open DataLoad service on computer '.'. --->
System.ComponentModel.Win32Exception: Access is denied --- End of inner exception stack trace --- at
System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) at
System.ServiceProcess.ServiceController.Start(String[] args) at
System.ServiceProcess.ServiceController.Start() at
WEBSITE.DataLoad.Submit1_ServerClick(Object sender, EventArgs e) in C:\Inetpub\wwwroot\WEBSITE\a\DataLoad.aspx.vb:line 46

谢谢!

5 个答案:

答案 0 :(得分:2)

您可以使用subinacl工具

SUBINACL /SERVICE \\MachineName\ServiceName /GRANT=[DomainName\]UserName[=Access] 

为你的案件做准备:

subinacl /service DataLoad /GRANT=YOURDOMAIN\[User in appdomain for WEBSITE]=TO

其中TO表示
   T:开始服务
   O:停止服务

[访问]的所有选项均为:

F:完全控制
   R:通用读取
   W:通用写入    X:通用eXecute
   L:读取控制权    问:查询服务配置
   S:查询服务状态
   E:列举从属服务
   C:服务变更配置
   T:开始服务
   O:停止服务
   P:暂停/继续服务
   I:讯问服务
   U:服务用户定义的控制命令

请参阅Method 3 in this kb article

答案 1 :(得分:1)

我通过在ServiceController重载构造函数中提供当前正在执行服务的机器的机器名来找到解决此问题的方法,该构造函数需要2(2)个参数,即 public ServiceController(/ 我的服务名称字符串 /,System.Environment.MachineName / 正在执行服务的这台机器 /)

此解决方案的测试版本是4.5,希望这有助于任何人仍在寻找解决方案。

以下是您需要在代码中执行的操作:

ServiceController serviceController = new ServiceController("myServiceName", System.Environment.MachineName);

答案 2 :(得分:1)

GetServiceHandle需要一些访问权限。如果以管理员用户身份运行它,但不是普通用户,那么本文可能会有所帮助。

它清楚地向您展示了如何手动授予Windows用户启动和停止服务的权限(或设置其他权限):

http://thommck.wordpress.com/2011/12/02/how-to-allow-non-admins-to-start-and-stop-system-services/

答案 3 :(得分:1)

在我的情况下,我确定我需要调整我的服务的安全性,以允许它由一个单独的"看门狗"重新启动。服务如果我的服务失败。

首先,打开mmc.exe,然后添加"安全配置和分析"和安全模板"管理单元。

enter image description here

然后从"安全模板"创建一个新的空白安全模板。 item,给它起一个名字,点击OK将它保存在本地磁盘驱动器上方便的地方。

然后打开"安全配置和分析"并选择"打开数据库...",为其命名,并将其保存在与上一步相同的目录中。当一个"导入模板"出现窗口,打开同一目录中的* .inf文件。

接下来,右键单击"安全配置和分析"并选择"分析计算机..."将出现以下内容:

enter image description here

双击"系统服务",找到并双击您的服务,然后单击复选框"在数据库中定义此策略"并点击"编辑安全性"按钮。

这与我在使用Windows 8.1后发布的@JOG链接中所描述的不同 - 我已启用"启动,停止和暂停" for" INTERACTIVE"和"服务"

enter image description here

仅供参考,我按照@JOG的建议,按照本指南执行了上述操作:https://thommck.wordpress.com/2011/12/02/how-to-allow-non-admins-to-start-and-stop-system-services/

答案 4 :(得分:-1)

如果您已将服务用户作为LocalSystem(高权限用户),则问题不在于安全性。此外我之前遇到过这个问题,它的状态是再次启动它,或者当已经命令停止()时停止它。

您看到服务状态未按需更改,因此即使您已编码

//this will start the process but the 
//sc status will take some time to change
//when that happens and you try to start 
//the already started service it will give you 
//your error
servicec.start();

所以你需要这样做: msdn ServiceController.waitforstatus

 Dim sc As New ServiceController
     sc.ServiceName = "DataLoad"   
If sc.Status = ServiceControllerStatus.Stopped     Then     
    sc.Start()    
 // this makes it wait for the status to change
  // and no it wont slow down anything at all. 
sc.waitforstatus(ServiceControllerStatus.started)
Else  
    sc.Stop()
sc.waitforstatus(ServiceControllerStatus.stopped)
End If

这将像我一样解决你的问题。