การรีสตาร์ทบริการตามกำหนดเวลาด้วย Powerhshell เป็นบัญชีบริการที่ไม่ใช่ผู้ดูแลระบบ


11

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

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

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

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

ฉันให้สิทธิ์บัญชีบริการผ่านนโยบายกลุ่มเพื่อเริ่มและหยุดบริการ

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันเข้าสู่เซิร์ฟเวอร์ด้วยบัญชีบริการฉันสามารถเริ่มบริการด้วยตนเองโดยใช้ Services MMC ฉันยังสามารถเรียกใช้สคริปต์ powershell และทำสิ่งที่ควรจะทำ: สำรวจโฟลเดอร์ย้ายไฟล์และเริ่มบริการ ที่ดี!

ในระยะต่อไปฉันสร้างงานที่กำหนดเวลาไว้ซึ่งทำงานทุกๆ 10 นาที งานใช้บัญชีบริการเดียวกับบริการเพื่อเรียกใช้งานสคริปต์ PowerShell มีการทำเครื่องหมายที่ช่อง "ดำเนินการด้วยสิทธิ์ระดับสูง" อย่างที่ฉันบอกว่าสคริปต์ powershell ต้องการการเข้าถึงไดรฟ์เครือข่ายดังนั้นฉันจึงไม่สามารถเรียกใช้ในฐานะผู้ดูแลระบบเซิร์ฟเวอร์ในพื้นที่และฉันไม่ต้องการใช้ข้อมูลประจำตัวของผู้ดูแลโดเมนสำหรับงานที่มีลักษณะเช่นนี้ (ฉันพยายามใช้หลักการของสิทธิ์น้อยที่สุดเท่าที่จะทำได้)

ฉันให้สิทธิ์บริการบัญชี "เข้าสู่ระบบเป็นชุดงาน" บนเซิร์ฟเวอร์ภายในโดยใช้ Local Security Policy MMC

ตอนนี้สำหรับส่วนที่ฉันไม่สามารถเข้าใจได้: ในเวลาที่กำหนดภารกิจที่กำหนดเวลาไว้เสร็จสมบูรณ์แล้วและสคริปต์ PowerShell กำลังดำเนินการอยู่ สคริปต์สำรวจความคิดเห็นโฟลเดอร์และไฟล์ข้อผิดพลาดจะถูกย้าย สิ่งเดียวที่ใช้งานไม่ได้คือการเริ่มบริการใหม่ ... ?! อีกครั้งการรันสคริปต์ด้วยตนเองเมื่อผู้ใช้รายเดียวกันทำงานได้อย่างสมบูรณ์

ฉันไม่ค่อยเห็นตัวแสดงเหตุการณ์มากนัก แต่การบันทึกสคริปต์ของฉันระบุข้อผิดพลาดนี้:

TerminatingError (Stop-Service): "ไม่สามารถเปิด Service Control Manager บนคอมพิวเตอร์ '.' การดำเนินการนี้อาจต้องใช้สิทธิ์อื่น ๆ "

คำสั่งที่ฉันใช้เพื่อเริ่มบริการใหม่คือ:

Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])

(ฉันใช้ windows server 2012 R2 และ powershell รุ่น 4 บนโดเมน 2008 R2)

อัปเดต: ฉันทั้งคู่พยายามตั้งค่าสิทธิ์บริการสำหรับผู้ใช้โดยใช้ subinacl (ตามที่อธิบายไว้ที่นี่ ) และตั้งค่าสตริง SDDL ด้วยตนเอง (ดังอธิบายไว้ที่นี่ ) ดังนั้นแฟล็กควบคุมของฉันจึงมีลักษณะดังนี้ (A ;; CCLCSWRPWPDTLOCRRC ;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-xxxxxxxxx-XXXX) ฉันพยายามตั้งค่าสิทธิ์ของบริการเป็น Full Control ใน GPO สิ่งเหล่านี้ไม่สามารถแก้ไขปัญหาได้ ฉันต้องมีปัญหากับสิทธิ์ใช้งานบางแห่งที่ฉันยังคงมองเห็นอยู่เพราะเมื่อฉันกำหนดเวลางานด้วยบัญชีโดเมนที่เป็นผู้ดูแลระบบภายในเซิร์ฟเวอร์ก็ทำงานได้ดี


นี่อาจเป็นความช่วยเหลือของserverfault.com/questions/357424/..ดูเหมือนว่า powershell จะพิถีพิถันมากเกี่ยวกับการอนุญาตและไม่ใช่สิ่งที่ชัดเจน
Drifter104


@ Drifter104: แม้ว่าฉันจะใช้ GPO เพื่อตั้งค่าการอนุญาตในการบริการไม่ใช่ subinacl ฉันได้ลองใช้พารามิเตอร์ STOE ต่อไป แต่ก็ยังเห็นผลลัพธ์เดียวกัน ตรวจสอบการตั้งค่า GPO ของฉันอีกครั้งและเปิดใช้ตัวเลือก Enumerate Dependent Services เช่นกัน
VolrathTheFallen

@ MyronSemack-msemack ฉันพยายามตั้งค่าสตริง SDDL สำหรับบริการด้วยตนเองเหมือนที่อธิบายไว้ในบทความ แต่ก็ยังไม่มีโชคฉันคิดว่าในที่สุด GPO และ subinacl ทำสิ่งเดียวกันเนื่องจากดูเหมือนว่าพวกเขาจะแทนที่อย่างใดอย่างหนึ่ง
VolrathTheFallen

1
ลองSet-Service $($service[1]) -status stopped -ComputerName . -Verbose ....แทนStop-ServiceCmdLet ได้อย่างไร เห็นได้ชัดว่า Stop-Service และ Start-Service ไม่สามารถใช้รีโมตได้ตามคำตอบนี้: ไม่สามารถใช้ Get-Service –ComputerName บนคอมพิวเตอร์ระยะไกลและข้อความแสดงข้อผิดพลาดของคุณอาจเกี่ยวข้องกับการพยายามเชื่อมต่อกับ localhost "remote" (<== นั่นคือจุดที่นั่น)
John aka hot2use

คำตอบ:


3

ผู้ตอบคำถามอื่นแก้ปัญหาของฉันได้เช่นกัน

ขั้นตอนที่ฉันทำคือ:

  1. enable-psremoting บนเซิร์ฟเวอร์ในพรอมต์ผู้ดูแลระบบ PowerShell
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI บนเซิร์ฟเวอร์ในพรอมต์ผู้ดูแลระบบ PowerShell
  3. เพิ่มบัญชีบริการ (หรือกลุ่มความปลอดภัย) ด้วยสิทธิ์แบบเต็ม
  4. sc sdshow scmanager บนเซิร์ฟเวอร์ในพรอมต์คำสั่งผู้ดูแลระบบ
  5. คัดลอกเอาต์พุต SDDL
  6. เพิ่ม(A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)ใน SDDL ก่อนส่วน S:
  7. sc sdset scmanager THE_MODIFIED_SDDL ของฉันดูเหมือนว่านี้: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. เปลี่ยนสคริปต์ powershell ของฉันดังนั้นมันจึงใช้Start-ServiceCmdLet แทนSet-Service(Set-Service ใช้งานไม่ได้)

ดูเหมือนว่าบางสิ่งที่เรียบง่ายกลายเป็นทาง, วิธีที่ซับซ้อนกว่าที่ควรจะเป็น ...

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