今使っているPC、電源ボタンを押して起動したのは何時だったっけ?:山市良のうぃんどうず日記(150)
日頃、PCを使っていると、「このWindowsっていつ起動(再起動)したんだっけ?」と、ふと思うことがあります。Windowsには最後にブートアップした日時やシステム稼働時間を取得する方法が幾つかありますが、思わぬ結果に驚くかもしれません。
毎日電源をオン/オフしているのに長期連続稼働中なのはどうして?
筆者は毎日利用している2台のPCを、次のように停止/起動しています。メインで使用しているデスクトップPCは、休止状態で終了し、翌日電源ボタンでPCを起動して、前回の状態から仕事を再開します。もう一台のノートPCは、シャットダウンで終了し、電源ボタンで起動します。このあたりはどう使おうが自由ですが、筆者としては(Windows Updateのために)夜中に勝手に電源が入るようなことがないようにしています。
Windowsには、システムを最後に起動した日時や、その時点から現在までの稼働時間を報告する機能が標準で備わっています。例えば、「WMIC」コマンドや「Get-ComputerInfo」コマンドレット、「タスクマネージャー」の「パフォーマンス」タブなどです(画面1)。
稼働時間を報告するコマンド/コマンドレット
- WMIC OS GET LastBootUpTime
- (Get-ComputerInfo).OsLastBootUpTime
- (Get-ComputerInfo).OsUptime
しかし、最近のWindows PCの場合、これらが示す共通の情報は、実際に電源ボタンを押したときと違っていることがほとんどだと思います。その理由の一つは、「スリープ」や「休止状態」の利用です。別の理由に、Windows 8で導入された「高速スタートアップ」の影響もあります。
スリープや休止状態、高速スタートアップは、最後の起動時間や稼働時間を更新せず、システムは最後に起動してから継続的に動作しているような時間を報告します。“最後の起動”とは、「shutdown /s」コマンドや「Stop-Computer」コマンドレットによるシャットダウン操作の次の起動や、Windowsの再起動による起動の日時です。そのため、最後の起動が前回のWindows Update後の再起動ということはよくあることです。
知りたい情報(電源オン/オフ)はシステムログの中にある!
筆者が知りたいのは「今日、何時に電源ボタンを押してPCを起動したのか」や「いつノートPCのカバー(ディスプレイ)を空けて再開したのか」ということです。その情報は「イベントビューアー」で参照できる「システム」ログの中に記録されたイベントから取得できます(画面2)。
以下の表1に、筆者のデスクトップPCとノートPCの「システム」ログで関連のありそうなイベントを抜き出しました。
ソース | イベントID | メッセージの例 |
---|---|---|
Kernel-General | 12 | オペレーティングシステムはシステム時刻 2019-02-26T00:35:10.500000000Z に起動しました。 |
Kernel-General | 13 | オペレーティングシステムはシステム時刻 2019-02-26T00:34:54.331663900Z にシャットダウンします。 |
Kernel-Boot | 20 | 前回のシャットダウンの成功状態はtrueでした。前回のブートの成功状態はtrueでした。 |
Kernel-Power | 42 | カーネル電源マネージャーがシャットダウンへの切り替えを開始しました。 シャットダウンの理由:Kernel API |
Kernel-Power | 107 | システムがスリープ状態から再開されました。 |
Kernel-Power | 109 | システムがスリープ状態になります。 スリープの理由:Application API |
EventLog | 6013 | システムの稼働時間は 867280 秒です。 |
表1 シャットダウン、休止状態、スリープ、起動、再起動、稼働時間に関係するシステムログのイベント |
他にもあるかもしれませんが、これらのイベントの日時を調べることで、シャットダウンや再起動、休止状態、スリープを開始した日時や、起動またはレジュームした日時を知ることができます。最後の「EventLog」ソースのイベントID「6013」は、システムの稼働時間を毎日正午(12:00)または再開後に報告するものですが、これは筆者が知りたい情報ではありません。
イベントビューアーの「現在のログをフィルター」を使用して、ログの日付やソース、イベントIDをフィルター条件に設定すれば、目的のイベントが簡単に見つかります。
しかし、イベントビューアーを起動して、ログが表示されるのを待つのは面倒です。代わりに「WEVTUTIL」コマンドや「Get-WinEvent」コマンドレットを利用すれば、コマンドライン1行で、複雑なフィルター条件でログを参照できます。
例えば、「システム」ログから、過去24時間(86400000ミリ秒)に記録された表1のイベント(イベントID 6013は除く)を取得するには、コマンドプロンプト(管理者権限は不要)で次の1行のコマンドラインを実行します。
WEVTUTIL qe System /rd:true /f:text /q:"*[System[Provider[@Name='Microsoft-Windows-Kernel-Boot' or @Name='Microsoft-Windows-Kernel-General' or @Name='Microsoft-Windows-Kernel-Power'] and (EventID=12 or EventID=13 or EventID=20 or EventID=42 or EventID=107 or EventID=109) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
Windows PowerShellであれば、Get-WinEventコマンドレットを次のように実行します(画面3)。
Get-WinEvent -LogName System -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-Kernel-Boot' or @Name='Microsoft-Windows-Kernel-General' or @Name='Microsoft-Windows-Kernel-Power'] and (EventID=12 or EventID=13 or EventID=20 or EventID=42 or EventID=107 or EventID=109) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
「/q」や「-FilterXPath」に続く照会文字列が難解に見えるかもしれませんが、「現在のログをフィルター」ダイアログボックスの「フィルター」タブのGUIでフィルター条件を作成し、「XML」タブに切り替えれば、「<Select>」タグからこの照会文字列をコピーできます(「<」と「>」が含まれる場合は、それぞれ「<」と「>」に書き換えてください)。
2023年6月8日追記
ソース「Kernel-General」、イベントID「12」が示すシステム時刻はハードウェアのリアルタイムクロック(RTC)に同期されていない古い時間を示しています。そのため、実際の再開時間を知るには、ソース「Kernel-General」、イベントID「1」(システム時刻が……に変更されました)の時刻を取得する必要があります。本記事のコマンド例は次のものに置き換えてください。
WEVTUTIL qe System /rd:true /f:text /q:"*[System[Provider[@Name='Microsoft-Windows-Kernel-Boot' or @Name='Microsoft-Windows-Kernel-General' or @Name='Microsoft-Windows-Kernel-Power'] and (EventID=1 or EventID=12 or EventID=13 or EventID=20 or EventID=42 or EventID=107 or EventID=109) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
Get-WinEvent -LogName System -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-Kernel-Boot' or @Name='Microsoft-Windows-Kernel-General' or @Name='Microsoft-Windows-Kernel-Power'] and (EventID=1 or EventID=12 or EventID=13 or EventID=20 or EventID=42 or EventID=107 or EventID=109) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
1日1回、システムログの気になるイベントをPSスクリプトで確認(おまけ)
WEVUTILコマンドやGet-WinEventコマンドレットのコマンドラインをバッチ(.cmd)やPowerShellスクリプト(.ps1)に書いて保存しておけば、知りたいときに素早く実行できて便利です。少し応用してみましょう。
イベントログ、特に「システム」ログには、システムの正常性に関わる重大なイベントが記録されていることがあり、早期発見でトラブルを未然に防いだり、影響を最小限にしたりできる場合があります。
以下のPowerShellスクリプト「get24hrsyslog.ps1」は、先ほどの稼働状況に関連するイベントに加えて、ブルースクリーン(Blue Screen of Death:BSOD)、システムログではソース「BugCheck」(Microsoft-Windows-WER-SystemErrorReporting)の発生イベント、および重大(レベル1)、エラー(レベル2)、警告(レベル3)のイベントを過去24時間分表示するスクリプトです。毎日1回、このスクリプトを実行すれば、重大なイベントの発生を見逃すことはないでしょう(画面4)。
$24hrsyslogs = (Get-WinEvent -LogName System -FilterXPath "*[System[TimeCreated[timediff(@SystemTime) <= 86400000]]]") Write-Host "過去24時間の稼働状況および重大、エラー、警告イベントを報告します...`r`n" foreach ($24hrsyslog in $24hrsyslogs) { if ((($24hrsyslog.Level -eq 1) -or ($24hrsyslog.Level -eq 2) -or ($24hrsyslog.Level -eq 3)) -or (($24hrsyslog.ProviderName -eq "Microsoft-Windows-Kernel-General") -and (($24hrsyslog.Id -eq 1) -or ($24hrsyslog.Id -eq 12) -or ($24hrsyslog.Id -eq 13))) -or (($24hrsyslog.ProviderName -eq "Microsoft-Windows-Kernel-Power") -and (($24hrsyslog.Id -eq 42) -or ($24hrsyslog.Id -eq 107) -or ($24hrsyslog.Id -eq 109))) -or (($24hrsyslog.ProviderName -eq "Microsoft-Windows-Kernel-Boot") -and ($24hrsyslog.Id -eq 20))) { if ($24hrsyslog.LevelDisplayName -ne $null) { if ($24hrsyslog.Message -eq $null) {$24hrsyslog.Message = "(情報なし)" } Write-Host $24hrsyslog.TimeCreated" "($24hrsyslog.LevelDisplayName).Replace("情報","稼働状況")"("$24hrsyslog.Id") "(($24hrsyslog.ProviderName).Replace("Microsoft-Windows-","")).Replace("WER-SystemErrorReporting","BugCheck")" "(($24hrsyslog.Message).Replace("`r`n","")) } } }
筆者紹介
山市 良(やまいち りょう)
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2018/7/1)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 特集「Windows Server 2008/2008 R2 サポート終了対策ポータル」
- なぜ、Windows 10のWindows Updateは嫌われているのか?
前回に続き、今回も「Windows Update」に関する話題です。Windows 10のWindows Updateはなぜ不評なのか、良いところはないのか。そして、現状の問題点について取り上げます。 - Windows Updateの不都合な現実
2018年7月11日の定例のWindows Updateは、更新プログラムが提供された全てのWindowsに共通の既知の問題が複数あり、翌週17日にその問題を修正する更新プログラムが提供されました。そこから見えてくる、Windows Updateの問題点とは? - 【Windows 10】Windows Updateを手動で実行する方法
しばらく使っていなかったPCなどは、セキュリティを高めるために早めに更新プログラムを適用しよう。その場合、Windows Updateを手動で実行すればよい。Windows 10でWindows Updateを手動で実行する方法を紹介する。 - Windows 10でWindows Updateによる「更新」はどう変わったのか?
Windows 10では機能の追加や更新のスキームが変わり、短い期間でマイナーアップデートを繰り返すようになる。その一方で企業ユーザーのために、極力機能を追加/変更しないエディションもサポートする。