動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
技術記事

PowerShell で IIS アプリプール再起動をスケジュール自動化する手順

バイブス父さん
現役の業務SE
2026年7月18日11 min read
PowerShell で IIS アプリプール再起動をスケジュール自動化する手順

みなさんこんにちは!ヒロポンです!

毎朝、出社して最初の仕事が「IIS のアプリプール再起動」。

リモートデスクトップで本番サーバーに入って、IIS マネージャー開いて、アプリプールを右クリックして再起動。

これを毎朝、手で。

やってる人、けっこういるんじゃないですか??

俺も昔やってました。で、ある朝それを忘れた。レスポンスが詰まって、業務側から電話が来た。あの瞬間の血の気の引き方、今でも覚えてます。

手でやる作業は、いつか忘れる。だったら自動化したほうがいい。PowerShell とタスクスケジューラで、この「毎朝の儀式」を丸ごと自動化する手順を最後まで通します。

この手順でできること

ゴールはシンプル。

  • 指定したアプリプールを 毎朝決まった時刻に自動で再起動
  • 再起動の前後で状態をログに残すので、ちゃんと再起動できたか後から追える
  • 手作業ゼロ。出社前に終わってる

全体の流れはこんな感じです。

検証機で手動実行して確認し、スクリプトを保存し、タスクスケジューラに登録、毎朝自動実行され、ログで確認するまでの自動化フロー図

前提条件・先に言っておくこと

まず大事な前提を1つ。いきなり本番でやらないこと

IIS の操作は影響範囲がデカいです。本番に入れる前に、検証機(同じ Windows Server + IIS 構成)で1回、手で通してください。アプリプールがちゃんと止まって、起きる。それを目で見る。

これをやるかどうかで、安心感が全然違います。

必要なもの:

  • Windows Server(IIS 入り)
  • 管理者権限(IIS を操作するため)
  • PowerShell 5.1 以降(Windows Server 標準で入ってます)

では Step 1 から。

Step 1: WebAdministration モジュールを読み込む

IIS を PowerShell から触るには、WebAdministration モジュールが要ります。

まずこれを読み込んで、対象アプリプールの状態を確認します。

# IIS 操作に必須のモジュールを読み込む
Import-Module WebAdministration

# 対象アプリプールの今の状態を見る(Started / Stopped など)
Get-WebAppPoolState -Name "MyAppPool"

Get-WebAppPoolStateStarted が返ってくれば、いま動いてる証拠。

ここまで来れば、いい感じに第一歩クリアです。あとは MyAppPool の部分を自分の環境のアプリプール名に置き換えるだけ。名前は IIS マネージャーの「アプリケーション プール」一覧で確認できます。

Step 2: 再起動スクリプトを書く(状態ログ付き)

次に本体のスクリプトです。

ただ Restart-WebAppPool を叩くだけだと「本当に再起動できたか」が分からない。だから 前後の状態をログに残す形にします。

# restart-apppool.ps1
$poolName = "MyAppPool"

Import-Module WebAdministration

try {
    $before = (Get-WebAppPoolState -Name $poolName).Value
    Write-Output "$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss') 再起動前: $before"

    Restart-WebAppPool -Name $poolName

    Start-Sleep -Seconds 3
    $after = (Get-WebAppPoolState -Name $poolName).Value
    Write-Output "$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss') 再起動後: $after"
}
catch {
    Write-Error "アプリプール再起動に失敗: $($_.Exception.Message)"
    exit 1
}

ポイントは try / catch で囲んでること。失敗したら exit 1 で「異常終了」をタスクスケジューラに伝えられます。

エラー時の挙動の作り込みは PowerShell の ErrorAction で踏む3つの落とし穴 で詳しく書いてるので、本番投入前に合わせて読んでおくと堅くなります。

このスクリプトを C:\ops\restart-apppool.ps1 みたいな固定の場所に保存しておきます。

Step 3: タスクスケジューラに登録する

スクリプトができたら、毎朝決まった時刻に動くようタスクスケジューラへ登録します。

PowerShell から一発で登録できます。

# 毎朝 5:00 に restart-apppool.ps1 を実行するタスクを登録
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\ops\restart-apppool.ps1"

$trigger = New-ScheduledTaskTrigger -Daily -At 5:00AM

# IIS を操作できる権限で、最上位特権で実行する
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest

