如何允许非管理员用户在 Windows 中启动/停止服务
默认情况下,普通(非管理员)用户无法管理 Windows 服务。这意味着用户无法停止、启动、重新启动或更改 Windows 服务的设置和权限。在某些情况下,用户必须有权重新启动或管理某些服务。在本文中,我们将了解管理 Windows 服务权限的几种方法。作为示例,我们将展示如何允许非管理员用户重新启动特定的 Windows 服务。
假设您需要授予域帐户 contosotuser 重新启动 Print Spooler 服务的权限。如果非管理员用户尝试重新启动服务,则会显示错误:
net stop spooler
System error 5 has occurred. Access is denied.

在Windows中,有几种授予服务权限的方法:
内容:
使用 Windows CMD 管理服务权限
您可以使用内置的执行程序(服务控制器)控制台命令,用于管理 Windows 服务的权限。
sc show— 列出当前服务权限sc sdset– 更改服务权限
该方法的主要缺点是向服务授予权限的格式非常复杂。使用安全描述定义语言(SDDL)格式。
您可以获取 SDDL 字符串形式的当前服务权限:
sc.exe sdshow Spooler


D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
(A;;CCLCSWRPWPDTLOCRRC;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
这些符号是什么?
S: — System Access Control List (SACL) D: — Discretionary ACL (DACL)
括号后的第一个字母的意思是:允许(一个) 或否认 (D)。
可分配的权限是下一组字符。
CC — SERVICE_QUERY_CONFIG (query service settings) LC — SERVICE_QUERY_STATUS (get service status) SW — SERVICE_ENUMERATE_DEPENDENTS LO — SERVICE_INTERROGATE CR — SERVICE_USER_DEFINED_CONTROL RC — READ_CONTROL RP — SERVICE_START WP — SERVICE_STOP DT — SERVICE_PAUSE_CONTINUE
最后 2 个字符是授予权限的对象(用户、组或 SID)。以下是预定义组的列表。
AU Authenticated Users AO Account operators RU Alias to allow previous Windows 2000 AN Anonymous logon AU Authenticated users BA Built-in administrators BG Built-in guests BO Backup operators BU Built-in users CA Certificate server administrators CG Creator group CO Creator owner DA Domain administrators DC Domain computers DD Domain controllers DG Domain guests DU Domain users EA Enterprise administrators ED Enterprise domain controllers WD Everyone PA Group Policy administrators IU Interactively logged-on user LA Local administrator LG Local guest LS Local service account SY Local system NU Network logon user NO Network configuration operators NS Network service account PO Printer operators PS Personal self PU Power users RS RAS servers group RD Terminal server users RE Replicator RC Restricted code SA Schema administrators SO Server operators SU Service logon user
您可以使用 DACL 中预定义的组,也可以通过 SID 指定任何用户或组。使用以下命令获取当前用户的SID:
whoami /user
或者,您可以使用 Get-ADUser cmdlet 查找任何域用户的 SID:
Get-ADUser -Identity 'sadams' | select SID
使用 Get-ADGroup cmdlet 获取域组 SID:
Get-ADGroup -Filter {Name -eq "ny-ithelpdesk"} | Select SID
推荐阅读:如何在 Windows 10/8/7 中启动或停止服务
要为特定服务分配具有权限的 SDDL 字符串,请使用数据集命令。在此示例中,将以下行添加到服务 ACL。
(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)
- 一个- 允许
- RPWPCR–RP(SERVICE_START) +湿性粉剂(服务_停止) +CR(SERVICE_USER_DEFINED_CONTROL)
- 安全识别码– 用户或组SID
将您的 ACL 添加到 sdshow 返回的字符串末尾。使用数据集将新权限应用于服务的命令:
sc sdset Spooler "D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)"
![]()
![]()
如果您有有效的 DACL,该命令将返回:
[SC] SetServiceObjectSecurity SUCCESS
如果指定了不存在的 SID 或 SDDL 语法错误,则会出现错误:
未完成帐户名称和安全 ID 之间的映射。
检查非管理员用户现在是否可以停止和启动服务:
net stop spooler && net start spooler


查看当前服务权限列表的更方便的方法是使用服务程序工具 (https://learn.microsoft.com/en-us/sysinternals/downloads/psservice):
psservice.exe security spooler
SERVICE_NAME: Spooler
DISPLAY_NAME: Print Spooler
ACCOUNT: LocalSystem
SECURITY:
[ALLOW] NT AUTHORITYAuthenticated Users
Query status
Query Config
Interrogate
Enumerate Dependents
User-Defined Control
Read Permissions
[ALLOW] NT AUTHORITYSYSTEM
Query status
Query Config
Interrogate
Enumerate Dependents
Pause/Resume
Start
Stop
User-Defined Control
Read Permissions
[ALLOW] WOSHUBmax_adm
Change Config
Start
Stop
User-Defined Control
Read Permissions
[ALLOW] BUILTINAdministrators
All


在以前版本的 Windows 中,您可以使用子ACL用于管理服务权限的控制台工具(Windows 资源工具包的一部分)。
要允许 contosotuser 用户帐户重新启动服务:
subinacl.exe /service Spooler /grant=contosotuser=PTO


在这种情况下,用户已被授予暂停/继续、启动和停止服务的权限。可用权限的完整列表:
F : Full Control R : Generic Read W : Generic Write X : Generic eXecute L : Read controL Q : Query Service Configuration S : Query Service Status E : Enumerate Dependent Services C : Service Change Configuration T : Start Service O : Stop Service P : Pause/Continue Service I : Interrogate Service U : Service User-Defined Control Commands
要撤销用户分配的服务权限,请使用/撤销选项:
subinacl.exe /service Spooler /revoke=contosotuser
不过,SubInACL 目前无法从 Microsoft 网站下载,因此不建议使用。
如何使用 Process Explorer 更改服务权限
您可以使用 GUI 从 GUI 管理服务权限流程浏览器工具 (https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer)。
- 以管理员身份运行 Process Explorer,并在进程列表中查找您需要的服务进程。在这个例子中是
spoolsv.exe(后台处理程序可执行文件 C:WindowsSystem32spoolsv.exe)。打开进程属性并转到服务选项卡;

- 单击权限按钮。服务的当前 ACL 将显示在窗口中。默认情况下,本地用户只能查看(读取)服务状态;
- 添加您要授予服务权限的用户或组。默认情况下只有以下服务权限可用:完全控制、写入和读取;
- 您可以分配写服务的权限,以便用户可以启动和停止它。然而,这也允许用户更改甚至删除该服务;
- 要仅允许启动/停止服务,请单击先进的按钮 -> 选择您的用户,单击编辑-> 点击显示高级权限。只留下开始,停止,读,查询状态,和自定义控制权限列表中的选项;


- 保存更改;
- 分配的用户现在可以重新启动服务。


使用 PowerShell 设置服务权限
内置的设定服务服务管理 cmdlet 允许您使用 SDDL 格式设置服务的权限,类似于 sc sdset:
$SDDL = "D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)"
Set-Service -Name Spooler -SecurityDescriptorSddl $SDDL
![]()
![]()
仅在安装/升级 PowerShell Core 后,此版本的 cmdlet 才可用。
在 Windows PowerShell 5.1 中,此命令失败:
Set-Service : A parameter cannot be found that matches parameter name 'SecurityDescriptorSddl'.
您还可以使用以下命令管理各种 Windows 对象的权限碳来自 PowerShell 库的模块。安装模块:
Install-Module -Name 'Carbon'
Import-Module 'Carbon'
要向服务授予权限,请使用以下命令:
Grant-CServicePermission -Identity woshubmaxadm -Name spooler -QueryStatus -EnumerateDependents -Start -Stop
列出服务的当前 ACL:
Get-ServicePermission -Name spooler|fl


如何使用组策略授予服务权限
如果需要授予用户在所有域服务器或计算机上启动和停止服务的权限,最简单的方法是使用组策略 (GPO) 功能。
- 创建一个新的 GPO 或编辑现有的 GPO,并将其链接到具有计算机对象的必要 Active Directory 容器 (OU)。前往计算机配置 -> Windows 设置 -> 安全设置 -> 系统服务;


- 找到后台打印程序服务并开放其财产;
- 启用定义此策略设置选项,启用该服务的自动启动,然后单击编辑安全性;
- 在服务安全设置中,添加要为其分配服务权限的用户或域组。授予启动、停止、暂停和读取权限;


- 您所需要做的就是等待客户端计算机上的组策略设置更新,并检查您的用户现在是否可以重新启动服务。
Windows 服务安全权限存储在哪里?
您更改了默认权限的所有服务的安全设置都存储在它们自己的注册表项中HKLMSystemCurrentControlSetServices<servicename>Security在安全参数(REG_BINARY 类型)。
这意味着在其他计算机上设置相同权限的方法之一是导出/导入此注册表参数。您可以使用 GPO 将更改部署到域计算机上的注册表。


如果您希望用户能够远程停止/启动/重新启动服务(无需授予他们本地登录权限或 RDP 访问权限),您需要允许他们远程枚举服务控制管理器服务(scmanager)。
以下命令允许具有指定 SID 的远程组(用户)枚举远程计算机上的服务列表:
sc sdset scmanager "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CCLCRPRC;;;{PASTE_YOUR_SID_HERE})S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)"
否则,当您尝试查询远程 Windows 主机上的服务时,您将收到错误消息:
sc \lonts-01 query
[SC] OpenSCManager FAILED 5: Access is denied.


因此,我们研究了几种管理 Windows 服务权限的不同方法,这些方法允许向非管理员用户授予系统服务的任何权限。
