如果其中一个服务无法响应或挂起,则此服务会尝试重新启动服务,如果在尝试期间抛出异常,则会向支持团队发送电子邮件,以便他们可以自行重新启动服务.
做了一些研究之后,我遇到了一些“解决方案”,其范围从KB907460中提到的解决方法到提供服务运行管理员权限的帐户.
我对这两种方法都不满意 – 我不明白Microsoft知识库文章中概述的第一种方法的后果,但我绝对不希望管理员访问运行该服务的帐户.
我已经快速浏览了本地安全策略,除了定义帐户是否可以作为服务登录的策略之外,我看不到任何看起来像服务的东西.
我们在Server 2003和Server 2008上运行它,所以任何想法或指针都会得到慷慨接受!
澄清:我不想授予启动/停止/重新启动给定用户或组的所有服务的能力 – 我希望能够仅授予给定用户或组的特定服务的权限.
进一步澄清:我需要授予这些权限的服务器不属于域 – 它们是两个面向互联网的服务器,它们接收文件,处理它们并将它们发送给第三方,以及服务几个网站,所以无法使用Active Directory组策略.对不起,我没有说清楚.
我不明白知识库文章中字符串表示的含义,但进行一些挖掘让我发现它是SDDL语法.进一步的挖掘使我得到了this article by Alun Jones,它解释了如何获得服务的安全描述符以及每个位的含义. MS KB914392有更多细节.
要附加到服务的现有安全描述符,请使用sc sdshow“Service Name”获取现有描述符.如果这是一个普通的旧.NET Windows服务 – 就像我们的情况一样 – 安全描述符应如下所示:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA ;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
我们需要授予权限RP(启动服务),WP(停止服务),DT(暂停/继续服务)和LO(查询服务的当前状态).这可以通过将我们的服务帐户添加到Power Users组来完成,但我只想授予对运行维护服务的帐户的单独访问权限.
使用runas在服务帐户下打开命令提示符,我运行了whoami / all,它给了我服务帐户的SID,然后构建了下面的附加SDDL:
(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)
然后将其添加到上面SDDL字符串的D:部分:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSWRPWPDTLOC RSDRCWDWO;;;WD)
然后使用sc sdset命令将其应用于服务:
sc sdset "Service Name" D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;; CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU )(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSW RPWPDTLOCRSDRCWDWO;;;WD)