みなさんこんにちは!ヒロポンです!
毎朝、出社して最初の仕事が「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-WebAppPoolState で Started が返ってくれば、いま動いてる証拠。
ここまで来れば、いい感じに第一歩クリアです。あとは 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"
LastTaskResult が 0 なら成功。
あとはスクリプトの 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回通してください。
まとめ
毎朝の手作業が、これで丸ごと自動化できました。
WebAdministrationを読み込んで状態確認Restart-WebAppPool+ 前後ログのスクリプトを保存Register-ScheduledTaskで毎朝の実行を登録-ExecutionPolicy Bypassと実行ユーザー権限を押さえる- 手動実行で動作確認
一度組んでしまえば、あとは勝手に走ってくれる。
「忘れて電話が来る」あの事故が消えるだけで、朝の精神衛生がだいぶ変わります!!
同じ自動化の発想は 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 で経歴詳細を見る
次に読むべき記事




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



