在 PowerShell 中管理服務
- 在 PowerShell 中列出服務
- 在 PowerShell 中查詢遠端服務
- 在 PowerShell 中啟動和停止服務
- 在 PowerShell 中重新啟動服務
- 在 PowerShell 中更改服務的啟動型別
Windows 服務是幾乎每個 Windows 系統管理員都必須使用的主題之一。當然,要管理 Windows 服務,我們可以啟動 services.msc
MMC 管理單元來完成一次性任務,但是如果我們需要使用 PowerShell 構建一些自動化呢?
本文將討論所有 PowerShell 服務 cmdlet、使用它們並開發我們的指令碼以在本地或遠端管理多臺計算機上的服務。
在 PowerShell 中列出服務
我們可以使用 Windows PowerShell 和服務完成的最基本任務之一就是簡單地列舉本地或遠端計算機上存在的服務。例如,開啟 PowerShell,執行 Get-Service
命令,然後觀察輸出。
Get-Service
命令本身將列出本地計算機上的所有服務以及每個服務的 Status
、Name
和 DisplayName
。
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-Service
和 Stop-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-Service
和 Stop-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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn