連載
» 2019年04月02日 05時00分 公開

山市良のうぃんどうず日記(150):今使っているPC、電源ボタンを押して起動したのは何時だったっけ?

日頃、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
画面1 画面1 Windowsには、システムの起動時間や稼働時間を報告する機能があるが、筆者が知りたいのは電源ボタンを押して起動したのはいつなのか、ということ

 しかし、最近のWindows PCの場合、これらが示す共通の情報は、実際に電源ボタンを押したときと違っていることがほとんどだと思います。その理由の一つは、「スリープ」や「休止状態」の利用です。別の理由に、Windows 8で導入された「高速スタートアップ」の影響もあります。

 スリープや休止状態、高速スタートアップは、最後の起動時間や稼働時間を更新せず、システムは最後に起動してから継続的に動作しているような時間を報告します。“最後の起動”とは、「shutdown /s」コマンドや「Stop-Computer」コマンドレットによるシャットダウン操作の次の起動や、Windowsの再起動による起動の日時です。そのため、最後の起動が前回のWindows Update後の再起動ということはよくあることです。

知りたい情報(電源オン/オフ)はシステムログの中にある!

 筆者が知りたいのは「今日、何時に電源ボタンを押してPCを起動したのか」や「いつノートPCのカバー(ディスプレイ)を空けて再開したのか」ということです。その情報は「イベントビューアー」で参照できる「システム」ログの中に記録されたイベントから取得できます(画面2)。

画面2 画面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]]]"
画面3 画面3 「WEVUTIL」コマンドや「Get-WinEvent」コマンドレットを使用して、「システム」ログから過去24時間の知りたいイベントを照会する

 「/q」や「-FilterXPath」に続く照会文字列が難解に見えるかもしれませんが、「現在のログをフィルター」ダイアログボックスの「フィルター」タブのGUIでフィルター条件を作成し、「XML」タブに切り替えれば、「<Select>」タグからこの照会文字列をコピーできます(「&lt;」と「&gt;」が含まれる場合は、それぞれ「<」と「>」に書き換えてください)。

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",""))
    }
  }
}
重大イベントと稼働状況を報告するPowerShellスクリプト「get24hrsyslog.ps1」
画面4 画面4 PowerShellスクリプト「get24hrsyslog.ps1」は、過去24時間の重大イベント(警告以上)と稼働状況のイベントを報告してくれる

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2018/7/1)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。