คุณสามารถจัดการ Windows services ได้ไม่เพียงแค่จาก snap-in services.msc หรือเครื่องมือ command line sc.exe แต่ยังสามารถใช้ PowerShell ได้ ในบทความนี้ เราจะพิจารณาสถานการณ์ต่างๆ ของการจัดการ Windows services ด้วย PowerShell
PowerShell Cmdlets ที่ใช้จัดการ Windows Services
มี Service cmdlets พื้นฐาน 8 ตัวสำหรับดูสถานะของ Windows services และจัดการพวกเขา เพื่อรับรายการ cmdlets การจัดการ service ทั้งหมด ให้รันคำสั่งนี้:
Get-Help \*-Service

- Get-Service — ช่วยให้ได้ services บนคอมพิวเตอร์ท้องถิ่นหรือระยะไกลทั้งในสถานะ running หรือ stopped;
- New-Service – สร้าง service Cmdlet สร้างรายการใหม่สำหรับ Windows service ในรีจิสทรีและฐานข้อมูล service;
- Restart-Service – รีสตาร์ท service Cmdlet ส่งข้อความ restart ผ่าน Windows Service Controller;
- Resume-Service – ทำให้ service ทำงานต่อ Cmdlet ส่งข้อความ resume ไปยัง Windows Service Manager;
- Set-Service — เปลี่ยนการตั้งค่าของ local หรือ remote service รวมถึงสถานะ คำอธิบาย ชื่อที่แสดง หรือโหมดเริ่มต้น คุณยังสามารถใช้ cmdlet นี้เพื่อเริ่ม หยุด หรือระงับ service;
- Start-Service – เริ่ม service;
- Stop-Service – หยุด service (cmdlet ส่งข้อความหยุดไปยัง Windows Service Manager);
- Suspend-Service – ระงับ service บริการที่ถูกระงับยังคงทำงานอยู่ แต่ไม่ทำอะไรจนกว่าจะ resume (ตัวอย่างเช่น ด้วย Resume-Service cmdlet)
คุณสามารถรับคำอธิบายโดยละเอียดและตัวอย่างการใช้งาน cmdlet เฉพาะด้วย Get-Help:
Get-Help Start-Service

วิธีตรวจสอบสถานะ Windows Service ด้วย Get-Service
คุณสามารถรับรายการ services และสถานะของพวกเขา (Running/Stopped) บนคอมพิวเตอร์ท้องถิ่นหรือระยะไกลโดยใช้ cmdlet Get-Service พารามิเตอร์ –Name ช่วยให้เลือก services โดยชื่อ ชื่อ service สามารถระบุได้โดยใช้ wildcard character *

หากคุณไม่ทราบชื่อ service ที่แน่นอน คุณสามารถค้นหาได้โดย displayed name โดยใช้พารามิเตอร์ –DisplayName คุณสามารถใช้รายการค่าและ wildcard ได้

ใช้ cmdlet Get-Service พร้อมพารามิเตอร์ -ComputerName เพื่อรับสถานะ service บนคอมพิวเตอร์ระยะไกล คุณสามารถสอบถามสถานะ service บนคอมพิวเตอร์ระยะไกลหลายเครื่องพร้อมกันได้โดยระบุชื่อของพวกเขาโดยคั่นด้วย comma ตัวอย่างเช่น คำสั่งที่แสดงด้านล่างรับสถานะ Spooler service บนคอมพิวเตอร์ระยะไกล ny-prnt1 และ ny-prnt2
Get-Service spooler –ComputerName ny-prnt1,ny-prnt2
Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped spooler Print Spooler
เพื่อแสดงคุณสมบัติทั้งหมดของ service ให้ใช้ cmdlet Select-Object:
Get-Service spooler | Select-Object *

Select-Object cmdlet ช่วยให้ได้คุณสมบัติเฉพาะของ service ตัวอย่างเช่น คุณต้องการดูชื่อ สถานะ และตัวเลือกที่มีอยู่ของ Spooler service:
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*
cmdlet Get-Service มีสองพารามิเตอร์ที่ช่วยให้คุณดู service dependencies:
- -DependentServices ช่วยแสดง services ที่พึ่งพา service ที่กำหนด
- -RequiredServices แสดง services ที่ service ที่กำหนดพึ่งพา
คำสั่งต่อไปนี้แสดง services ที่จำเป็นสำหรับเริ่ม Spooler service:
Get-Service –Name Spooler -RequiredServices

คำสั่งต่อไปนี้แสดง services ที่พึ่งพา Spooler:
Get-Service –Name Spooler -DependentServices
หากคุณต้องการค้นหา services ที่มีสถานะหรือพารามิเตอร์เฉพาะ ให้ใช้ cmdlet Where-Object ตัวอย่างเช่น มาได้รายการ services ที่กำลังทำงาน:
Get-Service | Where-Object {$_.status -eq 'running'}

เพื่อแสดง services ที่มี startup type เป็น manual ให้รันคำสั่งนี้:
Get-Service | Where-Object {$_.starttype -eq 'Manual'}

ใช้สคริปต์ PowerShell ต่อไปนี้เพื่อตรวจสอบว่า Windows service เฉพาะมีอยู่บนคอมพิวเตอร์ปัจจุบันหรือไม่:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}
วิธีหยุด เริ่ม หรือรีสตาร์ท Service ด้วย PowerShell
คุณสามารถหยุด service โดยใช้ cmdlet Stop-Service เพื่อหยุด Spooler ให้รันคำสั่ง:
Stop-Service -Name spooler
Stop-Service cmdlet ไม่แสดงอะไรหลังการดำเนินการ เพื่อดูผลลัพธ์ ให้ใช้พารามิเตอร์ -PassThru

