HOWTO · PowerShell

PowerShell でサービスを管理する方法

この記事では、PowerShell サービス cmdlet について、使用方法、およびローカルまたはリモートの多くのコンピュータでサービスを管理するためのスクリプトを開発する方法について説明します。

Windows サービスは、ほぼすべての Windows システム管理者が使用しなければならないトピックの一つです。もちろん、Windows サービスを管理するために、単発のタスクのために services.msc MMC スナップインを開始することもできますが、PowerShell で自動化を構築する必要がある場合はどうでしょうか?

この記事では、すべての PowerShell サービスコマンドレットについて説明し、それらを使用して、ローカルまたはリモートで多くのコンピュータのサービスを管理するスクリプトを開発します。

PowerShell でサービスをリストする

Windows PowerShell とサービスで達成できる最も基本的なタスクの一つは、ローカルコンピュータまたはリモートコンピュータに存在するサービスを単に列挙することです。たとえば、PowerShell を開き、Get-Service コマンドを実行し、出力を観察します。

Get-Service コマンド単独では、ローカルコンピュータ上のすべてのサービスと、各サービスの StatusName、および 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