私はこれほど遊んだことはありませんが、個人的には、「システム」プロセスの開始時刻を照会するのがおそらく最善の方法だと思います。Windowsでは、カーネルは起動時に独自の目的でプロセスを割り当てます(驚くべきことに、Googleですばやく検索しても、実際の目的が何であるかは簡単にはわかりませんが、情報はそこにあると確信しています)。このプロセスは、タスクマネージャでは単に「システム」と呼ばれ、現在のWindowsバージョンでは常にPID 4が使用されます(NT4およびWindows2000ではPID8が使用されている可能性があります)。このプロセスは、システムが実行されている限り終了することはなく、私のテストでは、メタデータに関する限り、本格的なプロセスのように動作します。私のテストから、昇格していないユーザーでもPID 4のハンドルを開いて、を要求できるようPROCESS_QUERY_LIMITED_INFORMATION
です。GetProcessTimes
、lpCreationTime
プロセスが開始された時刻のUTCタイムスタンプを入力します。私の知る限り、システムプロセスが実行される前にWindowsが実行される意味のある方法はないため、このタイムスタンプはWindowsの起動時とほぼ同じです。
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
int main()
{
unique_ptr<remove_pointer<HANDLE>::type, decltype(&::CloseHandle)> hProcess(
::OpenProcess(
PROCESS_QUERY_LIMITED_INFORMATION,
FALSE, // bInheritHandle
4), // dwProcessId
::CloseHandle);
FILETIME creationTimeStamp, exitTimeStamp, kernelTimeUsed, userTimeUsed;
FILETIME creationTimeStampLocal;
SYSTEMTIME creationTimeStampSystem;
if (::GetProcessTimes(hProcess.get(), &creationTimeStamp, &exitTimeStamp, &kernelTimeUsed, &userTimeUsed)
&& ::FileTimeToLocalFileTime(&creationTimeStamp, &creationTimeStampLocal)
&& ::FileTimeToSystemTime(&creationTimeStampLocal, &creationTimeStampSystem))
{
__int64 ticks =
((__int64)creationTimeStampLocal.dwHighDateTime) << 32 |
creationTimeStampLocal.dwLowDateTime;
wios saved(NULL);
saved.copyfmt(wcout);
wcout << setfill(L'0')
<< setw(4)
<< creationTimeStampSystem.wYear << L'-'
<< setw(2)
<< creationTimeStampSystem.wMonth << L'-'
<< creationTimeStampSystem.wDay
<< L' '
<< creationTimeStampSystem.wHour << L':'
<< creationTimeStampSystem.wMinute << L':'
<< creationTimeStampSystem.wSecond << L'.'
<< setw(7)
<< (ticks % 10000000)
<< endl;
wcout.copyfmt(saved);
}
}
私の現在のブートの比較:
system_clock::now() - milliseconds(GetTickCount64())
:
2020-07-18 17:36:41.3284297
2020-07-18 17:36:41.3209437
2020-07-18 17:36:41.3134106
2020-07-18 17:36:41.3225148
2020-07-18 17:36:41.3145312
(結果は呼び出しごとに異なります。これはsystem_clock::now()
、::GetTickCount64()
がまったく同時に実行されず、同じ精度がないためです)
wmic OS Get LastBootUpTime
2020-07-18 17:36:41.512344
現在、私のシステムにはイベントログエントリが存在しないため、結果はありません(最も早いイベントは7月23日からです)
2020-07-18 17:36:48.0424863
他の方法とは数秒異なりますが、システムプロセスがまだ実行されていない場合、システムは実際に起動されたので、それ自体が間違っているとは考えられません。