如何从ASP.NET应用程序启动/停止Windows服务 - 安全问题

and*_*ndy 14 asp.net security impersonation windows-services

这是我的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在生产服务器上运行它时,我从ServiceController收到以下错误:

源:System.ServiceProcess - > System.ServiceProcess.ServiceController - > IntPtr GetServiceHandle(Int32) - > System.InvalidOperationException消息:无法在计算机'.'上打开eTimeSheetReminderService服务.

为什么会发生这种情况,我该如何解决?

编辑:

答案如下,主要是评论,但澄清:

  1. 问题与安全相关,并且是因为NETWORKSERVICE帐户没有足够的权限来启动/停止服务
  2. 我创建了一个本地用户帐户,并将其添加到PowerUsers Group(该组几乎拥有管理员权限)
  3. 我不希望我的整个Web应用程序一直冒充该用户,所以我只在我操纵服务的方法中冒充.我通过使用以下资源来帮助我在代码中执行此操作:

MS KB文章这个,只是为了更好地理解

注意:我没有通过web.config模拟,我在代码中执行.请参阅上面的MS KB文章.

Mar*_*ATS 13

授予IIS启动/停止特定服务的权限:

  • 下载并安装Subinacl.exe.(一定要获得最新版本!在某些资源包中分发的早期版本不起作用!)
  • 发出类似于的命令: subinacl /service {yourServiceName} /grant=IIS_WPG=F

这将为该特定服务授予对内置IIS_WPG组的完整服务控制权限.(这适用于IIS6/Win2k3.)YMMV适用于较新版本的IIS.)


Pha*_*rus 6

尝试将此添加到您的Web.Config.

<identity impersonate="true"/>
Run Code Online (Sandbox Code Playgroud)