วิธีจัดการบริการ Windows ด้วย PowerShell
คุณสามารถจัดการบริการ Windows ได้ไม่เพียงแค่จากเครื่องมือบรรทัดคำสั่ง services.msc snap-in หรือ sc.exe แต่ยังใช้ PowerShell ได้อีกด้วย ในบทความนี้ เราจะพิจารณาสถานการณ์ต่างๆ ในการจัดการบริการ Windows ด้วย PowerShell
PowerShell Cmdlets ใช้เพื่อจัดการบริการ Windows
มี Service cmdlet พื้นฐานแปดรายการเพื่อดูสถานะของบริการ Windows และจัดการ หากต้องการดูรายการ cmdlet ของการจัดการบริการทั้งหมด ให้รันคำสั่งนี้:
Get-Help \*-Serviceรับบริการ — อนุญาตให้รับบริการบนเครื่องคอมพิวเตอร์ในพื้นที่หรือระยะไกลทั้งในสถานะกำลังทำงานหรือหยุดทำงาน
-
บริการใหม่ - สร้างบริการ cmdlet สร้างรายการใหม่สำหรับบริการ Windows ในรีจิสทรีและในฐานข้อมูลบริการ
เริ่มบริการใหม่ - เริ่มบริการใหม่ cmdlet ส่งข้อความรีสตาร์ทผ่าน Windows Service Controller;
Resume-Service - กลับมาใช้บริการต่อ cmdlet ส่งข้อความดำเนินการต่อไปยัง Windows Service Manager;
ตั้งค่าบริการ — เปลี่ยนการตั้งค่าของบริการภายในหรือระยะไกล รวมถึงสถานะ คำอธิบาย ชื่อที่แสดง หรือโหมดเริ่มต้น คุณยังสามารถใช้ cmdlet นี้เพื่อเริ่ม หยุด หรือระงับบริการ
เริ่มบริการ - เริ่มบริการ
Stop-Service - หยุดบริการ (cmdlet ส่งข้อความหยุดไปยัง Windows Service Manager)
ระงับบริการ - ระงับบริการ บริการที่ถูกระงับยังคงทำงานอยู่ แต่จะไม่ดำเนินการใดๆ จนกว่าจะกลับมาใช้งานอีกครั้ง (ตัวอย่างเช่น ด้วย Resume-Service cmdlet)
คุณสามารถรับคำอธิบายโดยละเอียดและตัวอย่างการใช้ cmdlet เฉพาะด้วย Get-Help:
Get-Help Start-Serviceจะตรวจสอบสถานะบริการ Windows ด้วย Get-Service ได้อย่างไร
คุณสามารถรับรายการบริการและสถานะของบริการ (กำลังทำงาน/หยุดทำงาน) บนคอมพิวเตอร์ในระบบหรือระยะไกลโดยใช้ cmdlet Get-Service พารามิเตอร์ -ชื่อ ช่วยให้สามารถเลือกบริการตามชื่อได้ สามารถระบุชื่อบริการได้โดยใช้อักขระตัวแทน
*
หากคุณไม่ทราบชื่อบริการที่แน่นอน คุณสามารถค้นหาได้จากชื่อที่แสดงโดยใช้พารามิเตอร์ -DisplayName คุณสามารถใช้รายการค่าและสัญลักษณ์แทน
ใช้ cmdlet Get-Service กับพารามิเตอร์ -ComputerName เพื่อรับสถานะบริการบนคอมพิวเตอร์ระยะไกล คุณสามารถสอบถามสถานะบริการบนคอมพิวเตอร์ระยะไกลหลายเครื่องพร้อมกันโดยระบุชื่อโดยคั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่น คำสั่งที่แสดงด้านล่างได้รับสถานะบริการ Spooler บนคอมพิวเตอร์ระยะไกล ny-prnt1 และ ny-prnt2
Get-Service spooler -ComputerName ny-prnt1,ny-prnt2Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler
Stopped spooler Print Spoolerหากต้องการแสดงคุณสมบัติทั้งหมดของบริการ ให้ใช้ cmdlet Select-Object:
Get-Service spooler | Select-Object *cmdlet Select-Object อนุญาตให้รับคุณสมบัติเฉพาะของบริการ ตัวอย่างเช่น คุณต้องการดูชื่อ สถานะ และตัวเลือกที่มีของบริการตัวจัดคิว:
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*cmdlet Get-Service มีพารามิเตอร์สองตัวที่อนุญาตให้คุณดูการขึ้นต่อกันของบริการ:
-
-DependentServices อนุญาตให้แสดงบริการที่ขึ้นอยู่กับบริการที่กำหนด
-RequiredServices แสดงบริการที่บริการนั้นขึ้นอยู่กับ
คำสั่งต่อไปนี้แสดงบริการที่จำเป็นในการเริ่มบริการ Spooler:
Get-Service -Name Spooler -RequiredServicesคำสั่งต่อไปนี้แสดงบริการที่ขึ้นอยู่กับ Spooler:
Get-Service -Name Spooler -DependentServicesหากคุณต้องการค้นหาบริการที่มีสถานะหรือพารามิเตอร์เฉพาะ ให้ใช้ cmdlet Where-Object ตัวอย่างเช่น มาดูรายการบริการที่กำลังทำงานอยู่:
Get-Service | Where-Object {$_.status -eq 'running'}หากต้องการแสดงบริการด้วยประเภทการเริ่มต้นด้วยตนเอง ให้รันคำสั่งนี้:
Get-Service | Where-Object {$_.starttype -eq 'Manual'}ใช้สคริปต์ PowerShell ต่อไปนี้เพื่อตรวจสอบว่ามีบริการ Windows เฉพาะบนคอมพิวเตอร์เครื่องปัจจุบันหรือไม่:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}จะหยุด เริ่ม หรือเริ่มบริการใหม่ด้วย PowerShell ได้อย่างไร
คุณสามารถหยุดบริการโดยใช้ cmdlet Stop-Service หากต้องการหยุด Spooler ให้รันคำสั่ง:
Stop-Service -Name spoolercmdlet หยุดบริการไม่แสดงอะไรหลังจากดำเนินการ หากต้องการดูผลลัพธ์ ให้ใช้พารามิเตอร์ -PassThru
โปรดทราบว่าไม่สามารถหยุดทุกบริการได้ หากมีบริการที่ต้องพึ่งพา คุณจะเห็นข้อผิดพลาด:
Cannot stop service because it has dependent services. It can only be stopped if force flag set.หากต้องการบังคับให้บริการหยุด ให้ใช้พารามิเตอร์ - บังคับ คุณควรจำไว้ว่าบริการที่เกี่ยวข้องทั้งหมดจะหยุดลงด้วย:
Stop-Service samss -Force -Passthruคำสั่งต่อไปนี้จะหยุดบริการที่ระบุ (บิต, สพูลเลอร์) หากอยู่ในสถานะ "กำลังทำงาน":
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service -passthruบางครั้งบริการวางสายในสถานะ "หยุด" และต้องถูกบังคับฆ่า
cmdlet Start-Service เริ่มบริการที่หยุดทำงาน:
Start-Service -Name spooler -PassThruบริการจะไม่เริ่มทำงาน หากบริการที่เกี่ยวข้องหยุดทำงาน หากต้องการค้นหาและเริ่มใช้ PowerShell one-liner ต่อไปนี้:
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}cmdlet Suspend-Servce สามารถหยุดบริการชั่วคราวได้หากสนับสนุนสถานะนี้ หากต้องการทราบว่าสามารถระงับบริการได้หรือไม่ ให้ใช้ cmdlet Get-Service ที่มีคุณสมบัติ CanPauseAndContinue
Get-Service samss | Format-List name, canpauseandcontinueหากต้องการแสดงรายการบริการทั้งหมดที่อาจหยุดชั่วคราว ให้รันคำสั่งนี้:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}มาระงับบริการ SQLBrowser:
Suspend-Service -Name SQLBrowserหากต้องการดำเนินการต่อกับบริการที่ถูกระงับ ให้ใช้ cmdlet Resume-Service :
Resume-Service -Name SQLBrowserคำสั่งต่อไปนี้จะกลับมาใช้บริการที่ถูกระงับทั้งหมด:
get-service | where-object {$_.Status -eq "Paused"} | resume-servicecmdlet รีสตาร์ทบริการ จะรีสตาร์ทบริการ:
Restart-Service -Name spoolerคำสั่งนี้เริ่มบริการเครือข่ายที่หยุดทำงานทั้งหมดบนคอมพิวเตอร์:
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-serviceคำสั่งเหล่านี้ไม่มีพารามิเตอร์ -ComputerName แต่คุณสามารถเรียกใช้คำสั่งเหล่านี้บนคอมพิวเตอร์ระยะไกลได้โดยใช้ Invoke-Command cmdlet หรือไพพ์
ตัวอย่างเช่น หากต้องการรีสตาร์ทตัวจัดคิวการพิมพ์บนคอมพิวเตอร์ระยะไกล ny-prnt1 ให้รันคำสั่ง:
Get-Service Spooler -ComputerName ny-prnt1 | Start-Serviceตามค่าเริ่มต้น เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถเริ่ม/หยุดบริการ Windows ได้ แต่คุณสามารถให้สิทธิ์ในการเริ่ม/หยุด/เริ่มระบบใหม่แก่ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบในบริการเฉพาะได้
การใช้ Set-Service เพื่อเปลี่ยนการตั้งค่าบริการ
cmdlet Set-Service ช่วยให้คุณสามารถเปลี่ยนพารามิเตอร์หรือการตั้งค่าของบริการบนคอมพิวเตอร์ในระบบหรือระยะไกล เนื่องจากสถานะของบริการเป็นคุณสมบัติ คุณสามารถใช้ cmdlet นี้เพื่อเริ่ม หยุด หรือระงับบริการ Set-Service มีพารามิเตอร์ -StartupType ที่อนุญาตให้เปลี่ยนประเภทการเริ่มต้นของบริการ
มาเปลี่ยนประเภทการเริ่มต้น Spooler เป็นอัตโนมัติ:
Set-Service spooler -startuptype automatic -passthruคุณสามารถตั้งค่าประเภทการเริ่มต้นด้วยตนเอง:
Set-Service spooler -startuptype manual -passthruจะสร้างหรือลบบริการ Windows ผ่าน PowerShell ได้อย่างไร
บริการใหม่ - เป็น cmdlet สำหรับสร้างบริการใหม่ใน Windows ระบุชื่อและไฟล์ปฏิบัติการสำหรับบริการใหม่ (คุณยังสามารถเรียกใช้สคริปต์ PowerShell เป็นบริการ Windows)
มาสร้างบริการใหม่ด้วยชื่อ TestSvc:
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"รับข้อมูลเกี่ยวกับประเภทการเริ่มต้นและคำอธิบายของบริการโดยใช้ Get-WmiObject cmdlet
get-wmiobject win32_service -filter "name='testservice'"คุณสามารถเปลี่ยนการตั้งค่าของบริการใหม่ได้โดยใช้คำสั่งต่อไปนี้:
Set-Service -Name TestSvc -Description ‘My Service’ -StartupType Manualหากต้องการลบบริการ ให้รันคำสั่งนี้:
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()เปลี่ยนบัญชีผู้ใช้ที่เรียกใช้บริการ Windows
คุณสามารถใช้ PowerShell เพื่อเปลี่ยนบัญชีผู้ใช้ที่ใช้ในการเริ่มบริการ รับชื่อบัญชีที่ใช้ในการเริ่ม TestSvc:
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startnameหากต้องการเปลี่ยนชื่อผู้ใช้และรหัสผ่านสำหรับ Windows Service ให้รันคำสั่งต่อไปนี้:
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")รายการพารามิเตอร์เมธอด Change() แสดงขึ้น นับตำแหน่งที่พารามิเตอร์ StartName และ StartPassword อยู่ที่ตำแหน่งที่ 20th และ 21st ตามลำดับ
$svc | Invoke-WmiMethod -Name Change -ArgumentList @ ($null,$null,$null,$null,$null,$null,$null, $null,$null,$null,$null,$null,$null,$null,$null,$null, $null,$null,$null,"Administrator","!123Pa$$w0rd")หรือคุณสามารถป้อนชื่อบัญชี gMSA (ไม่ได้ระบุรหัสผ่านบัญชีในกรณีนี้)
อย่างที่คุณเห็น PowerShell ทำให้การจัดการบริการ Windows เป็นเรื่องง่าย คุณสามารถสร้าง หยุด เริ่มหรือกลับมาใช้บริการต่อ และเปลี่ยนคุณสมบัติได้ cmdlet ส่วนใหญ่อนุญาตให้จัดการบริการบนคอมพิวเตอร์ระยะไกล


























