Windows 10の起動時間と稼働時間:PowerShellの洞察

Windowsの稼働時間は、環境で発生する日常的な問題のトラブルシューティングにサーバー管理者がよく使用する測定です。この記事では、Windows 10およびWindows Serverでブート時間をチェックする方法について学びます。最も簡単な方法を自由に使用してください。この記事を将来の参考資料としてご利用ください。

この記事は、2つのメインパートに分かれています。サーバーの稼働時間をチェックする方法と、Windowsの過去の稼働時間を見つける方法です。最初のパートでは、コンピュータが最後に再起動してからどれだけの時間稼働しているかを見つけます。この記事ではこれを「現在の」稼働時間と呼びます。

記事の2番目のパートでは、「歴史的な」稼働時間を見つけることに焦点を当てます。つまり、複数の再起動の間にWindowsシステムがどれだけ稼働していたかを示します。PowerShellを使用して、Windowsイベントログを解析して過去の稼働時間を取得する方法を学びます。

Windows 10およびWindows Serverでブート時間をチェックする方法

まず、現在のWindowsの稼働時間を見つけるためのいくつかの異なる方法について見ていきましょう。

このセクションでは、Windowsシステム上でローカルにコマンドを実行することによって、Windows 10でブート時間をチェックするデモンストレーションをご覧いただきます。ただし、PowerShellリモートを使用することで、これらのチェックをリモートで実行することもできます(タスクマネージャーは除く)。

タスクマネージャー

稼働時間を見つける最もシンプルで直接的な方法の1つは、単にタスクマネージャーを開くことです。

Windowsの稼働時間をタスクマネージャーで確認するには、Windowsタスクバーで右クリックし、タスクマネージャーを選択するか、CtrlShiftEscを押します。タスクマネージャーが開いたら、パフォーマンスタブをクリックします。パフォーマンスタブの下には稼働時間というラベルが表示されます。

Finding Windows uptime with task manager

イベントビューア

イベントビューアは、ほとんどのシステム管理者が定期的に使用する非コマンドライン関連の稼働時間の取得方法として優れています。イベントID 6005と6006は、イベントログサービスの開始または停止を識別するために使用できます。これは起動/シャットダウン時に発生します。以下の手順に従って、イベントビューアを使用して稼働時間を特定します。

  • スタートメニューを表示し、イベントビューアを検索します。またはコンピュータの管理からアクセスすることもできます。
  • 左側のウィンドウでWindowsログセクションを展開し、システムを選択します。
  • これでシステム関連のイベントのみをクエリしています。ウィンドウの右側にある「現在のログのフィルタリング…」をクリックします。
  • イベントIDフィールド(デフォルトでは「すべてのイベントID」と表示されています)に適用可能なイベントIDを検索するために、「6005, 6006」と入力してOKをクリックします。

その後、2つの時間を比較して合計の稼働時間を作成することができます。また、これらのイベントの多くのインスタンスが保存されるため、稼働時間の履歴をクエリすることもできます!

これで、最後の起動時間だけでなく、起動/シャットダウンが行われたすべての既知の時間が表示されるフィルタリングされたイベントログを取得できます。

PowerShell

PowerShellには、稼働時間を取得するためのいくつかの異なる方法があります。WMIをクエリするか、Windowsイベントログを使用することができます。

WMIをクエリする場合、以下に示すようにLastBootUpTimeプロパティを選択するためにWin32_OperatingSystemクラスをクエリします。

PS51> Get-CimInstance Win32_OperatingSystem | Select-Object LastBootUpTime

LastBootUpTime      
--------------      
9/25/2019 9:37:37 PM

PowerShellを使用してイベントログをクエリするには、Get-WinEventコマンドレットを使用します。マシンが起動された最後の時間を示すイベントID 6005または6006を検索する必要があります。

PS51> Get-WinEvent -ProviderName EventLog | Where-Object {$_.Id -eq 6005 -or $_.Id -eq 6006} | Select-Object -First 1 TimeCreated

TimeCreated         
-----------         
9/25/2019 9:37:52 PM

WMIC

WMICは、WMIのためのコマンドラインインターフェースを提供し、長年にわたって使用されてきた信頼性のある方法です。WMICを使用して稼働時間をクエリするには、Win32_OperatingSystem WMIクラスを再びクエリしますが、少し奥ではたらいています。以下のように、WMICの構文os get lastbootuptimeを使用して、サーバーが最後に起動された時刻を返すことができます。

> wmic os get lastbootuptime

LastBootUpTime             

20190925213737.500000-240

WMICは、Windowsに事前インストールされているため、ダウンロードする必要はありません。

システム情報ユーティリティ

systeminfoコマンドは、コンピューターの詳細な構成情報を表示し、システムの稼働時間をクエリするために使用することができます。組み込みのfindコマンドラインツールを使用して、必要なデータを抽出するためにテキストを解析することができます。

単に、コマンドプロンプトまたはPowerShellを開き、systeminfo | findと入力します。

> systeminfo | find "System Boot Time:"

System Boot Time:          9/25/2019, 9:37:37 PM

systeminfoを利用するためには、ダウンロードする必要はありません。Windowsには事前にインストールされています。

ネット統計コマンド

また、net statsともよく知られているネット統計を使用して、すばやくアップタイムをクエリできます。 net statsコマンドはセッションに関する一般的な情報を返します。以下のStatistics since…の行で、マシンが起動した日付が表示されます。

