首页 资讯 社群 我的社区 搜索

获取系统启动时间

木须虎
2020-07-02 11:06:11

问题是这样,有个项目中有个需求,客户想了解今天这台电脑是什么时候开机的,我们通过命令行 systeminfo 可以显示出来系统信息,windows 其实记录了你本次开机的时间。

这个系统启动时间有没有 API 可以取到呢?

我查了一下,还真的有,不过这个函数并没有导出,需要我们自己导出,这里最需要注意的是日期时间的转换,sti.liKeBootTime 是一个 LARGE_INTEGER表示一个64位有符号整数。

#include "stdafx.h"
#include <time.h>
#include <string>
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <atltime.h>

#define SystemTimeInformation 3

#define RECORDCOUNT    100

using namespace std;

typedef long(__stdcall *fnNtQuerySystemInformation)(
	IN  UINT SystemInformationClass,
	OUT PVOID SystemInformation,
	IN  ULONG SystemInformationLength,
	OUT PULONG ReturnLength OPTIONAL);

fnNtQuerySystemInformation NtQuerySystemInformation = NULL;

typedef struct {
	LARGE_INTEGER liKeBootTime;
	LARGE_INTEGER liKeSystemTime;
	LARGE_INTEGER liExpTimeZoneBias;
	ULONG uCurrentTimeZoneId;
	DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;



string GetBootTime()
{
	NtQuerySystemInformation = (fnNtQuerySystemInformation)GetProcAddress(LoadLibrary("ntdll.dll"),
		"NtQuerySystemInformation");
	if (NtQuerySystemInformation == NULL)
	{
		return "";
	}

	LONG status;
	SYSTEM_TIME_INFORMATION sti;
	status = NtQuerySystemInformation(SystemTimeInformation, &sti, sizeof(sti), 0);
	if (NO_ERROR != status)
	{
		return "";
	}

	FILETIME ft;
	SYSTEMTIME st;
	memcpy(&ft, &sti.liKeBootTime, sizeof(ft));
	FileTimeToLocalFileTime(&ft, &ft);
	FileTimeToSystemTime(&ft, &st);

	char timeBuf[MAX_PATH] = { 0 };
sprintf(timeBuf, "%d-%d-%d %d:%d:%dn", st.wYear, st.wMonth, st.wDay,
		st.wHour, st.wMinute, st.wSecond);

	printf("开机时间: %s", timeBuf );

	return timeBuf;
}

 

用户评论