如何允許非管理員用戶在 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 服務權限的不同方法,這些方法允許向非管理員用戶授予系統服務的任何權限。