当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

作者:精品下载站 日期:2024-12-15 00:51:26 浏览:18 分类:玩电脑

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


默认情况下,普通(非管理员)用户无法管理 Windows 服务。这意味着用户无法停止、启动、重新启动或更改 Windows 服务的设置和权限。在某些情况下,用户需要具有重新启动或管理某些服务的权限。在本文中,我们将介绍管理 Windows 服务权限的几种方法。作为示例,我们将展示如何允许非管理员用户重新启动特定的 Windows 服务。

假设您需要授予域帐户contoso 用户重新启动Print Spooler 服务的权限。如果非管理员用户尝试重新启动服务,则会显示错误:

net stop spooler
System error 5 has occurred. Access is denied.

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

在Windows中,有几种授予服务权限的方法:

使用 Windows CMD 管理服务权限

您可以使用内置的 sc.exe(服务控制器)控制台命令来管理 Windows 服务的权限。

  • sc show

    — 列出当前服务权限

  • sc sdset

    - 更改服务权限

该方法的主要缺点是向服务授予权限的格式非常复杂。使用安全描述定义语言(SDDL)格式。

您可以获取 SDDL 字符串形式的当前服务权限:

sc.exe sdshow Spooler

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

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)

括号后的第一个字母表示:允许 (A) 或拒绝 (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

经过身份验证的用户

AO

账户运营商

RU

允许使用以前的 Windows 2000 的别名

AN

匿名登录

AU

经过身份验证的用户

BA

内置管理员

BG

内置客人

BO

备份操作员

BU

内置用户

CA

证书服务器管理员

CG

创作者组

CO

创作者所有者

DA

域管理员

DC

域计算机

DD

域控制器

DG

域来宾

DU

域用户

EA

企业管理员

ED

企业域控制器

WD

每个人

PA

组策略管理员

IU

交互式登录用户

LA

本地管理员

LG

当地客人

LS

本地服务帐户

SY

本地系统

NU

网络登录用户

NO

网络配置运算符

NS

网络服务帐号

PO

打印机操作员

PS

个人自我

PU

高级用户

RS

RAS 服务器组

RD

终端服务器用户

RE

复制器

RC

受限代码

SA

架构管理员

SO

服务器运营商

SU

服务登录用户

您可以使用 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

要为特定服务分配具有权限的 SDDL 字符串,请使用 sc sdset 命令。在此示例中,将以下行添加到服务 ACL。

(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)
  • A - 允许

  • RPWPCR -RP (SERVICE_START) + WP (SERVICE_STOP) + CR (SERVICE_USER_DEFINED_CONTROL)

  • SID - 用户或组 SID

将您的 ACL 添加到 sdshow 返回的字符串末尾。使用 sc sdset 命令将新权限应用于服务:

sc sdset Spooler "D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)"

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

如果您有有效的 DACL,该命令将返回:

[SC] SetServiceObjectSecurity SUCCESS

如果指定了不存在的 SID 或 SDDL 语法错误,则会出现错误:

未完成帐户名称和安全 ID 之间的映射。

检查非管理员用户现在是否可以停止和启动服务:

net stop spooler && net start spooler

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

SERVICE_NAME: Spooler
DISPLAY_NAME: Print Spooler
        ACCOUNT: LocalSystem
        SECURITY:
        [ALLOW] NT AUTHORITY\Authenticated Users
                Query status
                Query Config
                Interrogate
                Enumerate Dependents
                User-Defined Control
                Read Permissions
        [ALLOW] NT AUTHORITY\SYSTEM
                Query status
                Query Config
                Interrogate
                Enumerate Dependents
                Pause/Resume
                Start
                Stop
                User-Defined Control
                Read Permissions
        [ALLOW] WOSHUB\max_adm
                Change Config
                Start
                Stop
                User-Defined Control
                Read Permissions
        [ALLOW] BUILTIN\Administrators
                All

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

在以前版本的 Windows 中,您可以使用 SubInACL 控制台工具(Windows 资源工具包的一部分)来管理服务权限。

要允许 contoso 用户用户帐户重新启动服务:

subinacl.exe /service Spooler /grant=contoso\tuser=PTO

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

在这种情况下,用户已被授予暂停/继续、启动和停止服务的权限。可用权限的完整列表:

F

完全控制

R

通用读

W

通用写入

X

通用执行

L

读控制

Q

查询服务配置

S

查询服务状态

E

枚举依赖服务

C

服务变更配置

T

启动服务

O

停止服务

P

暂停/继续服务

I

询问服务

U

业务自定义控制命令

要撤销用户分配的服务权限,请使用 /revoke 选项:

subinacl.exe /service Spooler /revoke=contoso\tuser

不过,SubInACL 目前无法从 Microsoft 网站下载,因此不建议使用。

如何使用 Process Explorer 更改服务权限

您可以使用 Process Explorer 工具 (https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer) 从 GUI 管理服务权限。

  1. 以管理员身份运行 Process Explorer,并在进程列表中查找您需要的服务进程。在这个例子中是

    spoolsv.exe

    (后台打印程序可执行文件 C:\Windows\System32\spoolsv.exe)。打开流程属性并转到服务选项卡;

    [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

  2. 单击权限按钮。服务的当前 ACL 将显示在窗口中。默认情况下,本地用户只能查看(读取)服务状态;

  3. 添加您要授予服务权限的用户或组。默认情况下只有以下服务权限可用:完全控制、写入和读取;

  4. 您可以为服务分配写入权限,以便用户可以启动和停止它。然而,这也允许用户更改甚至删除该服务;

  5. 要仅允许启动/停止服务,请单击高级按钮 -> 选择您的用户,单击编辑 -> 单击显示高级权限。权限列表中仅保留启动停止读取查询状态自定义控制选项;

    [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

  6. 保存更改;

  7. 分配的用户现在可以重新启动服务。

    [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

使用 PowerShell 设置服务权限

内置的 Set-Service 服务管理 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

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

仅在安装/升级 PowerShell Core 后,此版本的 cmdlet 才可用。

在 Windows PowerShell 5.1 中,此命令失败:

Set-Service : A parameter cannot be found that matches parameter name 'SecurityDescriptorSddl'.

您还可以使用 PowerShell 库中的 Carbon 模块管理各种 Windows 对象的权限。安装模块:

Install-Module -Name 'Carbon'
Import-Module 'Carbon'

为了向服务授予权限,请使用以下命令:

Grant-CServicePermission -Identity a-d\maxadm -Name spooler -QueryStatus -EnumerateDependents -Start -Stop

列出服务的当前 ACL:

Get-ServicePermission -Name spooler|fl

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

如何使用组策略授予服务权限

如果您需要授予 用户有权启动和停止所有域服务器或计算机上的服务,最简单的方法是使用组策略 (GPO) 功能。

  1. 创建一个新的 GPO 或编辑现有的 GPO,并将其链接到具有计算机对象的必要 Active Directory 容器 (OU)。进入计算机配置->Windows设置->安全设置->系统服务

    [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

  2. 找到Print Spooler服务并打开其属性;

  3. 启用定义此策略设置选项,启用服务自动启动,然后单击编辑安全性

  4. 在服务安全设置中,添加要为其分配服务权限的用户或域组。授予启动、停止、暂停和读取权限;

    [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

  5. 您所需要做的就是等待客户端计算机上的组策略设置更新,并检查您的用户现在是否可以重新启动服务。

Windows 服务安全权限存储在哪里?

您更改了默认权限的所有服务的安全设置都存储在它们自己的注册表项中

HKLM\System\CurrentControlSet\Services\<servicename>\Security

Security 参数(REG_BINARY 类型)中。

这意味着在其他计算机上设置相同权限的方法之一是导出/导入此注册表参数。您可以使用 GPO 将更改部署到域计算机上的注册表。

[玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务

如果您希望用户能够远程停止/启动/重新启动服务(无需授予他们本地登录权限或 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 中启动/停止服务

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

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