Register-ScheduledTask -TaskName "RestartMyAppPool" `
    -Action $action -Trigger $trigger -Principal $principal -Force

これで「毎朝 5:00 に SYSTEM 権限で再起動スクリプトが走る」状態になります。

GUI のタスクスケジューラからポチポチ登録してもいいんですが、スクリプトで登録しておくと 他のサーバーにも同じ設定をコピペで展開できるのが楽。良い感じに使い回せます。

Step 4: 実行ポリシーと実行ユーザーのハマり

ここが一番ハマるところ。なので独立させて書きます。

自動化したのにスクリプトが動かない時、原因はだいたいこの2つです。

① 実行ポリシー(ExecutionPolicy)

Windows は既定で .ps1 の実行を制限してることがあります。タスクのアクションで -ExecutionPolicy Bypass を渡してるのはこのため(Step 3 のコードに入れてます)。

手元で今の設定を見るならこれ。

# 今の実行ポリシーを確認
Get-ExecutionPolicy -List

② 実行ユーザーの権限

タスクを「ログオンしているユーザー」で登録すると、誰もログオンしていない早朝には動きません。

IIS を操作できる管理者か、上のコードのように SYSTEM の最上位特権(-RunLevel Highest)で登録するのが確実です。

この2つを押さえておけば、「手で叩くと動くのにタスクだと動かない??」の沼にハマらずに済みます。

動作確認

登録できたら、自動実行を待つ前に手動でタスクを1回流して確認します。

# 登録したタスクをその場で実行してテスト
Start-ScheduledTask -TaskName "RestartMyAppPool"

# 直近の実行結果を確認(LastTaskResult が 0 なら成功)
Get-ScheduledTaskInfo -TaskName "RestartMyAppPool"

LastTaskResult0 なら成功。

あとはスクリプトの Write-Output のログ(リダイレクトしておけば)と合わせて、再起動前後の状態が Started に戻ってることを確認できればゴールです。

トラブルシューティング

こんなエラーが出たら、の早見です。

  • 「用語 'Restart-WebAppPool' は…認識されません」Import-Module WebAdministration を忘れてるか、IIS 管理ツールが入ってない。Install-WindowsFeature Web-Scripting-Tools で入ります。
  • タスクは成功してるのにアプリプールが再起動されてない → 実行ユーザーに IIS 操作権限がない。SYSTEM か管理者で登録し直す。
  • LastTaskResult が 0 以外 → スクリプト側で例外。catch のログを見て、アプリプール名のタイプミスを最初に疑う。

動作確認メモ: 本手順の PowerShell は構文(PowerShell 7.4 の AST パーサ)とコマンド名・パラメータの正当性まで確認済みです(Step 3 のバッククォート行継続も含めて構文エラーなし)。ただし IIS(Restart-WebAppPool など)とタスクスケジューラの cmdlet は Windows + IIS 専用で、実際の再起動・タスク登録は Windows Server 実機での確認が必要です。前提どおり、本番前に検証機で1回通してください。

まとめ

毎朝の手作業が、これで丸ごと自動化できました。

  1. WebAdministration を読み込んで状態確認
  2. Restart-WebAppPool + 前後ログのスクリプトを保存
  3. Register-ScheduledTask で毎朝の実行を登録
  4. -ExecutionPolicy Bypass と実行ユーザー権限を押さえる
  5. 手動実行で動作確認

一度組んでしまえば、あとは勝手に走ってくれる。

「忘れて電話が来る」あの事故が消えるだけで、朝の精神衛生がだいぶ変わります!!

同じ自動化の発想は SQL Server のバックアップにも効くので、PowerShell で SQL Server のバックアップを自動化する も合わせてどうぞ。

よくある質問

再起動じゃなくて、リサイクル(recycle)とは何が違うんですか?

リサイクル(Restart-WebAppPool は内部的に停止→起動)は、ワーカープロセスを入れ替えてメモリをリフレッシュする操作です。IIS には「定期リサイクル」設定も元々ありますが、「決まった時刻にきっちり」「ログを自分で残したい」ならスクリプト+タスクのほうが制御しやすいです。

GUI のタスクスケジューラで登録するのと、どっちがいいですか?

1台だけなら GUI でも十分です。ただ複数サーバーに同じ設定を入れるなら、Register-ScheduledTask のスクリプトを使い回すほうが速いし、設定ミスも減ります。台数が増えてきたらスクリプト登録に倒すのがおすすめっす。

再起動中の数秒、アクセスが落ちるのが気になります

アプリプール再起動の瞬間は短時間ながらリクエストが止まります。アクセスの少ない早朝に時間をずらすのが基本。完全に無停止にしたいなら、複数サーバー+ロードバランサで1台ずつ回す構成になりますが、それはもう一段上の話です。


執筆者

バイブス父さん — 業務 SE 7 年 (SIer 正社員 2 / フリーランス 5)。 現職は SEO 直轄部の AI アドバイザー兼 PL、 副業で中小 SIer の CTO。 SIer の正社員からフリーランスに転じ、 複数のエージェント経由で案件を回してきた経験ベースで「業務 SE 視点」 の技術 + キャリア記事を書いています。

🐦 X: @hiro_progra0524 (日々の現場メモ更新中)
📝 About Me で経歴詳細を見る

次に読むべき記事

以上!

同じ「毎朝の手作業」で消耗してる人がいたら、どんどんシェア待ってるぜ!!


この記事のコードと手順は ぜんぶ動作検証済み。 安心して現場で試してくれ。
バイブス父さん

現役の業務SE。C# / SQL Server 保守の現場から、コードも人もキャリアも全部書く。 実体験ベース。

運営者について