โดยค่าเริ่มต้น ผู้ใช้ทั่วไป (non-admin) ไม่สามารถจัดการ Windows services ได้ หมายความว่าผู้ใช้ไม่สามารถหยุด เริ่ม รีสตาร์ท หรือเปลี่ยนการตั้งค่า/สิทธิ์ของ Windows services ในบางกรณี จำเป็นต้องให้ผู้ใช้มีสิทธิ์ในการรีสตาร์ทหรือจัดการบริการบางอย่าง ในบทความนี้ เราจะดูหลายวิธีในการจัดการสิทธิ์สำหรับ Windows services โดยเฉพาะเราจะแสดงวิธีอนุญาตให้ non-admin user เริ่ม หยุด และรีสตาร์ท Windows service เฉพาะเจาะจงโดยการให้สิทธิ์ที่เหมาะสม
สมมติว่าคุณต้องการให้บัญชีโดเมน contoso\tuser มีสิทธิ์รีสตาร์ทบริการ Print Spooler (service name – spooler) เมื่อ non-admin พยายามรีสตาร์ทบริการ ข้อผิดพลาดจะปรากฏ:
System error 5 has occurred. Access is denied.

ไม่มีเครื่องมือในตัวที่ง่ายและสะดวกสำหรับการจัดการสิทธิ์บริการใน Windows เราจะพิจารณาบางวิธีในการให้สิทธิ์แก่ผู้ใช้เพื่อจัดการบริการ:
การตั้งค่าสิทธิ์ Windows Service โดยใช้เครื่องมือ SC.exe (Service controller)
วิธีมาตรฐานในตัวของ Windows สำหรับการจัดการสิทธิ์ system service คือการใช้เครื่องมือ sc.exe (Service Controller) ปัญหาหลักของการใช้ยูทิลิตี้นี้คือ syntax ที่ซับซ้อนของรูปแบบสิทธิ์บริการ (รูปแบบ SDDL — Security Description Definition Language)
คุณสามารถดูสิทธิ์ปัจจุบันสำหรับ Windows service เป็นสตริง 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)
ตัวอักษรแรกหลังวงเล็บ หมายถึง: allow (A) หรือ deny (D)
ชุดสัญลักษณ์ถัดไปคือสิทธิ์ที่มอบหมายได้
CC — SERVICE_QUERY_CONFIG (request service settings) LC — SERVICE_QUERY_STATUS (service status polling) 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 ตัวสุดท้ายคือ objects (user, group หรือ 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
แทนกลุ่มที่กำหนดไว้ล่วงหน้า คุณสามารถระบุผู้ใช้หรือกลุ่มโดย SID อย่างชัดเจน ในการดู SID สำหรับผู้ใช้ปัจจุบัน คุณสามารถใช้คำสั่ง:
whoami /user
หรือคุณสามารถหา SID สำหรับผู้ใช้โดเมนใดๆ โดยใช้คอมมานด์เลต Get-ADUser:
Get-ADUser -Identity 'sadams' | select SID
คุณสามารถดู SID ของ AD security group โดยใช้คอมมานด์เลต Get-ADGroup:
Get-ADGroup -Filter {Name -eq "ny-ithelpdesk"} | Select SID
เพื่อกำหนดสตริงสิทธิ์ SDDL สำหรับบริการเฉพาะ คุณสามารถใช้คำสั่ง sc sdset ตัวอย่างเช่น สิทธิ์สามารถมอบหมายให้ผู้ใช้ด้วยคำสั่งต่อไปนี้:
sc sdset Spooler "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
การใช้ SubInACL เพื่ออนุญาตให้ผู้ใช้ Start/Stop/Restart Service
การใช้เครื่องมือบรรทัดคำสั่ง SubInACL จาก Sysinternals (โดย Mark Russinovich) เพื่อจัดการสิทธิ์บริการจะง่ายกว่า Syntax ของเครื่องมือนี้ง่ายและสะดวกกว่ามาก นี่คือวิธีการให้สิทธิ์รีสตาร์ทบริการโดยใช้ SubInACL:
- ดาวน์โหลด subinacl.msi จากหน้านี้ (https://www.microsoft.com/en-us/download/details.aspx?id=23510) และติดตั้งบนระบบเป้าหมาย;

- ใน command prompt ที่รันแบบ elevated ไปที่ไดเรกทอรีที่มีเครื่องมือ:
cd “C:\Program Files (x86)\Windows Resource Kits\Tools\” - รันคำสั่ง:
subinacl.exe /service Spooler /grant=contoso\tuser=PTO
หมายเหตุ: ในกรณีนี้ เราให้ผู้ใช้สิทธิ์ในการ suspend (pause/continue), start และ stop (restart) บริการ รายการเต็มของสิทธิ์บริการที่มีอยู่:
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
หากคุณต้องการให้สิทธิ์กับบริการที่รันบนคอมพิวเตอร์ระยะไกล ให้ใช้ syntax ของคำสั่ง subinacl ดังนี้:
subinacl /SERVICE \\lon-prnt1\spooler /grant=contoso\tuser=F - ตอนนี้คุณเพียงต้องล็อกอินคอมพิวเตอร์ภายใต้บัญชีผู้ใช้และลองรีสตาร์ทบริการด้วยคำสั่ง:
net stop spooler
net start spooler
หรือ
sc stop spooler && sc start spooler

หากคุณทำทุกอย่างถูกต้อง บริการควรจะรีสตาร์ท
เพื่อเพิกถอนสิทธิ์บริการที่มอบหมาย ให้ใช้ตัวเลือก /revoke ของเครื่องมือ subinacl.exe ตัวอย่างเช่น:
subinacl.exe /service Spooler /revoke=contoso\tuser
วิธีเปลี่ยนสิทธิ์ Windows Service โดยใช้ Process Explorer
คุณสามารถเปลี่ยนสิทธิ์ Windows Service โดยใช้ยูทิลิตี้ Sysinternals อีกตัวหนึ่ง – Process Explorer รัน Process Explorer ในฐานะ administrator และหากระบวนการของบริการที่คุณต้องการ ในตัวอย่างของเรานี้คือ spoolsv.exe (spooler executable – C:\Windows\System32\spoolsv.exe) เปิดคุณสมบัติของกระบวนการและคลิกแท็บ Services

คลิกปุ่ม Permissions และเพิ่มผู้ใช้หรือกลุ่มในหน้าต่างที่เปิดขึ้น หลังจากนั้นเลือกสิทธิ์ที่คุณต้องการมอบหมาย (Full Control/Write/Read)

การตั้งค่าสิทธิ์ Windows Service โดยใช้ PowerShell
ใน TechNet gallery มีโมดูล PowerShell แยกต่างหากที่ไม่เป็นทางการสำหรับการจัดการสิทธิ์สำหรับ Windows objects ต่างๆ – PowerShellAccessControl Module (คุณสามารถดาวน์โหลดได้ที่นี่) โมดูลนี้ยังช่วยให้คุณจัดการสิทธิ์บริการได้ ติดตั้งโมดูลนี้และนำเข้าเข้า PS session ของคุณ:
Import-Module PowerShellAccessControl
คุณสามารถดูสิทธิ์ที่มีผลสำหรับ Windows service เฉพาะจาก PowerShell ได้ดังนี้:
Get-Service spooler | Get-EffectiveAccess -Principal corp\tuser
เพื่ออนุญาตให้ non-admin user เริ่มและหยุด spooler service ให้รันคำสั่ง:
Get-Service spooler | Add-AccessControlEntry -ServiceAccessRights Start,Stop -Principal corp\tuser
การใช้ Security Templates เพื่อจัดการสิทธิ์บริการ
วิธีแบบกราฟิกที่มองเห็นได้ (แต่ต้องใช้ขั้นตอนมากกว่า) สำหรับการจัดการสิทธิ์บริการคือการใช้ Security Templates เปิดคอนโซล mmc.exe และเพิ่ม snap-in Security Templates

สร้าง security template ใหม่ (New Template)

ระบุชื่อสำหรับ template ใหม่และไปที่ส่วน System Services ในรายการบริการ เลือกบริการ Print Spooler และเปิดคุณสมบัติของมัน
เลือกโหมดเริ่มต้น (Automatic) และคลิก Edit Security

ใช้ปุ่ม Add เพื่อเพิ่มบัญชีผู้ใช้หรือกลุ่มเพื่อให้สิทธิ์ ในกรณีของเรา สิทธิ์ Start, stop and pause เพียงพอแล้ว

บันทึก template นี้
หมายเหตุ: เนื้อหาของ Security Template ถูกบันทึกเป็นไฟล์ INF ในโฟลเดอร์ C:\Users\%username%\Documents\Security\Templates
หากคุณเปิดไฟล์นี้ คุณจะเห็นว่าข้อมูลเกี่ยวกับสิทธิ์ถูกบันทึกในรูปแบบ SDDL ที่กล่าวถึงก่อนหน้านี้ สตริงที่ได้ในวิธีนี้สามารถใช้เป็นอาร์กิวเมนต์ของคำสั่ง sc.exe ได้
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[Service General Setting]
"Spooler",2,"D:AR(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;RPWPDTRC;;;S-1-5-21-3243688314-1354026805-3292651841-1127)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

ตอนนี้คุณเพียงต้องสร้างฐานข้อมูลใหม่ (Open Database) โดยใช้ snap-in Security Configuration and Analysis และนำเข้า Security Template ของคุณจากไฟล์ Spooler User Rights.inf

นำ template นี้ไปใช้โดยเลือกตัวเลือก Configure Computer Now จากเมนูบริบท

ตอนนี้ตรวจสอบว่าผู้ใช้สามารถจัดการบริการ Print Spooler ภายใต้บัญชี non-admin ได้
วิธีให้สิทธิ์ผู้ใช้จัดการบริการโดยใช้ GPO
หากคุณต้องให้สิทธิ์แก่ผู้ใช้เพื่อเริ่ม/หยุดบริการบนเซิร์ฟเวอร์หลายเครื่องหรือคอมพิวเตอร์โดเมน มันง่ายกว่าที่จะใช้คุณสมบัติ Group Policy (GPO):
- สร้าง GPO ใหม่หรือแก้ไข GPO ที่มีอยู่ เชื่อมโยงกับ Active Directory container (OU) ที่จำเป็นที่มี computer objects ไปที่ส่วนนโยบาย Computer configuration -> Windows Settings -> Security Settings -> System Services;

- หาบริการ Spooler และให้สิทธิ์แก่ผู้ใช้เหมือนวิธีที่อธิบายข้างต้น บันทึกการเปลี่ยนแปลง;หมายเหตุ: ก่อนหน้านี้เราแสดงว่าการใช้ GPO เดียวกัน คุณสามารถซ่อน Windows service ใดๆ จากผู้ใช้ทั้งหมดได้
- รอจนกว่า GPO จะถูกนำไปใช้บนคอมพิวเตอร์ไคลเอ็นต์ และตรวจสอบว่าสิทธิ์บริการใหม่ถูกมอบหมายแล้ว
Windows service security permissions จัดเก็บที่ไหน?
การตั้งค่าความปลอดภัยสำหรับบริการทั้งหมดที่คุณเปลี่ยนแปลงสิทธิ์เริ่มต้น จัดเก็บอยู่ในคีย์รีจิสทรีของตนเอง HKLM\System\CurrentControlSet\Services\<servicename>\Security ในพารามิเตอร์ Security ประเภท REG_BINARY
นี่หมายความว่าหนึ่งในวิธีในการตั้งค่าสิทธิ์บริการบนคอมพิวเตอร์อื่นคือการ export/import พารามิเตอร์รีจิสทร์นี้ (รวมถึงผ่าน GPO) 
ดังนั้น เราได้ดูหลายวิธีในการจัดการสิทธิ์ Windows services ซึ่งช่วยให้คุณมอบสิทธิ์ใดๆ สำหรับ system services ให้กับ non-admin user หากผู้ใช้ต้องการการเข้าถึงบริการจากระยะไกล โดยไม่ให้สิทธิ์ local logon หรือ RDP access คุณต้องอนุญาตให้ผู้ใช้เชื่อมต่อระยะไกลและ enumerate services ผ่าน Service Control Manager