这是我的 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 知识库文章。