โปรดสังเกตว่าไม่ใช่ทุก service ที่สามารถหยุดได้ หากมี dependent services คุณจะเห็นข้อผิดพลาด:
Cannot stop service because it has dependent services. It can only be stopped if force flag set.

เพื่อบังคับให้ service หยุด ให้ใช้พารามิเตอร์ –Force คุณควรจำว่า dependent services ทั้งหมดก็จะหยุดด้วย:
Stop-Service samss –Force -Passthru
คำสั่งต่อไปนี้จะหยุด services ที่ระบุ (bits, spooler) หากพวกเขาอยู่ในสถานะ "Running":
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service –passthru

บางครั้ง services ค้างอยู่ในสถานะ "Stopping" และต้องถูก kill โดยบังคับ
Cmdlet Start-Service เริ่ม service ที่หยุดแล้ว:
Start-Service -Name spooler -PassThru

Service จะไม่เริ่ม หาก dependent services ใดๆ ถูกหยุด เพื่อค้นหาและเริ่มพวกเขา ให้ใช้ one-liner PowerShell ต่อไปนี้:
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}

Cmdlet Suspend-Servce สามารถระงับ services ได้หากพวกเขารองรับสถานะนี้ เพื่อเรียนรู้ว่า service สามารถระงับได้หรือไม่ ให้ใช้ cmdlet Get-Service พร้อมคุณสมบัติ CanPauseAndContinue
Get-Service samss | Format-List name, canpauseandcontinue

เพื่อแสดงรายการ services ทั้งหมดที่อาจถูกระงับ ให้รันคำสั่งนี้:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}

ลองระงับ SQLBrowser service:
Suspend-Service -Name SQLBrowser

เพื่อ resume service ที่ถูกระงับ ให้ใช้ cmdlet Resume-Service :
Resume-Service -Name SQLBrowser

คำสั่งต่อไปนี้จะ resume services ที่ถูกระงับทั้งหมด:
get-service | where-object {$_.Status -eq "Paused"} | resume-service
Cmdlet Restart-Service จะรีสตาร์ท service:
Restart-Service -Name spooler

คำสั่งนี้เริ่ม network services ที่หยุดทั้งหมดบนคอมพิวเตอร์:
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service
คำสั่งเหล่านี้ไม่มีพารามิเตอร์ –ComputerName แต่คุณสามารถรันบนคอมพิวเตอร์ระยะไกลโดยใช้ Invoke-Command cmdlet หรือ pipe
ตัวอย่างเช่น เพื่อรีสตาร์ท print spooler บนคอมพิวเตอร์ระยะไกล ny-prnt1 ให้รันคำสั่ง:
Get-Service Spooler -ComputerName ny-prnt1 | Start-Service
โดยค่าเริ่มต้น เฉพาะแอดมินเท่านั้นที่สามารถเริ่ม/หยุด Windows services ได้ แต่คุณสามารถให้สิทธิ์ผู้ใช้ที่ไม่ใช่แอดมินเริ่ม/หยุด/รีสตาร์ท service เฉพาะได้
การใช้ Set-Service เพื่อเปลี่ยนการตั้งค่า Service
Cmdlet Set-Service ช่วยให้คุณเปลี่ยนพารามิเตอร์หรือการตั้งค่าใดๆ ของ service บนคอมพิวเตอร์ท้องถิ่นหรือระยะไกล เนื่องจากสถานะของ service เป็นคุณสมบัติ คุณสามารถใช้ cmdlet นี้เพื่อเริ่ม หยุด หรือระงับ service Set-Service มีพารามิเตอร์ -StartupType ที่ช่วยเปลี่ยน startup type ของ service
ลองเปลี่ยน startup type ของ Spooler เป็น automatic:
Set-Service spooler –startuptype automatic –passthru

คุณสามารถตั้งค่า startup type เป็น manual:
Set-Service spooler –startuptype manual –passthru

วิธีสร้างหรือลบ Windows Service ผ่าน PowerShell
New-Service – เป็น cmdlet สำหรับสร้าง service ใหม่ใน Windows ระบุชื่อและ executable file สำหรับ service ใหม่ (คุณแม้แต่สามารถรัน PowerShell script เป็น Windows service ได้)
ลองสร้าง service ใหม่ชื่อ TestSvc:
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"

รับข้อมูลเกี่ยวกับ startup type และคำอธิบายของ service โดยใช้ cmdlet Get-WmiObject
get-wmiobject win32_service -filter "name='testservice'"

คุณสามารถเปลี่ยนการตั้งค่าของ service ใหม่โดยใช้คำสั่งต่อไปนี้:
Set-Service -Name TestSvc -Description ‘My Service’ -StartupType Manual

เพื่อลบ service ให้รันคำสั่งนี้:
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()
การเปลี่ยนบัญชีผู้ใช้ที่รัน Windows Service
คุณสามารถใช้ PowerShell เพื่อเปลี่ยนบัญชีผู้ใช้ที่ใช้เริ่ม service รับชื่อบัญชีที่ใช้เริ่ม TestSvc:
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startname

เพื่อเปลี่ยน username และ password สำหรับ Windows Service ให้รันคำสั่งต่อไปนี้:
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")
รายการพารามิเตอร์ของเมธอด Change() ถูกแสดง นับตำแหน่งที่ StartName และ StartPassword parameters อยู่: พวกเขาอยู่ที่ตำแหน่งที่ 20 และ 21 ตามลำดับ

$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 services ง่ายขึ้น คุณสามารถสร้าง หยุด เริ่ม หรือ resume services และเปลี่ยนคุณสมบัติของพวกเขา ได้ ส่วนใหญ่ cmdlets ช่วยให้จัดการ services บนคอมพิวเตอร์ระยะไกล