Bạn có thể quản lý dịch vụ Windows không chỉ từ snap-in services.msc hoặc công cụ dòng lệnh sc.exe, mà còn bằng PowerShell. Trong bài viết này, chúng ta sẽ xem xét các kịch bản khác nhau để quản lý dịch vụ Windows với PowerShell.
Các Cmdlet PowerShell Dùng để Quản Lý Dịch Vụ Windows
Có tám cmdlet Service cơ bản để xem trạng thái dịch vụ Windows và quản lý chúng. Để lấy danh sách đầy đủ cmdlet quản lý dịch vụ, chạy lệnh này:
Get-Help \*-Service

- Get-Service — cho phép lấy dịch vụ trên máy tính cục bộ hoặc từ xa cả ở trạng thái chạy hoặc dừng;
- New-Service – tạo một dịch vụ. Cmdlet tạo một mục nhập mới cho dịch vụ Windows trong registry và trong cơ sở dữ liệu dịch vụ;
- Restart-Service – khởi động lại một dịch vụ. Cmdlet gửi thông điệp khởi động lại qua Windows Service Controller;
- Resume-Service – tiếp tục một dịch vụ. Cmdlet gửi thông điệp tiếp tục đến Windows Service Manager;
- Set-Service — thay đổi cài đặt của một dịch vụ cục bộ hoặc từ xa, bao gồm trạng thái, mô tả, tên hiển thị hoặc chế độ khởi động. Bạn cũng có thể dùng cmdlet này để bắt đầu, dừng hoặc tạm dừng một dịch vụ;
- Start-Service – bắt đầu một dịch vụ;
- Stop-Service – dừng một dịch vụ (cmdlet gửi thông điệp dừng đến Windows Service Manager);
- Suspend-Service – tạm dừng một dịch vụ. Dịch vụ tạm dừng vẫn đang chạy, nhưng nó không làm gì cho đến khi được tiếp tục (ví dụ: với cmdlet Resume-Service).
Bạn có thể lấy mô tả chi tiết và ví dụ sử dụng một cmdlet cụ thể với Get-Help:
Get-Help Start-Service

Cách Kiểm Tra Trạng Thái Dịch Vụ Windows với Get-Service?
Bạn có thể lấy danh sách dịch vụ và trạng thái của chúng (Running/Stopped) trên máy tính cục bộ hoặc từ xa bằng cmdlet Get-Service. Tham số –Name cho phép chọn dịch vụ theo tên. Tên dịch vụ có thể được chỉ định bằng ký tự đại diện *.

Nếu bạn không biết tên dịch vụ chính xác, bạn có thể tìm nó bằng tên hiển thị của nó sử dụng tham số –DisplayName. Bạn có thể sử dụng danh sách giá trị và ký tự đại diện.

Sử dụng cmdlet Get-Service với tham số -ComputerName để lấy trạng thái dịch vụ trên máy tính từ xa. Bạn có thể truy vấn trạng thái dịch vụ trên nhiều máy tính từ xa cùng lúc bằng cách chỉ định tên của chúng cách nhau bởi dấu phẩy. Ví dụ: lệnh dưới đây lấy trạng thái dịch vụ Spooler trên các máy tính từ xa ny-prnt1 và ny-prnt2.
Get-Service spooler –ComputerName ny-prnt1,ny-prnt2
Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped spooler Print Spooler
Để hiển thị tất cả thuộc tính của một dịch vụ, sử dụng cmdlet Select-Object:
Get-Service spooler | Select-Object *

Cmdlet Select-Object cho phép lấy các thuộc tính cụ thể của một dịch vụ. Ví dụ: bạn muốn xem tên, trạng thái và các tùy chọn có sẵn của dịch vụ Spooler:
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*
Cmdlet Get-Service có hai tham số cho phép bạn xem các phụ thuộc dịch vụ:
- -DependentServices cho phép hiển thị các dịch vụ phụ thuộc vào dịch vụ đã cho
- -RequiredServices hiển thị các dịch vụ mà dịch vụ đã cho phụ thuộc vào
Lệnh sau hiển thị các dịch vụ cần thiết để khởi động dịch vụ Spooler:
Get-Service –Name Spooler -RequiredServices

Lệnh sau hiển thị các dịch vụ phụ thuộc vào Spooler:
Get-Service –Name Spooler -DependentServices
Nếu bạn muốn tìm dịch vụ với trạng thái hoặc tham số cụ thể, sử dụng cmdlet Where-Object. Ví dụ: hãy lấy danh sách dịch vụ đang chạy:
Get-Service | Where-Object {$_.status -eq 'running'}

Để hiển thị các dịch vụ với kiểu khởi động thủ công, chạy lệnh này:
Get-Service | Where-Object {$_.starttype -eq 'Manual'}

Sử dụng script PowerShell sau để kiểm tra xem một dịch vụ Windows cụ thể có tồn tại trên máy tính hiện tại hay không:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}
Cách Dừng, Khởi Động hoặc Khởi Động Lại Dịch Vụ với PowerShell?
Bạn có thể dừng một dịch vụ bằng cmdlet Stop-Service. Để dừng Spooler, chạy lệnh:
Stop-Service -Name spooler
Cmdlet Stop-Service không hiển thị gì sau khi thực thi. Để xem kết quả, sử dụng tham số -PassThru.

