ぐっどもーにんぐ

Windows10で勝手にスリープが解除されてしまう事象についてとりあえず起動したことを通知する方法を考えてみました。
いつのWindowsからかは知りませんが、タスクスケジューラーにて特定のWindowsイベントログを検知した場合にアクションをするようにすることが出来るので、まずそれを利用してみることに。
オプションを見ると外部プログラムの実行とメール送信(非推奨)という項目があるじゃないですか。
ここでメール送信をやれば一発解決なんですが、「非推奨」と書いてあるとおり推奨されておらず項目を入れてもエラーとなってしまったり。

なんで使えない項目があるんだとプンスカしますがどうやら古いWindowsからバージョンアップしたときに表示されないのは困るよねといったニーズによるものだそうです。
さてさて、直接メール送信が使えないとなると外部プログラムに頼ることになります。
VBSとかバッチとかいろいろありますが、GmailへのSSL通信をする必要上PowerShellを使用してみることにしました。

PowerShellは従来のコマンドプロンプトでは出来なかったことをできるようにするすごいやつです。
Windows10ではPowerShell4.0が乗っかっているようです。

以下がGmailへメールを送信するスクリプトになります。
(いろいろしらべてどこからかぱくってきたもの)

■イベントログを取得するバッチ

@echo off

echo ■最後にスリープを解除したデバイス > C:\powercfg.log
powercfg /lastwake >> C:\powercfg.log
echo; >> C:\powercfg.log

echo ■スリープ解除を許可したデバイス >> C:\powercfg.log
powercfg -devicequery wake_armed >> C:\powercfg.log
echo; >> C:\powercfg.log

echo ■スリープ状態の解除を要求したタイマー >> C:\powercfg.log
powercfg -waketimers >> C:\powercfg.log
echo; >> C:\powercfg.log

echo ■過去12時間のPower-Troubleshooterイベント >> C:\powercfg.log
wevtutil qe System /f:text /q:”*[System[(EventID=1) and TimeCreated[timediff(@SystemTime) <= 43200000]]]” >> C:\powercfg.log

■メールを送るスクリプト

param($msgTo,$msgSubject,$msgBody)
#ログ取得
Start-Process -FilePath イベントログを取得するバッチのフルパス -Wait

#SMTPサーバーの設定
$smtpHost = “SMTPサーバー”
$msgFrom = “差し出し元メールアドレス”
$accountName = “ログイン名”
$accountPass = “パスワード”
$smtpPort = ポート番号 #SMTPポート番号
$smtpSSL = $false #SSL暗号化($trueまたは$false)
$powerLog = (Get-Content C:\powercfg.log) -join “rn”

#SMTPクライアントの設定
$objEmail = new-object System.Net.Mail.SmtpClient
$objEmail.Host = $smtpHost
$objEmail.Port = $smtpPort
$objEmail.EnableSSL = $smtpSSL
$objEmail.Credentials = New-Object Net.NetworkCredential
$objEmail.Credentials.UserName = $accountName
$objEmail.Credentials.Password = $accountPass
#メッセージ送信
#$objEmail.Send($msgFrom,$msgTo,$msgSubject,$msgBody)
$objEmail.Send($msgFrom,$msgTo,$msgSubject,$powerLog)

■タスクスケジューラー

・トリガー
1

・操作
2
参照からPowershellのスクリプトファイルを指定し引数のところにスクリプトファイルのフルパスが書いてあると思うのでそこに「スクリプトファイルフルパス 送信先 タイトル」を書きます。

なお、PowerShellのスクリプトファイルは「.ps1」という拡張子で保存することとなっています。
また、デフォルトではスクリプトファイルの実行はセキュリティ上の都合で無効となっているので解除してあげる必要があります。

コマンドプロンプトを管理者権限で立ち上げて

・現在のポリシーの取得
powershell Get-ExecutionPolicy
→Restricted(デフォルト)

Restricted – 実行できるスクリプトはありません。Windows PowerShell は対話型モードでのみ使用できます。
AllSigned – 信頼できる発行元が署名したスクリプトのみを実行できます。
RemoteSigned – ダウンロードしたスクリプトは信頼できる発行元が署名した場合にのみ実行できます。
Unrestricted – 制限なし。すべての Windows PowerShell スクリプトを実行できます。

・ポリシーを「RemoteSigned」へ変更
powershell Set-ExecutionPolicy RemoteSigned

当然ながらセキュリティレベルは低下する点には注意です。
気になる場合は別の手段を検討することをお勧めします。
・実際に実行してみる
powershell C:\スクリプトパス\スクリプト名.ps1 引数

これでエラーも出ず設定も正しければメールが届くはずです。
実際にした設定をタスクマネージャーに設定すればスリープから解除したときのメール通知設定は完了です。