默认情况下,普通(非管理员)用户无法管理 Windows 服务。这意味着用户无法停止、启动、重新启动或更改 Windows 服务的设置/权限。在某些情况下,用户需要具有重启或管理某些服务的权限。在本文中,我们将介绍几种管理 Windows 服务权限的方法。特别是,我们将向您展示如何通过授予适当的权限来允许非管理员用户启动、停止和重新启动特定的 Windows 服务。
假设,您需要授予域帐户contoso\tuser重新启动Print Spooler服务(服务名称 – spooler)的权限。当非管理员尝试重新启动服务时,会出现错误:
1 |
<span>发生系统错误 5。访问被拒绝。</span> |
Windows 中没有简单方便的内置工具来管理服务权限。我们将考虑一些方法来授予用户管理服务的权限:
使用 SC.exe(服务控制器)工具设置 Windows 服务权限
管理系统服务权限的标准内置 Windows 方法假设使用sc.exe(服务控制器)工具。使用此实用程序的主要问题是服务权限格式(SDDL格式 — 安全描述定义语言)的复杂语法。
您可以像这样以 SDDL 字符串的形式获取 Windows 服务的当前权限:
sc.exe sdshow Spooler

D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
(A;;CCLCSWRPWPDTLOCRRC;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
所有这些符号是什么意思?
1 2 |
<span>S: — 系统访问控制列表 (SACL)</span><span> D: — 自主 ACL (DACL)</span> |
括号后的第一个字母表示:允许(A)或拒绝(D)。
下一组符号是可分配的权限。
1 2 3 4 5 6 7 8 9 |
<span>CC — SERVICE_QUERY_CONFIG(请求服务设置)</span><span> LC — SERVICE_QUERY_STATUS(服务状态轮询)</span><span> SW — SERVICE_ENUMERATE_DEPENDENTS</span><span> LO — SERVICE_INTERROGATE</span><span> CR — SERVICE_USER_DEFINED_CONTROL</span><span> RC — READ_CONTROL</span><span> RP — SERVICE_START</span><span> WP — SERVICE_STOP</span><span> DT — SERVICE_PAUSE_CONTINUE</span> |
最后 2 个字符是被授予权限的对象(用户、组或 SID)。有一个预定义组列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<span>AU 认证用户</span><span> AO 账户运营商</span><span> RU 别名以允许以前的 Windows 2000</span><span> AN 匿名登录</span><span> AU 认证用户</span><span> BA 内置管理员</span><span> BG 内置客人</span><span> BO 备份运营商</span><span> BU 内置用户</span><span> CA 证书服务器管理员</span><span> CG创作组</span><span> CO 创建者所有者</span><span> DA 域管理员</span><span> DC 域计算机</span><span> DD 域控制器</span><span> DG域来宾</span><span> DU域用户</span><span> EA 企业管理员</span><span> ED 企业域控制器</span><span> WD 大家</span><span> PA 组策略管理员</span><span> IU 交互式登录用户</span><span> LA 本地管理员</span><span> LG本地客人</span><span> LS 本地服务帐号</span><span> SY 本地系统</span><span> NU网络登录用户</span><span> NO 网络配置操作符</span><span> NS网络服务帐号</span><span> PO 打印机操作员</span><span> PS个人自我</span><span> PU 电力用户</span><span> RS RAS 服务器组</span><span> RD 终端服务器用户</span><span> RE复制器</span><span> RC 限制代码</span><span> SA 架构管理员</span><span> SO 服务器操作员</span><span> SU 服务登录用户</span> |
您可以通过 SID 显式指定用户或组,而不是预定义的组。要获取当前用户的 SID,可以使用以下命令:
whoami /user
或者,您可以使用Get-ADUser cmdlet查找任何域用户的 SID :
Get-ADUser -Identity 'sadams' | select SID
您可以使用Get-ADGroup cmdlet获取AD 安全组的 SID :
Get-ADGroup -Filter {Name -eq "ny-ithelpdesk"} | Select SID
要为特定服务分配 SDDL 权限字符串,您可以使用sc sdset命令。例如,可以使用以下命令向用户授予权限:
sc sdset Spooler "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
使用 SubInACL 允许用户启动/停止/重启服务
使用来自 Sysinternals(Mark Russinovich)的命令行工具SubInACL来管理服务权限更容易。这个工具的语法更简单、更方便。以下是使用 SubInACL 授予服务重启权限的方法:
- 从此网页(https://www.microsoft.com/en-us/download/details.aspx?id=23510)下载subinacl.msi并将其安装在目标系统上;
- 在提升的命令提示符中,转到包含该工具的目录:
cd “C:\Program Files (x86)\Windows Resource Kits\Tools\"
- 运行命令:
subinacl.exe /service Spooler /grant=contoso\tuser=PTO
注意。在这种情况下,我们授予用户暂停(暂停/继续)、启动和停止(重新启动)服务的权限。可用服务权限的完整列表:
1234567891011121314<span>F : 完全控制</span><span>R : 通用读取</span><span>W : 通用写入</span><span>X : 通用执行</span><span>L : 读取控制</span><span>Q : 查询服务配置</span><span>S : 查询服务状态</span><span>E : 枚举依赖服务</span><span>C : 服务更改配置</span><span>T : 启动服务</span><span>O : 停止服务</span><span>P : 暂停/继续服务</span><span>I : 查询服务</span><span>U : 服务用户定义的控制命令</span>
如果您需要向在远程计算机上运行的服务授予权限,请使用 subinacl 命令的以下语法:
subinacl /SERVICE \\lon-prnt1\spooler /grant=contoso\tuser=F
- 现在您只需使用用户帐户登录计算机并尝试使用以下命令重新启动服务:
net stop spooler
net start spooler
或
sc stop spooler && sc start spooler
如果一切正常,服务应该会重新启动。
/revoke
subinacl.exe 工具的选项。例如:
subinacl.exe /service Spooler /revoke=contoso\tuser
如何使用 Process Explorer 更改 Windows 服务权限?
您可以使用另一种 Sysinternals 实用程序 – Process Explorer更改 Windows 服务权限。以管理员身份运行进程浏览器,找到你需要的服务的进程。在我们的示例中,这是spoolsv.exe(假脱机程序可执行文件 – C:\Windows\System32\spoolsv.exe
)。打开进程属性并单击服务选项卡。

单击权限按钮并在打开的窗口中添加用户或组。之后选择您要分配的权限(完全控制/写入/读取)。

使用 PowerShell 设置 Windows 服务权限
在 TechNet 库中,有一个单独的非官方 PowerShell 模块用于管理不同 Windows 对象的权限 – PowerShellAccessControl 模块(您可以在此处下载)。该模块还允许您管理服务权限。安装此模块并将其导入您的 PS 会话:
Import-Module PowerShellAccessControl
您可以像这样从 PowerShell获得特定 Windows 服务的有效权限:
Get-Service spooler | Get-EffectiveAccess -Principal corp\tuser
要允许非管理员用户启动和停止假脱机服务,请运行以下命令:
Get-Service spooler | Add-AccessControlEntry -ServiceAccessRights Start,Stop -Principal corp\tuser
使用安全模板管理服务权限
管理服务权限的可视化(但需要更多操作)图形方式是使用安全模板。打开mmc.exe控制台并添加安全模板管理单元。

创建一个新的安全模板(New Template)。

指定新模板的名称并转到“系统服务”部分。在服务列表中选择服务Print Spooler并打开其属性。
选择启动模式(自动)并单击编辑安全性。

使用“添加”按钮,添加要授予权限的用户帐户或组。在我们的例子中,启动、停止和暂停权限就足够了。

保存此模板。
如果你打开这个文件,你可以看到关于权限的信息是以前面提到的 SDDL 格式保存的。这样得到的字符串可以作为sc.exe命令的参数。
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[Service General Setting]
"Spooler",2,"D:AR(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;RPWPDTRC;;;S-1-5-21-3243688314-1354026805-3292651841-1127)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
现在,您只需使用安全配置和分析管理单元创建一个新数据库(开放数据库)并从文件Spooler User Rights.inf导入您的安全模板。

通过从上下文菜单中选择立即配置计算机选项来应用此模板。

现在您检查用户是否可以允许在非管理员帐户下管理 Print Spooler 服务。
如何授予用户使用 GPO 管理服务的权限?
如果您必须授予用户启动/停止服务多台服务器或域计算机的权限,使用组策略 (GPO) 功能会更容易:
- 创建一个新的 GPO 或编辑现有的 GPO,将其链接到具有计算机对象的必要 Active Directory 容器 (OU)。转到策略部分计算机配置 -> Windows 设置 -> 安全设置 -> 系统服务;
- 找到 Spooler 服务并像上述方法一样向用户授予权限。保存更改;
- 等待 GPO 应用到客户端计算机上,并确保已分配新的服务权限。
您更改了默认权限的所有服务的安全设置都存储在它们自己的注册表项HKLM\System\CurrentControlSet\Services\<servicename>\Security
中的 REG_BINARY 类型的Security参数中。
这意味着在其他计算机上设置服务权限的方法之一是导出/导入此注册表参数(包括通过 GPO)。
因此,我们研究了几种管理 Windows 服务权限的方法,这些方法允许您向非管理员用户授予系统服务的任何权限。如果用户需要远程访问服务,而不授予其本地登录或RDP 访问权限,则必须允许用户通过服务控制管理器远程连接和枚举服务。
转载:http://woshub.com/set-permissions-on-windows-service/#h2_1