ฉันจะให้สิทธิ์เริ่มต้น / หยุด / รีสตาร์ทบนบริการแก่ผู้ใช้หรือกลุ่มบนเซิร์ฟเวอร์ที่ไม่ใช่โดเมนสมาชิกได้อย่างไร


61

เรามีชุดบริการ Windows ที่ทำงานบนเซิร์ฟเวอร์ของเราซึ่งทำงานหลายอย่างอัตโนมัติโดยไม่ขึ้นอยู่กับข้อยกเว้นของบริการหนึ่งที่ดูแลบริการอื่น ๆ

ในกรณีที่หนึ่งในบริการไม่สามารถตอบสนองหรือหยุดบริการนี้พยายามเริ่มบริการใหม่และหากมีข้อผิดพลาดเกิดขึ้นระหว่างการพยายามส่งอีเมลถึงทีมสนับสนุนแทนเพื่อให้สามารถเริ่มบริการได้เอง

หลังจากทำวิจัยเล็กน้อยฉันได้พบ 'โซลูชัน' ไม่กี่อันที่มีตั้งแต่วิธีแก้ปัญหาที่กล่าวถึงในKB907460ไปจนถึงการให้บัญชีภายใต้บริการที่ใช้สิทธิ์ของผู้ดูแลระบบ

ฉันไม่พอใจกับวิธีการเหล่านี้อย่างใดอย่างหนึ่ง - ฉันไม่เข้าใจผลที่ตามมาของวิธีแรกตามที่อธิบายไว้ในบทความฐานความรู้ของ Microsoft แต่ฉันไม่ต้องการให้สิทธิ์ผู้ดูแลระบบในการเข้าใช้งานบัญชีซึ่งบริการกำลังทำงานอยู่ .

ฉันได้ดูอย่างรวดเร็วผ่านนโยบายความปลอดภัยในพื้นที่และนอกเหนือจากนโยบายที่กำหนดว่าบัญชีสามารถเข้าสู่ระบบเป็นบริการได้หรือไม่ฉันไม่เห็นสิ่งอื่นซึ่งดูเหมือนว่าหมายถึงบริการ

เรากำลังใช้งานบน Server 2003 และ Server 2008 ดังนั้นความคิดหรือตัวชี้จะได้รับอย่างสง่างาม!


ชี้แจง:ฉันไม่ต้องการที่จะให้ความสามารถในการเริ่ม / หยุด / เริ่มต้นบริการทั้งหมดให้กับผู้ใช้หรือกลุ่ม - ฉันต้องการที่จะสามารถที่จะให้สิทธิ์ในการทำเช่นนั้นในที่เฉพาะเจาะจงเฉพาะบริการเพื่อผู้ใช้หรือกลุ่ม


คำชี้แจงเพิ่มเติม:เซิร์ฟเวอร์ที่ฉันต้องให้การอนุญาตเหล่านี้ไม่ได้อยู่ในโดเมน - เป็นเซิร์ฟเวอร์ที่เชื่อมต่ออินเทอร์เน็ตสองเครื่องที่รับไฟล์ประมวลผลและส่งไปยังบุคคลที่สามรวมถึงการให้บริการเว็บไซต์สองแห่งดังนั้น นโยบายกลุ่ม Active Directory เป็นไปไม่ได้ ขออภัยที่ฉันไม่ได้ทำให้ชัดเจน


คุณอาจดูที่บทความนี้จาก ms ซึ่งชี้ไปยังการปรับเปลี่ยน GP: support.microsoft.com/kb/256345

3
ขอโทษฉันคิดถึงคุณ ... ฉันไม่ว่าง คุณกำลังมองหาบางอย่างเช่นนี้: serverfault.com/questions/15147/…
Evan Anderson

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่คุณพิจารณาใช้ตัวเลือก 'กู้คืน' ในตัวจัดการบริการของ Windows หรือไม่
Tim Long

คำตอบ:


51

ดูเหมือนจะไม่เป็นวิธีที่ใช้ GUI ในการทำสิ่งนี้เว้นแต่ว่าคุณจะเข้าร่วมโดเมน - อย่างน้อยก็ไม่มีใครที่ฉันสามารถหาได้ทุกที่ - ดังนั้นฉันจึงขุดอีกเล็กน้อยและฉันพบคำตอบที่เหมาะกับ ความมุ่งมั่นของเรา

ฉันไม่เข้าใจความหมายของการแสดงสตริงในบทความฐานความรู้ แต่การขุดเล็กน้อยทำให้ฉันค้นพบว่าเป็นไวยากรณ์ SDDL การขุดเพิ่มเติมนำฉันไปที่บทความนี้โดย Alun Jonesซึ่งอธิบายถึงวิธีการรับ descriptor ความปลอดภัยสำหรับบริการและความหมายของแต่ละบิต MS KB914392มีรายละเอียดเพิ่มเติม

