Windows服务在启动时抛出“System.ComponentModel.Win32Exception:Access被拒绝”

时间:2013-11-18 18:27:58

标签: c# windows-services

客户报告了他们无法启动我们服务的问题。浏览日志,我可以看到很多System.ComponentModel.Win32Exception: Access is denied例外:

System.InvalidOperationException: Cannot open *ServiceName* service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied
    at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
    at System.ServiceProcess.ServiceController.Start(String[] args)
    at BackupStack.InterApp.ServiceStarter.startService(Boolean useShellExec)
Cannot open BackupStack service on computer '.'.
    at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
    at System.ServiceProcess.ServiceController.Start(String[] args)
    at BackupStack.InterApp.ServiceStarter.startService(Boolean useShellExec)
System.ComponentModel.Win32Exception: Access is denied
Access is denied

要检查的显而易见的事情是用户有权启动该服务。他们是行政组织。当他们尝试从我们的应用程序启动服务时,他们会被UAC提示,但没有任何反应。它无法启动。

附注:我们的应用程序提供了一种在未运行时重新启动/重新安装服务的方法。我们使用ProcessStartInfo.Verb = "runas"来提升启动服务的过程。

他们无法从services.msc以及我们的应用程序启动服务。

我唯一的其他线索是他们在对话框中报告了这个错误:

  

错误1053:服务未及时响应启动或控制请求。

我们的服务在Local System Account下运行,目标是.NET 2.0

有没有人有任何想法我可以检查以了解它可能失败的地方?我相信他们有正确的权限,但我可能错了。如果有人知道要检查的所有地方,那也将不胜感激。

1 个答案:

答案 0 :(得分:2)

“服务没有及时响应启动或控制请求”消息通常是由服务的“OnStart”方法完成所需的时间太长(通常为20或30秒)。如果你将太多的启动代码放入该方法 - 即网络访问代码,数据库访问代码 - 这是一个非常正常的响应。当您尝试从数据库初始化某些内容并且数据库未准备好或响应太慢时,通常会发生这种情况。我会检查是否已启动并运行任何相关服务。

使用管理员权限提升的流程权限,他们应该能够启动/停止任何服务。但是,根据服务内部的失败,这仍然可能是“次要”错误代码......