Xin lưu ý rằng không phải dịch vụ nào cũng có thể dừng được. Nếu có bất kỳ dịch vụ phụ thuộc nào, bạn sẽ thấy lỗi:
Cannot stop service because it has dependent services. It can only be stopped if force flag set.

Để buộc một dịch vụ dừng, sử dụng tham số –Force . Bạn nên nhớ rằng tất cả các dịch vụ phụ thuộc cũng sẽ dừng:
Stop-Service samss –Force -Passthru
Lệnh sau sẽ dừng các dịch vụ được chỉ định (bits, spooler) nếu chúng ở trạng thái “Running”:
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service –passthru

Đôi khi dịch vụ bị treo ở trạng thái “Stopping” và phải bị kill mạnh.
Cmdlet Start-Service khởi động một dịch vụ đã dừng:
Start-Service -Name spooler -PassThru

Một dịch vụ sẽ không khởi động, nếu bất kỳ dịch vụ phụ thuộc nào của nó bị dừng. Để tìm và khởi động chúng, sử dụng one-liner PowerShell sau:
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}

Cmdlet Suspend-Servce có thể tạm dừng dịch vụ nếu chúng hỗ trợ trạng thái này. Để biết xem một dịch vụ có thể tạm dừng được không, sử dụng cmdlet Get-Service với thuộc tính CanPauseAndContinue.
Get-Service samss | Format-List name, canpauseandcontinue

Để hiển thị danh sách tất cả các dịch vụ có thể tạm dừng, chạy lệnh này:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}

Hãy tạm dừng dịch vụ SQLBrowser:
Suspend-Service -Name SQLBrowser

Để tiếp tục một dịch vụ đã tạm dừng, sử dụng cmdlet Resume-Service :
Resume-Service -Name SQLBrowser

Lệnh sau sẽ tiếp tục tất cả các dịch vụ đã tạm dừng:
get-service | where-object {$_.Status -eq "Paused"} | resume-service
Cmdlet Restart-Service sẽ khởi động lại một dịch vụ:
Restart-Service -Name spooler

Lệnh này khởi động tất cả các dịch vụ mạng đã dừng trên máy tính:
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service
Các lệnh này không có tham số –ComputerName, nhưng bạn có thể chạy chúng trên máy tính từ xa bằng cmdlet Invoke-Command hoặc pipe.
Ví dụ: để khởi động lại print spooler trên máy tính từ xa ny-prnt1, chạy lệnh:
Get-Service Spooler -ComputerName ny-prnt1 | Start-Service
Theo mặc định, chỉ quản trị viên mới có thể bắt đầu/dừng dịch vụ Windows, nhưng bạn có thể cấp cho người dùng không phải admin quyền bắt đầu/dừng/khởi động lại trên một dịch vụ cụ thể.
Sử Dụng Set-Service để Thay Đổi Cài Đặt Dịch Vụ
Cmdlet Set-Service cho phép bạn thay đổi bất kỳ tham số hoặc cài đặt nào của một dịch vụ trên máy tính cục bộ hoặc từ xa. Vì trạng thái của một dịch vụ là một thuộc tính, bạn có thể dùng cmdlet này để bắt đầu, dừng hoặc tạm dừng một dịch vụ. Set-Service có tham số -StartupType cho phép thay đổi kiểu khởi động của một dịch vụ.
Hãy thay đổi kiểu khởi động của Spooler thành tự động:
Set-Service spooler –startuptype automatic –passthru

Bạn có thể đặt kiểu khởi động thủ công:
Set-Service spooler –startuptype manual –passthru

Cách Tạo hoặc Xóa Dịch Vụ Windows qua PowerShell?
New-Service – là cmdlet để tạo dịch vụ mới trong Windows. Chỉ định tên và file thực thi cho dịch vụ mới (bạn thậm chí có thể chạy script PowerShell như một dịch vụ Windows).
Hãy tạo một dịch vụ mới với tên TestSvc:
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"

Lấy thông tin về kiểu khởi động và mô tả của dịch vụ bằng cmdlet Get-WmiObject.
get-wmiobject win32_service -filter "name='testservice'"

Bạn có thể thay đổi cài đặt của dịch vụ mới bằng lệnh sau:
Set-Service -Name TestSvc -Description ‘My Service’ -StartupType Manual

Để xóa một dịch vụ, chạy lệnh này:
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()
Thay Đổi Tài Khoản Người Dùng Chạy Dịch Vụ Windows
Bạn có thể dùng PowerShell để thay đổi tài khoản người dùng dùng để khởi động một dịch vụ. Lấy tên tài khoản dùng để khởi động TestSvc:
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startname

Để thay đổi tên người dùng và mật khẩu cho Dịch Vụ Windows, chạy các lệnh sau:
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")
Danh sách tham số phương thức Change() được hiển thị. Đếm vị trí tham số StartName và StartPassword: chúng nằm ở vị trí 20 và 21 tương ứng.

$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")
Hoặc bạn có thể nhập tên tài khoản gMSA (mật khẩu tài khoản không được chỉ định trong trường hợp này).
Như bạn thấy, PowerShell làm cho việc quản lý dịch vụ Windows trở nên dễ dàng. Bạn có thể tạo, dừng, bắt đầu hoặc tiếp tục dịch vụ, và thay đổi thuộc tính của chúng. Hầu hết cmdlet cho phép quản lý dịch vụ trên máy tính từ xa.