หากต้องการผนวกตัวบอกความปลอดภัยที่มีอยู่ของเซอร์วิสให้ใช้sc sdshow "Service Name"เพื่อรับ descriptor ที่มีอยู่ หากนี่คือ. NET Windows Service แบบเก่าที่ธรรมดาของเราตัวบอกความปลอดภัยควรมีลักษณะดังนี้:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA
;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

เราจำเป็นต้องให้สิทธิ์RP(เพื่อเริ่มบริการ), WP(เพื่อหยุดบริการ), DT(เพื่อหยุด / ให้บริการต่อ) และLO(เพื่อสอบถามสถานะปัจจุบันของบริการ te) สิ่งนี้สามารถทำได้โดยการเพิ่มบัญชีบริการของเราไปยังกลุ่มผู้ใช้ที่มีอำนาจ แต่ฉันต้องการให้สิทธิ์การเข้าถึงบัญชีที่บริการการบำรุงรักษาแต่ละรายการเท่านั้น

การใช้runasเพื่อเปิดพรอมต์คำสั่งภายใต้บัญชีบริการฉันใช้งานwhoami /allซึ่งให้ SID ของบัญชีบริการจากนั้นสร้าง SDDL เพิ่มเติมด้านล่าง:

(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)

จากนั้นจะได้รับการเพิ่มในส่วนD:ของสตริง SDDL ด้านบน:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP
DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSWRPWPDTLOC
RSDRCWDWO;;;WD)

สิ่งนี้จะถูกนำไปใช้กับบริการโดยใช้sc sdsetคำสั่ง:

sc sdset "Service Name" D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;
CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU
)(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSW
RPWPDTLOCRSDRCWDWO;;;WD)

หากทุกอย่างเป็นไปตามแผนบริการสามารถเริ่มหยุดหยุดชั่วคราวและมีสถานะเป็นสอบถามโดยผู้ใช้ที่กำหนดโดย SID ข้างต้น


10
สำหรับวิธีที่ง่ายของการทำสิ่งเดียวกันคุณควรมีลักษณะที่ใช้SetACL.exe นี่คือตัวอย่างของวิธีการใช้เพื่อตั้งค่าการอนุญาตในการบริการ:SetACL.exe -on "\\server1\W32Time" -ot srv -actn ace -ace "n:domain1\group1;p:start_stop"
Mason G. Zhwiti

2
คุณสามารถใช้ Process Hacker ( processhacker.sourceforge.net ) สำหรับ GUI เพื่อกำหนดค่าบริการทั้งหมด มันมีบริการที่ซ่อนอยู่และช่วยให้คุณสามารถกำหนดการตั้งค่าเพิ่มเติมของบริการเช่นเส้นทางไบนารี - และสิทธิ์
ygoe

1
CoreTech gui ใช้งานได้สำหรับฉัน ยากที่จะเชื่อว่า GUI ไม่มีอยู่ใน windows อยู่แล้ว อ่านคำตอบที่นี่มันจะยากขนาดไหน? ความล้มเหลวครั้งใหญ่ในนามของ Microsoft
MikeKulls

ฉันต้องการเพิ่มCCLCSWสิทธิ์ SDDL (นอกเหนือจาก RPWPDTLO) ดังนั้นฉันสามารถดูบริการที่ระบุไว้เมื่อฉันเรียกใช้ Get-Service (ซึ่งขั้นแรกต้องแก้ไข SDDL สำหรับบริการตัวจัดการควบคุมบริการ scmanager เพื่อให้สามารถเข้าถึงบริการที่สามารถเข้าถึงรายการได้) . ฉันยังต้องSWสามารถเริ่มบริการบางอย่างได้
Baodad

34

ฉันมีปัญหาเดียวกัน
คุณสามารถใช้SubInACL.exeจาก Resource Kit ดาวน์โหลดยูทิลิตี้สแตนด์อโลนได้ที่นี่: http://www.microsoft.com/download/en/details.aspx?displaylang=th&id=23510

ใช้msiexec /a PathToMSIFile /qb TARGETDIR=DirectoryToExtractToเพื่อแยกไฟล์หากคุณไม่ต้องการติดตั้ง. msi

  1. เปิดพรอมต์คำสั่งในฐานะผู้ดูแลระบบ
  2. ไปที่ไดเรกทอรีที่คุณวาง. exe
  3. วิ่ง subinacl /service SERVICE_NAME /grant=COMPUTER_NAME\USERNAME=TOP

T = เริ่มบริการ
O = หยุดบริการ
P = หยุดชั่วคราว / บริการต่อ

