我们的服务器上运行着一套 Windows 服务,它们彼此独立地执行一系列自动化任务,但有一个服务除外,它负责管理其他服务。
如果某个服务无法响应或挂起,该服务将尝试重新启动该服务,如果在尝试过程中抛出异常,则向支持团队发送电子邮件,以便他们自己重新启动该服务。
经过一番研究,我发现了一些“解决方案”,其中包括KB907460赋予运行该服务的帐户管理员权限。
我对这两种方法都不满意——我不了解微软知识库文章中概述的第一种方法的后果,但我绝对不想让管理员访问服务正在运行的帐户。
我快速浏览了本地安全策略,除了定义帐户是否可以作为服务登录的策略之外,我看不到任何其他看起来像是涉及服务的内容。
我们在 Server 2003 和 Server 2008 上运行它,因此,非常欢迎您提供任何想法或指点!
澄清:我不想授予特定用户或组启动/停止/重新启动所有服务的权限 - 我希望能够授予执行这些操作的权限具体的仅向特定用户或群组提供服务。
进一步澄清:我需要授予这些权限的服务器不属于域 - 它们是两个面向互联网的服务器,它们接收文件、处理文件并将其发送给第三方,同时为几个网站提供服务,因此无法使用 Active Directory 组策略。抱歉,我没有说清楚。
答案1
除非您加入域,否则似乎没有基于 GUI 的方法可以执行此操作 - 至少我在任何地方都找不到 - 所以我做了更多的挖掘,找到了适合我们情况的答案。
我不明白知识库文章中的字符串表示是什么意思,但经过一番挖掘,我发现它是 SDDL 语法。进一步挖掘后,我发现本文由 Alun Jones 撰写它解释了如何获取服务的安全描述符以及每个位的含义。微软 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:(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
然后使用以下命令(文本之前)将其应用于服务S:
:
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 定义的用户查询其状态。
答案2
我刚刚遇到了同样的问题。
你可以使用子程序ACL来自资源工具包。在此处下载独立实用程序:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23510
msiexec /a PathToMSIFile /qb TARGETDIR=DirectoryToExtractTo
如果您不想安装 .msi, 请使用提取文件
- 打开命令提示符行政人员
- 转到放置 .exe 的目录
- 跑步
subinacl /service SERVICE_NAME /grant=COMPUTER_NAME\USERNAME=TOP
T = 启动服务
O = 停止服务
P = 暂停/继续服务
完整参考:如何授予用户在 Windows 2000 中管理服务的权限
或输入subinacl /help
笔记:不要尝试subinacl /service SERVICE_NAME /perm
,因为这可能会给你带来麻烦(吸取教训 :P)。名称可能会产生误导(perm != permission),因为它会删除所有用户(甚至是管理员!)的所有权限。
答案3
您正在寻找计算机配置 - 策略 - Windows设置 - 安全设置 - 系统服务
您不仅可以定义服务启动类型,还可以为每个服务配置安全 ACL。默认情况下,界面将仅列出您运行 GP 编辑器的机器上安装的服务。
要添加仅存在于另一台机器上的服务:
- 从另一台机器导出服务的注册密钥
- 在 gpedit 机器上导入
- 应用策略
- 删除导入的密钥
答案4
我想推荐 3 个选项作为解决方案。
我知道这是一个老问题,但问题中提出的挑战仍然存在(即使在更高版本的 Windows 上)。而且提供的一些答案已经过时,有些不再有效(或提供的工具不再存在)。
首先,MikeKullis 在上面评论了“CoreTech gui”,但我没有看到任何其他答案或评论详细说明他的意思。它被称为安全服务编辑,而且是免费的。该公司 (CoreTech) 制作了多种工具来帮助完成 Windows 管理任务。
我知道有些人会对安装任何工具持怀疑态度或犹豫不决,但实际上对于轻松指示给定用户应有权启动/停止特定服务的特定任务而言,它是最简单的解决方案。只需单击几下,就会出现一个类似于传统 Windows 文件权限编辑器的 UI,但它用于控制服务权限(针对特定服务、针对特定用户 - 并提供相同的 UI 来“添加”用户、使用“查找”功能查看计算机上的用户列表等)。
其次,对于更“内置”的解决方案,可以将“安全模板”添加到 mmc,然后执行相同操作。这有点繁琐,但远不及其他一些 cli 解决方案。请参阅各种帖子中关于使用它的讨论(以及许多其他选项,包括此处的答案和评论中也提到的一些选项),例如这。
第三,也是最后一点,如果有人可能至少更喜欢使用“MS”工具,请注意该博客文章(和其他文章)如何讨论使用 Sysinternals 工具进程探索器,它还可以提供简单的权限 UI,以控制给定用户对给定服务的启动/停止权限。一个适度的缺点是服务必须正在运行(因为您随后使用 ProcExp 查找该服务的进程,并使用属性功能获取它随后提供的“服务”选项卡)。对于某些人来说,这可能胜过上述两个选项中的任何一个。
但和上面的 Mike 一样,我更喜欢 CoreTech SSE 工具。它免费、简单,而且在我几十个工作站和服务器上的使用中,它被证明是安全有效的。
希望以上内容可以帮助其他遇到此问题的人。