วิธีอนุญาตให้ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบเริ่ม/หยุดบริการใน Windows
ตามค่าเริ่มต้น ผู้ใช้ทั่วไป (ที่ไม่ใช่ผู้ดูแลระบบ) จะไม่สามารถจัดการบริการ Windows ได้ ซึ่งหมายความว่าผู้ใช้ไม่สามารถหยุด เริ่ม รีสตาร์ท หรือเปลี่ยนการตั้งค่าและการอนุญาตของบริการ Windows ในบางกรณี ผู้ใช้จำเป็นต้องมีสิทธิ์ในการรีสตาร์ทหรือจัดการบริการบางอย่าง ในบทความนี้ เราจะดูหลายวิธีในการจัดการการอนุญาตสำหรับบริการ Windows ตัวอย่างเช่น เราจะแสดงวิธีอนุญาตให้ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบเริ่มบริการ Windows เฉพาะใหม่
สมมติว่าคุณต้องให้สิทธิ์แก่บัญชีโดเมน ผู้ใช้ contoso ในการเริ่มบริการ ตัวจัดคิวงานพิมพ์ ใหม่ หากผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบพยายามเริ่มบริการใหม่ ข้อผิดพลาดจะปรากฏขึ้น:
net stop spoolerSystem error 5 has occurred. Access is denied.ใน Windows มีหลายวิธีในการให้สิทธิ์บริการ:
จัดการการอนุญาตบริการด้วย Windows CMD
คุณสามารถใช้คำสั่งคอนโซล sc.exe (Service Controller) ในตัวเพื่อจัดการสิทธิ์ของบริการ Windows
sc show- รายการสิทธิ์บริการปัจจุบัน
sc sdset- เปลี่ยนการอนุญาตบริการ
ข้อเสียเปรียบหลักของวิธีนี้คือรูปแบบการให้สิทธิ์ในบริการนั้นซับซ้อนมาก ใช้รูปแบบ Security Description Definition Language (SDDL)
คุณสามารถรับสิทธิ์บริการปัจจุบันเป็นสตริง SDDL:
sc.exe sdshow SpoolerD:(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ใช้ cmdlet Get-ADGroup เพื่อรับ 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)"หากคุณมี DACL ที่ถูกต้อง คำสั่งจะส่งกลับ:
[SC] SetServiceObjectSecurity SUCCESSหากคุณระบุ SID ที่ไม่มีอยู่หรือทำผิดพลาดในไวยากรณ์ SDDL ข้อผิดพลาดจะเกิดขึ้น:
ไม่มีการแมประหว่างชื่อบัญชีและรหัสความปลอดภัย
ตรวจสอบว่าผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบสามารถหยุดและเริ่มบริการได้แล้ว:
net stop spooler && net start spoolerSERVICE_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 รุ่นก่อนหน้า คุณสามารถใช้เครื่องมือคอนโซล SubInACL (ส่วนหนึ่งของ Windows Resource Kit) เพื่อจัดการการอนุญาตบริการ
ในการอนุญาตให้บัญชีผู้ใช้ contoso เริ่มบริการใหม่:
subinacl.exe /service Spooler /grant=contoso\tuser=PTOในกรณีนี้ ผู้ใช้ได้รับสิทธิ์ในการหยุดชั่วคราว/ดำเนินการต่อ เริ่ม และหยุดบริการ รายการสิทธิพิเศษทั้งหมด:
- F
ควบคุมทั้งหมด
- R
อ่านทั่วไป
- W
เขียนทั่วไป
- X
eXecute ทั่วไป
- L
อ่านการควบคุมL
- Q
การกำหนดค่าบริการแบบสอบถาม
- S
สอบถามสถานะบริการ
- E
ระบุบริการที่ต้องพึ่งพา
- C
การกำหนดค่าการเปลี่ยนแปลงบริการ
- T
เริ่มบริการ
- O
หยุดให้บริการ
- P
หยุดชั่วคราว/ดำเนินการต่อบริการ
- I
บริการสอบถาม
- U
คำสั่งควบคุมที่ผู้ใช้บริการกำหนด
หากต้องการเพิกถอนสิทธิ์ที่ผู้ใช้กำหนดในบริการ ให้ใช้ตัวเลือก /revoke:
subinacl.exe /service Spooler /revoke=contoso\tuserอย่างไรก็ตาม ขณะนี้ SubInACL ยังไม่พร้อมให้ดาวน์โหลดจากเว็บไซต์ Microsoft และไม่แนะนำให้ใช้
วิธีเปลี่ยนการอนุญาตบริการโดยใช้ Process Explorer
คุณสามารถจัดการสิทธิ์ของบริการจาก GUI โดยใช้เครื่องมือ Process Explorer (https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer)
เรียกใช้ Process Explorer ในฐานะผู้ดูแลระบบและค้นหากระบวนการของบริการที่คุณต้องการในรายการกระบวนการ ในตัวอย่างนี้ก็คือ
spoolsv.exe(ตัวจัดคิวปฏิบัติการได้ C:\Windows\System32\spoolsv.exe) เปิดคุณสมบัติกระบวนการและไปที่แท็บ บริการ
คลิกที่ปุ่ม สิทธิ์ ACL ปัจจุบันของบริการปรากฏในหน้าต่าง ตามค่าเริ่มต้น ผู้ใช้ภายในสามารถดู (อ่าน) สถานะบริการเท่านั้น
เพิ่มผู้ใช้หรือกลุ่มที่คุณต้องการให้สิทธิ์บริการ ตามค่าเริ่มต้นจะมีสิทธิ์บริการต่อไปนี้เท่านั้น: ควบคุมทั้งหมด เขียน และอ่าน;
คุณสามารถกำหนดสิทธิ์ เขียน ให้กับบริการเพื่อให้ผู้ใช้สามารถเริ่มและหยุดบริการได้ อย่างไรก็ตาม วิธีนี้ทำให้ผู้ใช้สามารถเปลี่ยนหรือลบบริการได้
หากต้องการอนุญาตเฉพาะการเริ่ม/หยุดบริการ ให้คลิกที่ปุ่มขั้นสูง -> เลือกผู้ใช้ของคุณ คลิกแก้ไข -> คลิกแสดงสิทธิ์ขั้นสูง<. ปล่อยไว้เฉพาะตัวเลือก เริ่ม หยุด อ่าน สถานะแบบสอบถาม และ การควบคุมแบบกำหนดเอง ในรายการสิทธิ์
บันทึกการเปลี่ยนแปลง;
ผู้ใช้ที่ได้รับมอบหมายสามารถเริ่มบริการใหม่ได้แล้ว
ตั้งค่าการอนุญาตบริการโดยใช้ PowerShell
cmdlet การจัดการบริการ Set-Service ในตัวช่วยให้คุณสามารถกำหนดสิทธิ์ในบริการโดยใช้รูปแบบ 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 $SDDLcmdlet เวอร์ชันนี้จะใช้ได้หลังจากที่คุณติดตั้ง/อัปเกรด PowerShell Core เท่านั้น
ใน Windows PowerShell 5.1 คำสั่งนี้ล้มเหลว:
Set-Service : A parameter cannot be found that matches parameter name 'SecurityDescriptorSddl'.คุณยังสามารถจัดการสิทธิ์บนวัตถุ Windows ต่างๆ โดยใช้โมดูล คาร์บอน จาก PowerShell Gallery ติดตั้งโมดูล:
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วิธีใช้นโยบายกลุ่มเพื่อให้สิทธิ์สำหรับบริการ
หากคุณต้องการให้สิทธิ์ อนุญาตให้ผู้ใช้เริ่มและหยุดบริการบนเซิร์ฟเวอร์โดเมนหรือคอมพิวเตอร์ทั้งหมด วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้คุณลักษณะนโยบายกลุ่ม (GPO)
สร้าง GPO ใหม่หรือแก้ไข GPO ที่มีอยู่และเชื่อมโยงกับคอนเทนเนอร์ Active Directory (OU) ที่จำเป็นกับวัตถุคอมพิวเตอร์ ไปที่ การกำหนดค่าคอมพิวเตอร์ -> การตั้งค่า Windows -> การตั้งค่าความปลอดภัย -> บริการระบบ
ค้นหาบริการ ตัวจัดคิวงานพิมพ์ และเปิดคุณสมบัติ
เปิดใช้งานตัวเลือก กำหนดการตั้งค่านโยบายนี้ เปิดใช้งานการเริ่มอัตโนมัติสำหรับบริการ และคลิก แก้ไขความปลอดภัย
ในการตั้งค่าความปลอดภัยของบริการ ให้เพิ่มผู้ใช้หรือกลุ่มโดเมนที่คุณต้องการกำหนดสิทธิ์ให้กับบริการ ให้สิทธิ์เริ่ม หยุด และหยุดชั่วคราว และอ่าน;
สิ่งที่คุณต้องทำคือรอให้การตั้งค่า Group Policy ได้รับการอัปเดตบนคอมพิวเตอร์ไคลเอนต์ และตรวจสอบว่าผู้ใช้ของคุณสามารถเริ่มบริการใหม่ได้แล้ว
สิทธิ์การรักษาความปลอดภัยของบริการ Windows เก็บไว้ที่ไหน
การตั้งค่าความปลอดภัยสำหรับบริการทั้งหมดที่คุณเปลี่ยนสิทธิ์เริ่มต้นจะถูกจัดเก็บไว้ในคีย์รีจิสทรีของตนเอง
HKLM\System\CurrentControlSet\Services\<servicename>\Securityในพารามิเตอร์ Security (ประเภท REG_BINARY)
ซึ่งหมายความว่าวิธีหนึ่งในการตั้งค่าการอนุญาตแบบเดียวกันบนคอมพิวเตอร์เครื่องอื่นคือการส่งออก/นำเข้าพารามิเตอร์รีจิสทรีนี้ คุณสามารถใช้ GPO เพื่อปรับใช้การเปลี่ยนแปลงกับรีจิสทรีบนคอมพิวเตอร์โดเมน
หากคุณต้องการให้ผู้ใช้สามารถหยุด/เริ่มต้น/รีสตาร์ทบริการจากระยะไกล (โดยไม่ต้องให้สิทธิ์การลงชื่อเข้าใช้ในเครื่องหรือการเข้าถึง RDP) คุณต้องอนุญาตให้ผู้ใช้ระบุบริการ Service Control Manager จากระยะไกล (
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 ที่อนุญาตให้ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบอนุญาตสิทธิ์สำหรับบริการระบบ