การอ้างอิงแบบเต็ม: วิธีการให้สิทธิ์ผู้ใช้ในการจัดการบริการใน Windows 2000
หรือประเภทsubinacl /help

หมายเหตุ:อย่าพยายามsubinacl /service SERVICE_NAME /permอย่างที่อาจทำให้คุณเดือดร้อน (บทเรียนที่ได้รับ: P) ชื่อนี้อาจทำให้เข้าใจผิด (perm! = permission) เนื่องจากจะเป็นการลบการอนุญาตทั้งหมดสำหรับผู้ใช้ทั้งหมด (แม้แต่ผู้ดูแลระบบ!)


ไม่สามารถรวมบัญชี SO และ SF ขออภัย Pat
Chopper3

@ Chopper3 ขอบคุณสำหรับคำตอบของคุณ อันที่จริงฉันมี 2 บัญชี SO: มีการลงทะเบียนและเชื่อมโยงกับบัญชี SF นี้ อีกบัญชีหนึ่งเป็นบัญชี SO ที่ไม่ได้ลงทะเบียนที่ฉันมีก่อนลงทะเบียน (ใช้ที่อยู่อีเมลเดียวกัน ) ฉันหวังว่าทั้งสองจะรวมกันเพื่อให้ฉันสามารถติดตามโพสต์ที่ฉันทำมาก่อน ดังที่กล่าวไว้ที่นี่ฉันพยายามติดธงโพสต์ แต่ไม่สามารถทำได้บน SO (1 ชื่อเสียง) นี่คือเหตุผลที่ฉันตั้งค่าสถานะโพสต์นี้ ฉันพยายามส่งอีเมลไปที่ team@stackoverflow.com เมื่อสองสัปดาห์ก่อน แต่ไม่ได้รับคำตอบใด ๆ กรุณาพาฉันไปที่ที่ถูก / คนได้ไหม
patrx

1
ชำระเงินรายละเอียดของขั้นตอนนี้ที่ MSDN: support.microsoft.com/?kbid=288129
Marc Climent

4

คุณกำลังมองหาการกำหนดค่าคอมพิวเตอร์ - นโยบาย - การตั้งค่า Windows - การตั้งค่าความปลอดภัย - บริการระบบ

ที่นั่นคุณสามารถกำหนดประเภทเริ่มบริการไม่ได้เท่านั้น แต่คุณสามารถกำหนดค่า ACL ความปลอดภัยสำหรับแต่ละบริการได้เช่นกัน ตามค่าเริ่มต้นอินเทอร์เฟซจะแสดงรายการบริการที่ติดตั้งบนเครื่องที่คุณใช้งาน GP Editor เท่านั้น

วิธีเพิ่มบริการที่มีอยู่ในเครื่องอื่นเท่านั้น:

  • ส่งออกคีย์ reg ของบริการจากเครื่องอื่น
  • นำเข้าบนเครื่อง gpedit
  • ใช้นโยบาย
  • ลบรหัสที่นำเข้า

ฉันเชื่อว่าคุณหมายถึงทำสิ่งนี้ผ่านgpedit.mscเนื่องจากหน้าต่าง "จัดการเซิร์ฟเวอร์" ไม่ได้แสดงรายการโหนดนโยบาย ถ้าเป็นเช่นนั้นฉันไม่เห็นรายการภายใต้โหนดการตั้งค่าความปลอดภัยซึ่งอ้างอิง "บริการของระบบ" ตามที่คุณแนะนำด้านบนไม่ว่าจะเป็น Server 2008 หรือ Server 2003
abitgone

อ่าใช่ ฉันคิดว่าคุณกำลังวางแผนที่จะทำการเปลี่ยนแปลงเหล่านี้ผ่านนโยบายกลุ่ม
Ryan Bolger

1
แน่นอน - นี่ไม่ใช่เซิร์ฟเวอร์สมาชิก มีวิธีกำหนดเป้าหมายโดยใช้นโยบายท้องถิ่นหรือวิธีอื่นหรือไม่
abitgone

2

ฉันใช้ SubinAcl (ตามที่แนะนำโดย patrx) เพื่อให้สามารถเริ่ม MySQL เป็นผู้ใช้โดเมนปกติ (ไม่ใช่ผู้ดูแลระบบ) และทำงานได้อย่างสมบูรณ์! (คำสั่งจำเป็นต้องถูกดำเนินการในฐานะ -local อย่างน้อย - Admin)

คำสั่งคือ:

[PATH_TO_SUBACL]\subinacl.exe /service MySQL /grant=[Domain User - Without domain]=TOP

เพิ่งทราบว่าฉันป้อนผู้ใช้โดยไม่ใส่คำนำหน้ากับโดเมน ... มิฉะนั้นคำสั่งจะล้มเหลวในการแยกวิเคราะห์คำสั่ง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.