windows – 如何将服务的启动/停止/重新启动权限授予非域成员服务器上的任意用户或组?

我们的服务器上运行着一套 Windows服务,它们彼此独立地执行一系列自动化任务,但只有一项服务可以管理其他服务.

如果其中一个服务无法响应或挂起,则此服务会尝试重新启动服务,如果在尝试期间抛出异常,则会向支持团队发送电子邮件,以便他们可以自行重新启动服务.

做了一些研究之后,我遇到了一些“解决方案”,其范围从KB907460中提到的解决方法到提供服务运行管理员权限的帐户.

我对这两种方法都不满意 – 我不明白Microsoft知识库文章中概述的第一种方法的后果,但我绝对不希望管理员访问运行该服务的帐户.

我已经快速浏览了本地安全策略,除了定义帐户是否可以作为服务登录的策略之外,我看不到任何看起来像服务的东西.

我们在Server 2003和Server 2008上运行它,所以任何想法或指针都会得到慷慨接受!

澄清:我不想授予启动/停止/重新启动给定用户或组的所有服务的能力 – 我希望能够仅授予给定用户或组的特定服务的权限.

进一步澄清:我需要授予这些权限的服务器不属于域 – 它们是两个面向互联网的服务器,它们接收文件,处理它们并将它们发送给第三方,以及服务几个网站,所以无法使用Active Directory组策略.对不起,我没有说清楚.

似乎没有基于GUI的方式来做到这一点,除非你加入了一个域 – 至少没有一个我可以在任何地方找到的 – 所以我做了一些挖掘,我找到了一个适用于我们的坐姿.

我不明白知识库文章中字符串表示的含义,但进行一些挖掘让我发现它是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)

如果一切按计划进行,则可以启动,停止,暂停服务,并由上面的SID定义的用户查询其状态.

相关文章

Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...
Windows文件操作基础代码 Windows下对文件进行操作使用的一段...
Winpcap基础代码 使用Winpcap进行网络数据的截获和发送都需要...
使用vbs脚本进行批量编码转换 最近需要使用SourceInsight查看...