如何允许非管理员用户在 Windows 中启动/停止服务

Jacki

默认情况下,普通(非管理员)用户无法管理 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)
  • 一个- 允许
  • RPWPCRRP(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)。

  1. 以管理员身份运行 Process Explorer,并在进程列表中查找您需要的服务进程。在这个例子中是spoolsv.exe(后台处理程序可执行文件 C:WindowsSystem32spoolsv.exe)。打开进程属性并转到服务选项卡;
  2. 单击权限按钮。服务的当前 ACL 将显示在窗口中。默认情况下,本地用户只能查看(读取)服务状态;
  3. 添加您要授予服务权限的用户或组。默认情况下只有以下服务权限可用:完全控制、写入和读取;
  4. 您可以分配服务的权限,以便用户可以启动和停止它。然而,这也允许用户更改甚至删除该服务;
  5. 要仅允许启动/停止服务,请单击先进的按钮 -> 选择您的用户,单击编辑-> 点击显示高级权限。只留下开始,停止,,查询状态,自定义控制权限列表中的选项;
  6. 保存更改;
  7. 分配的用户现在可以重新启动服务。

使用 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) 功能。

  1. 创建一个新的 GPO 或编辑现有的 GPO,并将其链接到具有计算机对象的必要 Active Directory 容器 (OU)。前往计算机配置 -> Windows 设置 -> 安全设置 -> 系统服务;
  2. 找到后台打印程序服务并开放其财产;
  3. 启用定义此策略设置选项,启用该服务的自动启动,然后单击编辑安全性;
  4. 在服务安全设置中,添加要为其分配服务权限的用户或域组。授予启动、停止、暂停和读取权限;
  5. 您所需要做的就是等待客户端计算机上的组策略设置更新,并检查您的用户现在是否可以重新启动服务。

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 服务权限的不同方法,这些方法允许向非管理员用户授予系统服务的任何权限。