这是我的Windows/.NET安全性堆栈:
- 在Windows Server 2003上以LocalSystem身份运行的Windows服务。
- 在同一台机器上运行的.NET 3.5网站,在“默认”生产服务器IIS设置下运行(所以可能是NETWORKSERVICE用户?)
在我的默认VS2008 DEV环境中,我有这个方法,从ASP.NET应用程序调用它,它工作正常:
private static void StopStartReminderService() {
ServiceController svcController = new ServiceController("eTimeSheetReminderService");
if (svcController != null) {
try {
svcController.Stop();
svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
svcController.Start();
} catch (Exception ex) {
General.ErrorHandling.LogError(ex);
}
}
}
当我在生产服务器上运行时,从ServiceController中得到以下错误:
来源:System.ServiceProcess -> System.ServiceProcess.ServiceController -> IntPtr GetServiceHandle(Int32) -> System.InvalidOperationException 消息: 无法在此计算机上打开eTimeSheetReminderService服务。
为什么会发生这种情况,如何解决?
编辑:
答案在下面,主要在评论中,但为了澄清:
- 该问题与安全有关,并且是由于NETWORKSERVICE帐户没有足够的权限来启动/停止服务而发生的
- 我创建了一个本地用户帐户,并将其添加到PowerUsers组(该组具有几乎管理员权限)
- 我不想让整个Web应用程序一直模拟该用户,所以我只在操作服务的方法中模拟。我通过使用以下资源来帮助我在代码中完成这个过程:
注意:我不是通过web.config进行模拟,而是在代码中完成的。请参见上面的MS KB文章。