こんにちは。日々是発見が楽しみな西山です。
システムからのアラート通知。最近はSlackやDiscordなど、チャットツールのチャンネルに投げていることも多いでしょう。
では、Windowsのイベントログを拾って通知させたい時はどうすればいいでしょう?
ということで作ってみました。
How to
-
投稿先チャンネルの「Webhook」URLを取得します。未設定の場合はWebhookを作成しましょう(※画面はスマホ版です)。

-
拡張子が「.ps1」のPowershellスクリプトを作成し、以下のコードを貼り付けます。
変数「$webhookUrl」には上で取得したWebhookのURLを入れます。
$webhookUrl = "https://discord.com/api/webhooks/..."
$body = @{
content = "💤 PC がスリープから復帰しました ($(hostname) / $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'))"
} | ConvertTo-Json
$maxRetry = 10
$interval = 10
for ($i = 0; $i -lt $maxRetry; $i++) {
try {
Invoke-RestMethod -Uri $webhookUrl -Method Post -ContentType "application/json" -Body $body
break
}
catch {
Start-Sleep -Seconds $interval
}
}
- Windowsのイベントビューアで、通知させたいイベントの「ログ名」「ソース」「イベントID」を探します。

- 「コンピュータの管理」から「タスクスケジューラ」を開き、新規タスクを作成します。
- タスクのトリガー条件を「イベント時」で指定し、先ほどの「ログ名」「ソース」「イベントID」を指定します。

- タスクで実行する「操作」を新規作成します。
「プログラム/スクリプト」には「pwsh.exe」、「引数の追加」には「-ExecutionPolicy Bypass -NonInteractive -WindowsStyle Hidden -File "【ps1ファイルのパス】」を入力します。
- タスクができたら、一度手動実行して動作を確認しましょう。
タスク一覧画面で右クリックし、「実行する」を選びます。
スクリプトが実行され、Discordのチャンネルに投稿されれば出来上がりです。

注意点
- このスクリプトには新しいPowershell(Powershell 7)が必要です。Windows初期インストールに含まれるレガシーPowershellでは動作しません。
未インストールの場合は公式Githubリポジトリからダウンロード・インストールしましょう。 -
スクリプトは文字コードUTF-8で作ります。Windowsでテキストファイルを作ると文字コードShift-JISで作りがちですが、POST先はUTF-8として処理するので日本語や絵文字が化けて事故ります。メモ帳は使わず、VSCodeでファイルを作れば間違いないですね。
- これはWindowsに限らない話ですが、WebhookにPOSTできる文字数には上限があります。Discordだと4096文字、Slackはもっと厳しく3000文字となっています。これを超えるとPOSTが400エラーで失敗し、何も残りません!。
特にイベントログの内容や、処理結果のサマリなどを添付すると文字数制限にかかりやすいので、送信前にあふれた残りは切り捨てるなどの処理を入れておく必要がありますね。
※4096文字や3000文字はPOSTするJSON全体の制限なので、それを考慮して最大文字数を設定する必要があります。

