PowerShell でサービスを管理する方法
- PowerShell でサービスをリストする
- PowerShell でリモートサービスを見つける
- PowerShell でサービスを開始および停止する
- PowerShell でサービスを再起動する
- PowerShell でサービスのスタートアップタイプを変更する

Windows サービスは、ほぼすべての Windows システム管理者が使用しなければならないトピックの一つです。もちろん、Windows サービスを管理するために、単発のタスクのために services.msc
MMC スナップインを開始することもできますが、PowerShell で自動化を構築する必要がある場合はどうでしょうか?
この記事では、すべての PowerShell サービスコマンドレットについて説明し、それらを使用して、ローカルまたはリモートで多くのコンピュータのサービスを管理するスクリプトを開発します。
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>
多くの他のコマンドレットと同様に、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 でリモートサービスを見つける
もしかしたら、私たちはネットワーク上にいて、1 台または複数のリモート Windows コンピュータ上でサービスを列挙する必要があるかもしれません。Windows PowerShell 時代には -ComputerName
パラメーターを使用してこれを行うことができましたが、残念ながら、そのパラメーターはもう存在しません。
リモートコンピュータ上の Windows サービスを調査する方法の一つは、Windows PowerShell リモーティング(または PS リモーティング)を使用することです。PS リモーティングを使用すると、すべてのローカルコマンドをカプセル化し、ローカルで行っていたのと同様にリモートセッションで呼び出すことができます。
リモートコンピュータで PowerShell リモーティングが有効になっていると仮定すると、たとえば、Invoke-Command
コマンドレットを使用してリモートコンピュータで 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
コマンドレットは、Get-Service
が返したすべての情報を渡し、サービスは期待通りに返されます。
Invoke-Command
コマンドレットによって返される追加の PSComputerName
プロパティに注意してください。多くのリモートコンピュータにわたってサービスを列挙するための簡単なスクリプトを作成することもできます。
PowerShell でサービスを開始および停止する
Windows PowerShell を使用して、サービスを開始および停止することもできます。
Start-Service
および Stop-Service
コマンドレットは、私たちが期待することを正確に行います。次に、パイプラインまたは以下の -Name
パラメーターを使用できます。
## Stop a service
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName
## Stop a service with the pipeline
Get-Service $wuauserv | Stop-Service
すべての*-Service
コマンドレットでは、-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
コマンドは冪等であるため、サービスが開始または停止している場合、すでにその状態にあるときにサービスを停止または開始しようとすると、コマンドレットはサービスをスキップします。
PowerShell でリモートサービスを停止および開始するには、再びこれらのコマンドをスクリプトブロックにラップし、PowerShell リモーティングを使用してリモートで呼び出す必要があります。以下に示します。
$cred = Get-Credential
$serviceName = 'wuauserv'
Invoke-Command -ComputerName SRV02 -ScriptBlock { Start-Service -Name $using:serviceName } -Credential $cred
PowerShell でサービスを再起動する
Windows PowerShell でサービスを再起動するためにコードの再利用を制限するには、Restart-Service
コマンドレットを使用するのがよいでしょう。このコマンドレットは私たちが考えていることを正確に行い、他のサービスコマンドと同様に動作します。
たとえば、上記の前の例に示したように、wuauserv
サービスを開始および停止したい場合、Get-Service
の出力を直接 Restart-Service
にパイプすることで、コードを節約できます。
## Restart a service with the Name parameter
$serviceName = 'wuauserv'
Get-Service -Name $serviceName | Restart-Service
PowerShell でサービスのスタートアップタイプを変更する
サービスのスタートアップタイプは、Windows が起動したときにサービスがどのように動作するかを決定する属性です。だからもう一度、いくつかのオプションがあります。
Automatic
: Windows が起動する際にサービスが自動的に開始します。Disabled
: サービスは変更されない限り決して開始されません。Manual
: サービスは手動で開始することができます。Automatic – Delayed
: サービスは自動的に開始されますが、Windows の起動後に遅延されます。
まず、スタートアップタイプが何であるかを知る必要があります。Get-Service
を使用してこれを見つけることができます。
スタートアップタイプを見つけるために Get-Service
を使用している場合、Get-Service
がこれを Status
と呼び、Status
プロパティとして表されていることがわかります。
(Get-Service -Name wuauserv | select *).StartType
出力:
Manual
現在のスタートアップタイプがわかったら、Set-Service
を使用して変更できます。以下の例は、スタートアップタイプを Automatic
に設定しています。
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