> net stats srv

Workstation Statistics for \\NATES-PC


Statistics since 9/25/2019 9:37:52 PM

--SNIP--

The command completed successfully.

アップタイムコマンド

Windowsのアップタイムを検索するための小さなポータブルユーティリティが必要な場合は、NeoSmart TechnologiesのUptimeコマンドをご利用ください。このユーティリティは、どのWindowsバージョンでもアップタイムをすばやくクエリするのに最適です。このツールの主な利点は便利さです。毎日何度も使用する場合は、この方法を検討してください。

ツールをダウンロードしたら、uptime.exe%WinDir%\System32に展開します。次に、コマンドプロンプトを開き、単純にuptimeと入力します。

Uptime tool

このツールをリモートで実行するには、まず、アップタイムをチェックするWindowsシステムにツールをコピーする必要があります。

Get-ServerUptimeReportスクリプトの紹介

PowerShellを自分で書かなくてもいいように、Get-ServerUptimeReport.ps1というコミュニティスクリプトをダウンロードしてください。

PS51> Install-Script -Name Get-ServerUptimeReport

このスクリプトは、パラメータとしてコンピュータ名を指定することができます。それから、コンピュータのSystemイベントログを解析し、開始イベントと停止イベントを見つけて比較します。その後、イベントログがロールされるまでのサーバの合計稼働時間を返します。

以下は、このスクリプトをサーバで使用する例です。イベントログに含まれるすべてのイベントの合計稼働時間を、現在の稼働時間を含めて返します。

PS51> ./Get-ServerUptimeReport.ps1 -ComputerName sqlsrv1

Startup Shutdown Uptime (Days) Uptime (Min)
------- -------- ------------- ------------
9/16/2017 12:40:00 PM 9/22/2017 4:20:11 PM 6.15 8860.18
9/16/2017 10:22:49 AM 9/16/2017 12:22:36 PM 0.08 119.79
9/16/2017 3:22:12 PM 9/22/2017 4:20:11 PM 6.04 8697.98

多くのサーバでWindowsの稼働時間を検索する

このスクリプトは、1つのサーバの稼働時間を多日にわたって素早く検索する方法です。しかし、一度にたくさんのサーバの情報が必要な場合はどうすればよいでしょうか?その場合、サーバのリストを収集し、それぞれのコンピュータ名をこのスクリプトに渡すことができます。

例えば、PowerShellコンソールでサーバの配列を定義します。この例では、変数の配列名は$serversです。

実際のところ、サーバ名をActive Directory、Hyper-V、またはテキストファイルから取得するかもしれません。サーバ名の配列を構築できれば、問題ありません。

すべてのサーバ名を定義し、以下のようにループでそれぞれに繰り返します。

$servers = 'WEBSRV1','SQLSRV1'
foreach ($server in $servers) {
	Get-ServerUptimeReport.ps1 -ComputerName $server
}

Startup Shutdown Uptime (Days) Uptime (Min)
------- -------- ------------- ------------
9/16/2017 12:45:48 PM 9/22/2017 4:25:39 PM 6.15 8859.86
9/16/2017 10:42:52 AM 9/16/2017 12:42:34 PM 0.08 119.7
9/16/2017 2:42:17 PM 9/22/2017 4:25:39 PM 6.07 8743.38
9/16/2017 12:40:00 PM 9/22/2017 4:25:39 PM 6.16 8865.65
9/16/2017 10:22:49 AM 9/16/2017 12:22:36 PM 0.08 119.79
9/16/2017 3:22:12 PM 9/22/2017 4:25:39 PM 6.04 8703.46

このコードは動作しますが、各行がどのサーバを参照しているのかはわかりません。以下のように計算されたプロパティを使用して出力にサーバ名を追加します。

$servers = 'WEBSRV1','SQLSRV1'
foreach ($server in $servers) {
	Get-ServerUptimeReport.ps1 -ComputerName $server | Select-Object -Property *,@{n='ServerName';e={$server}}
}

Startup Shutdown Uptime (Days) Uptime (Min) ServerName
------- -------- ------------- ------------ ----------
9/16/2017 12:45:48 PM 9/22/2017 4:34:59 PM 6.16 8869.19 WEBSRV1
9/16/2017 10:42:52 AM 9/16/2017 12:42:34 PM 0.08 119.7 WEBSRV1
9/16/2017 2:42:17 PM 9/22/2017 4:34:59 PM 6.08 8752.71 WEBSRV1

Startup Shutdown Uptime (Days) Uptime (Min) ServerName
------- -------- ------------- ------------ ----------
9/16/2017 12:40:00 PM 9/22/2017 4:35:01 PM 6.16 8875.01 SQLSRV1
9/16/2017 10:22:49 AM 9/16/2017 12:22:36 PM 0.08 119.79 SQLSRV1
9/16/2017 3:22:12 PM 9/22/2017 4:35:01 PM 6.05 8712.81 SQLSRV1

これで、時間の経過に伴うサーバの稼働時間についての素早いレポートを提供する優れたツールができました!

まとめ

あなたは今、Windowsの稼働時間を見つけるさまざまな方法を見ました。どのオプションを選んでも、同じ情報を受け取ることができます。自分の状況に最適なものを選んでください。

そして、もし稼働時間の履歴のレポートが必要な場合は、Get-ServerUptimeReport PowerShellスクリプトを忘れないでください!

Source:
https://adamtheautomator.com/windows-uptime/