PowerShellでWindowsサービスを管理する方法を徹底解説!基本のコマンドレットと実践テクニック
Windowsサービスの管理は、services.mscスナップインやsc.exeコマンドラインツールだけでなく、PowerShellを使っても行えます。本記事では、PowerShellを使用したWindowsサービス管理のさまざまなシナリオについて詳しく解説します。
Windowsサービス管理に使えるPowerShellコマンドレット
Windowsサービスの状態確認や管理には、8つの基本的なサービス用コマンドレットが用意されています。サービス管理コマンドレットの一覧を取得するには、次のコマンドを実行します。
Get-Help *-Service
- Get-Service — ローカルまたはリモートコンピューター上のサービスを、実行中・停止中の状態にかかわらず取得できます。
- New-Service — 新しいサービスを作成します。レジストリおよびサービスデータベースに新しいエントリが登録されます。
- Restart-Service — サービスを再起動します。Windowsサービスコントローラー経由で再起動メッセージを送信します。
- Resume-Service — 一時停止中のサービスを再開します。Windowsサービスマネージャーに再開メッセージを送信します。
- Set-Service — ローカルまたはリモートサービスの設定(状態、説明、表示名、スタートアップの種類など)を変更します。サービスの開始・停止・一時停止にも使用できます。
- Start-Service — 停止しているサービスを開始します。
- Stop-Service — サービスを停止します。Windowsサービスマネージャーに停止メッセージを送信します。
- Suspend-Service — サービスを一時停止します。一時停止中のサービスはプロセス自体は動作していますが、Resume-Serviceコマンドレットなどで再開されるまで何も処理を行いません。
各コマンドレットの詳細な説明や使用例は、Get-Helpで確認できます。
Get-Help Start-Service
Get-ServiceでWindowsサービスの状態を確認する方法
Get-Serviceコマンドレットを使うと、ローカルまたはリモートコンピューター上のサービス一覧とその状態(Running/Stopped)を取得できます。-Nameパラメーターを使用すると、サービス名で絞り込みが可能です。サービス名にはワイルドカード文字*も指定できます。
正確なサービス名がわからない場合は、-DisplayNameパラメーターで表示名から検索できます。値のリストやワイルドカードも利用可能です。
リモートコンピューターのサービス状態を取得するには、Get-Serviceに-ComputerNameパラメーターを指定します。カンマ区切りで複数のコンピューター名を指定すれば、一度に複数台のリモートコンピューターへ問い合わせることもできます。例えば、次のコマンドはリモートコンピューターny-prnt1とny-prnt2上のSpoolerサービスの状態を取得します。
Get-Service spooler –ComputerName ny-prnt1,ny-prnt2
Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped spooler Print Spooler
サービスのすべてのプロパティを表示するには、Select-Objectコマンドレットを使用します。
Get-Service spooler | Select-Object *
Select-Objectコマンドレットを使えば、特定のプロパティだけを取得することもできます。例えば、Spoolerサービスの名前、状態、利用可能な操作を確認したい場合は次のようにします。
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*
Get-Serviceコマンドレットには、サービスの依存関係を確認するためのパラメーターが2つあります。
- -DependentServices — 指定したサービスに依存しているサービスを表示します。
- -RequiredServices — 指定したサービスが依存しているサービスを表示します。
次のコマンドは、Spoolerサービスの起動に必要なサービスを表示します。
Get-Service –Name Spooler -RequiredServices
逆に、Spoolerに依存しているサービスを表示するには、次のコマンドを実行します。
Get-Service –Name Spooler -DependentServices
特定の状態やパラメーターを持つサービスを検索したい場合は、Where-Objectコマンドレットを使用します。例えば、実行中のサービス一覧を取得するには次のようにします。
Get-Service | Where-Object {$_.status -eq 'running'}
スタートアップの種類が「手動」のサービスを表示するには、次のコマンドを実行します。
Get-Service | Where-Object {$_.starttype -eq 'Manual'}
特定のWindowsサービスが現在のコンピューターに存在するかどうかを確認するには、次のPowerShellスクリプトを使用します。
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}
PowerShellでサービスを停止・開始・再起動する方法
サービスの停止にはStop-Serviceコマンドレットを使用します。Spoolerサービスを停止するには、次のコマンドを実行します。
Stop-Service -Name spooler
Stop-Serviceコマンドレットは、実行後に何も表示しません。結果を確認したい場合は-PassThruパラメーターを使用してください。
なお、すべてのサービスが停止できるわけではありません。依存するサービスが存在する場合は、次のようなエラーが表示されます。
Cannot stop service because it has dependent services. It can only be stopped if force flag set.
サービスを強制的に停止するには、–Forceパラメーターを使用します。ただし、依存するすべてのサービスも同時に停止することに注意してください。
Stop-Service samss –Force -Passthru
次のコマンドは、「Running」状態にある指定されたサービス(bits、spooler)のみを停止します。
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service –passthru
なお、サービスが「Stopping」状態のまま固まってしまうことがあり、その場合は強制的に終了させる必要があります。
停止しているサービスを開始するには、Start-Serviceコマンドレットを使用します。
Start-Service -Name spooler -PassThru
依存するサービスが停止している場合、対象のサービスは開始できません。依存サービスを検索して一緒に開始するには、次のワンライナーが便利です。
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}
Suspend-Serviceコマンドレットは、一時停止に対応しているサービスを一時停止できます。サービスが一時停止可能かどうかを調べるには、Get-ServiceコマンドレットでCanPauseAndContinueプロパティを確認します。
Get-Service samss | Format-List name, canpauseandcontinue
一時停止可能なすべてのサービスの一覧を表示するには、次のコマンドを実行します。
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}
ここでは、SQLBrowserサービスを一時停止してみましょう。
Suspend-Service -Name SQLBrowser
一時停止したサービスを再開するには、Resume-Serviceコマンドレットを使用します。
Resume-Service -Name SQLBrowser
次のコマンドは、一時停止中のすべてのサービスを再開します。
get-service | where-object {$_.Status -eq "Paused"} | resume-service
サービスを再起動するには、Restart-Serviceコマンドレットを使用します。
Restart-Service -Name spooler
次のコマンドは、コンピューター上で停止しているすべてのネットワーク関連サービスを開始します。
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service
これらのコマンドには–ComputerNameパラメーターがありませんが、Invoke-Commandコマンドレットやパイプラインを使えば、リモートコンピューター上でも実行できます。
例えば、リモートコンピューターny-prnt1上のプリントスプーラーを再起動するには、次のコマンドを実行します。
Get-Service Spooler -ComputerName ny-prnt1 | Start-Service
デフォルトでは管理者のみがWindowsサービスの開始・停止を行えますが、特定のサービスに対して非管理者ユーザーに開始・停止・再起動の権限を付与することも可能です。
Set-Serviceでサービス設定を変更する
Set-Serviceコマンドレットを使用すると、ローカルまたはリモートコンピューター上のサービスの各種パラメーターや設定を変更できます。サービスの状態もプロパティの一つなので、このコマンドレットでサービスの開始・停止・一時停止を行うことも可能です。また、Set-Serviceには-StartupTypeパラメーターがあり、サービスのスタートアップの種類を変更できます。
Spoolerサービスのスタートアップの種類を「自動」に変更してみましょう。
Set-Service spooler –startuptype automatic –passthru
「手動」に変更する場合は次のようにします。
Set-Service spooler –startuptype manual –passthru
PowerShellでWindowsサービスを作成・削除する方法
New-Serviceは、Windowsに新しいサービスを作成するためのコマンドレットです。新しいサービスの名前と実行ファイルを指定します(PowerShellスクリプトをWindowsサービスとして実行することも可能です)。
ここでは、TestSvcという名前の新しいサービスを作成してみます。
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"
作成したサービスのスタートアップの種類や説明などの情報は、Get-WmiObjectコマンドレットで確認できます。
get-wmiobject win32_service -filter "name='testservice'"
新しいサービスの設定は、次のコマンドで変更できます。
Set-Service -Name TestSvc -Description 'My Service' -StartupType Manual
サービスを削除するには、次のコマンドを実行します。
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()
Windowsサービスの実行ユーザーアカウントを変更する
PowerShellを使えば、サービスの起動に使用するユーザーアカウントを変更することもできます。まず、TestSvcサービスの起動アカウント名を取得します。
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startname
Windowsサービスのユーザー名とパスワードを変更するには、次のコマンドを実行します。
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")
Change()メソッドのパラメーターリストが表示されます。StartNameとStartPasswordパラメーターの位置を数えてください。それぞれ20番目と21番目にあります。
$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")
gMSA(グループ管理サービスアカウント)のアカウント名を指定することもできます(この場合、パスワードの指定は不要です)。
このように、PowerShellを使えばWindowsサービスの管理は非常に簡単になります。サービスの作成、停止、開始、再開はもちろん、プロパティの変更も自由自在に行えます。ほとんどのコマンドレットは、リモートコンピューター上のサービス管理にも対応しています。
-
Windows 11でPowerShellを更新する3つの方法【初心者向け完全ガイド】
Windowsオペレーティングシステムを常に最新のソフトウェアとセキュリティアップデートの状態に保つことは、パソコンを快適に維持するために欠かせません。特にWindows 11は、以前のバージョンよりもセキュリティが強化されて設計されていますが、だからといってセキュリティ上の問題が一切起こらないわけではありません。OSを最新の状態に保てば、Microsoftが提供する新機能や新しい能力にもいち早くアクセスできるようになります。 当ブログを定期的にお読みの方なら、ソフトウェアの更新とパッチ適用の重要性はすでにご存じかもしれません。通常、これは最新のOSアップデート、サードパーティ製ソフトウェアの
-
Windowsのタグ機能でファイルとフォルダを効率よく管理する方法
古いファイルを探すのは、まるで石炭庫の中で黒猫を探すようなもの。「去年の南米旅行の写真、どこに保存したっけ?」「2018年に書いたあのレポート、ファイル名は何だったかな?」——そんな経験はありませんか。 Windows 10には強力な検索機能が標準搭載されており、Cortanaを活用すれば画像、音楽、PDFなどのフィルターを使ってスマートに検索できます。しかし、意外と見過ごされがちな機能の一つがWindowsタグです。この機能を使えば、ファイルをより効率的に検索・整理できるようになります。 Windowsタグとは?使うべき理由 タグは、Windows 10において最も過小評価されている機能の