在 PowerShell 中管理服務

Marion Paul Kenneth Mendoza 2023年1月30日
  1. 在 PowerShell 中列出服務
  2. 在 PowerShell 中查詢遠端服務
  3. 在 PowerShell 中啟動和停止服務
  4. 在 PowerShell 中重新啟動服務
  5. 在 PowerShell 中更改服務的啟動型別
在 PowerShell 中管理服務

Windows 服務是幾乎每個 Windows 系統管理員都必須使用的主題之一。當然,要管理 Windows 服務,我們可以啟動 services.msc MMC 管理單元來完成一次性任務,但是如果我們需要使用 PowerShell 構建一些自動化呢?

本文將討論所有 PowerShell 服務 cmdlet、使用它們並開發我們的指令碼以在本地或遠端管理多臺計算機上的服務。

在 PowerShell 中列出服務

我們可以使用 Windows PowerShell 和服務完成的最基本任務之一就是簡單地列舉本地或遠端計算機上存在的服務。例如,開啟 PowerShell,執行 Get-Service 命令,然後觀察輸出。

Get-Service 命令本身將列出本地計算機上的所有服務以及每個服務的 StatusNameDisplayName

Get-Service

輸出:

Status   Name               DisplayName
------   ----               -----------
Stopped  AarSvc_55244       AarSvc_55244
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Running  AMD Crash Defen... AMD Crash Defender Service
<SNIP>

與許多其他 cmdlet 一樣,PowerShell 不會返回每個服務的所有屬性。

例如,雖然我們希望檢視所需的服務或服務描述,但我們可以通過將結果傳遞給 Select-Object 命令並使用 * 萬用字元來表示所有屬性來找到這些屬性。

Get-Service ALG | Select *

輸出:

Name                : ALG
RequiredServices    : {}
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : False
DisplayName         : Application Layer Gateway Service
DependentServices   : {}
MachineName         : .
ServiceName         : ALG
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Stopped
ServiceType         : Win32OwnProcess
StartType           : Manual
Site                :
Container           :

在 PowerShell 中查詢遠端服務

也許我們在網路上,需要在一臺或多臺遠端 Windows 計算機上列舉服務。在 Windows PowerShell 時代,我們可以通過使用 -ComputerName 引數來完成此操作,但不幸的是,該引數不再存在。

檢查遠端計算機上的 Windows 服務的一種方法是使用 Windows PowerShell Remoting(或 PS Remoting)。使用 PS Remoting 可以封裝任何本地命令並在遠端會話中呼叫它,就像我們在本地執行它一樣。

假設我們在遠端計算機上啟用了 PowerShell Remoting,例如,我們可以使用 Invoke-Command cmdlet 在遠端計算機上執行 Get-Service 命令。

$cred = Get-Credential
Invoke-Command -ComputerName SRV1 -ScriptBlock { Get-Service } -Credential $cred

輸出:

Status         Name          DisplayName     PSComputerName
------         ----          -----------     --------------
Stopped     AarSvc_55244     AarSvc_55244        SRV1
<SNIP>

執行後,Invoke-Command cmdlet 會傳遞 Get-Service 返回的所有資訊,並且服務將按預期返回給你。

請注意 Invoke-Command cmdlet 返回的額外 PSComputerName 屬性。我們還可以建立一個簡單的指令碼來列舉許多遠端計算機上的服務。

在 PowerShell 中啟動和停止服務

我們還可以使用 Windows PowerShell 啟動和停止服務。

Start-ServiceStop-Service cmdlet 完全符合我們的預期。接下來,我們可以使用下面的管道或 -Name 引數。

## Stop a service
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName

## Stop a service with the pipeline
Get-Service $wuauserv | Stop-Service

所有*-Service cmdlet 都允許我們使用 -Name-DisplayName 引數來完成服務名稱值。只需鍵入 -Name 引數,後跟一個空格,然後按 Tab 鍵。

我們將看到它迴圈遍歷本地計算機上的所有服務。同樣的概念也適用於作為服務啟動。

## Start a service
$serviceName = 'wuauserv'
Start-Service -Name $serviceName

## Start service with the pipeline
Get-Service $wuauserv | Start-Service

Start-ServiceStop-Service 命令都是冪等的,這意味著如果服務已啟動或已停止,並且當服務已處於該狀態時我們嘗試停止或啟動該服務,則 cmdlet 將跳過該服務.

同樣,要使用 PowerShell 停止和啟動遠端服務,你需要將這些命令包裝在指令碼塊中,並使用 PowerShell Remoting 遠端呼叫它們,如下所示。

$cred = Get-Credential
$serviceName = 'wuauserv'
Invoke-Command -ComputerName SRV02 -ScriptBlock { Start-Service -Name $using:serviceName } -Credential $cred

在 PowerShell 中重新啟動服務

為了限制程式碼重用以使用 Windows PowerShell 重新啟動服務,我們最好使用 Restart-Service cmdlet。這個 cmdlet 精確地執行我們的想法,並且與其他服務命令類似地操作。

例如,如果我們想啟動和停止如上例所示的 wuauserv 服務,我們可以通過將 Get-Service 的輸出直接通過管道傳輸到 Restart-Service 來節省一些程式碼,如下所示以下。

## Restart a service with the Name parameter
$serviceName = 'wuauserv'
Get-Service -Name $serviceName | Restart-Service

在 PowerShell 中更改服務的啟動型別

服務的啟動型別是指示 Windows 啟動時服務做什麼的屬性。再說一次,我們有幾個選擇。

  • 自動:該服務在 Windows 啟動時自動啟動。
  • 禁用:除非更改,否則服務將永遠不會啟動。
  • 手動:服務可以啟動,但必須手動完成。
  • 自動 - 延遲:服務自動啟動,但在 Windows 啟動後延遲。

首先,我們需要知道什麼是啟動型別。你可以通過 Get-Service 找到它。

如果你使用 Get-Service 查詢啟動型別,你會發現 Get-Service 將其稱為 Status 並表示為 Status 屬性。

(Get-Service -Name wuauserv | select *).StartType

輸出:

Manual

一旦你知道當前的啟動型別,我們就可以使用 Set-Service 對其進行更改。下面的示例將啟動型別設定為自動

Set-Service -Name <service name> -StartupType Automatic
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相關文章 - PowerShell Service