Время старта и завершения работы системы
Falk0ner, вс, 06/07/2008 - 15:34.
PS: работает только в NT и выше.
Взято из http://forum.sources.ru
Автор: Krid
Время старта и завершения работы системы
Вот так можно узнать дату/время загрузки или завершения работы системы (т.е. когда компьютер был выключен или перезагружен последний раз):
unit Unit1;
{©Drkb v.3(2007): www.drkb.ru}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Registry;
{$R *.dfm}
type
SYSTEM_TIME_OF_DAY_INFORMATION = record
BootTime: LARGE_INTEGER;
CurrentTime: LARGE_INTEGER;
TimeZoneBias: LARGE_INTEGER;
CurrentTimeZoneId: ULONG;
end;
PSYSTEM_TIME_OF_DAY_INFORMATION = ^SYSTEM_TIME_OF_DAY_INFORMATION;
NTSTATUS = DWORD;
const
SystemTimeOfDayInformation =3;
function NtQuerySystemInformation(SystemInformationClass:byte;
SystemInformation: Pointer;
SystemInformationLength: ULONG;
ReturnLength: PULONG): NTSTATUS; stdcall; external 'NTDLL.DLL';
function SysDateToStr(ST : TSystemTime) : string;
const
sDateFmt = 'dddd, d MMMM, yyyy';
begin
SetLength(Result, 255);
GetDateFormat(LOCALE_USER_DEFAULT, 0, @ST, sDateFmt, @result[1], 255);
SetLength(Result, LStrLen(@result[1]));
end;
function SysTimeToStr(ST : TSystemTime):string;
const
sTimeFmt = 'HH:mm:ss' ;
begin
SetLength(result,15);
GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,sTimeFmt,@result[1],15);
SetLength(result, StrLen(@result[1]));
end;
function GetFileTimeToSystemTime(ft:TFileTime):string;
var
st,lt:TSystemTime;
tz:TTimezoneInformation;
begin
Result:='';
if not FileTimeToSystemTime(ft, st) then exit;
GetTimeZoneInformation(tz);
SystemTimeToTzSpecificLocalTime(@tz,st,lt);
Result:=SysDateToStr(lt)+' at ' + SysTimeToStr(lt);
end;
// дата/время последнего выключения (или перезагрузки) системы
function GetLastSystemShutdown:string;
var
ft:TFileTime;
reg:TRegistry;
begin
Result:='';
reg:=TRegistry.Create;
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
if (not reg.OpenKeyReadOnly('System\CurrentControlSet\Control\Windows')) then exit;
if (reg.ReadBinaryData('ShutdownTime',ft,sizeof(ft))=0) then exit
finally
reg.Free
end;
Result:= GetFileTimeToSystemTime(ft)
end;
// дата/время старта системы
function NtGetBootDateTime:string;
var
sti : SYSTEM_TIME_OF_DAY_INFORMATION;
status : NTSTATUS;
ftSystemBoot: FILETIME;
ST:TSystemTime;
begin
Result:='';
status:=NtQuerySystemInformation(SystemTimeOfDayInformation, @sti,
sizeof(SYSTEM_TIME_OF_DAY_INFORMATION),nil);
if (status<>NO_ERROR) then exit;
ftSystemBoot := PFILETIME(@(sti.BootTime))^;
if FileTimeToLocalFileTime(ftSystemBoot,ftSystemBoot) then
if FileTimeToSystemTime(ftSystemBoot,ST) then
Result:=SysDateToStr(ST)+' at '+SysTimeToStr(ST)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:='System start: '+NtGetBootDateTime;
label2.Caption:='Last system shutdown: '+GetLastSystemShutdown;
end;
end.
{©Drkb v.3(2007): www.drkb.ru}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Registry;
{$R *.dfm}
type
SYSTEM_TIME_OF_DAY_INFORMATION = record
BootTime: LARGE_INTEGER;
CurrentTime: LARGE_INTEGER;
TimeZoneBias: LARGE_INTEGER;
CurrentTimeZoneId: ULONG;
end;
PSYSTEM_TIME_OF_DAY_INFORMATION = ^SYSTEM_TIME_OF_DAY_INFORMATION;
NTSTATUS = DWORD;
const
SystemTimeOfDayInformation =3;
function NtQuerySystemInformation(SystemInformationClass:byte;
SystemInformation: Pointer;
SystemInformationLength: ULONG;
ReturnLength: PULONG): NTSTATUS; stdcall; external 'NTDLL.DLL';
function SysDateToStr(ST : TSystemTime) : string;
const
sDateFmt = 'dddd, d MMMM, yyyy';
begin
SetLength(Result, 255);
GetDateFormat(LOCALE_USER_DEFAULT, 0, @ST, sDateFmt, @result[1], 255);
SetLength(Result, LStrLen(@result[1]));
end;
function SysTimeToStr(ST : TSystemTime):string;
const
sTimeFmt = 'HH:mm:ss' ;
begin
SetLength(result,15);
GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,sTimeFmt,@result[1],15);
SetLength(result, StrLen(@result[1]));
end;
function GetFileTimeToSystemTime(ft:TFileTime):string;
var
st,lt:TSystemTime;
tz:TTimezoneInformation;
begin
Result:='';
if not FileTimeToSystemTime(ft, st) then exit;
GetTimeZoneInformation(tz);
SystemTimeToTzSpecificLocalTime(@tz,st,lt);
Result:=SysDateToStr(lt)+' at ' + SysTimeToStr(lt);
end;
// дата/время последнего выключения (или перезагрузки) системы
function GetLastSystemShutdown:string;
var
ft:TFileTime;
reg:TRegistry;
begin
Result:='';
reg:=TRegistry.Create;
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
if (not reg.OpenKeyReadOnly('System\CurrentControlSet\Control\Windows')) then exit;
if (reg.ReadBinaryData('ShutdownTime',ft,sizeof(ft))=0) then exit
finally
reg.Free
end;
Result:= GetFileTimeToSystemTime(ft)
end;
// дата/время старта системы
function NtGetBootDateTime:string;
var
sti : SYSTEM_TIME_OF_DAY_INFORMATION;
status : NTSTATUS;
ftSystemBoot: FILETIME;
ST:TSystemTime;
begin
Result:='';
status:=NtQuerySystemInformation(SystemTimeOfDayInformation, @sti,
sizeof(SYSTEM_TIME_OF_DAY_INFORMATION),nil);
if (status<>NO_ERROR) then exit;
ftSystemBoot := PFILETIME(@(sti.BootTime))^;
if FileTimeToLocalFileTime(ftSystemBoot,ftSystemBoot) then
if FileTimeToSystemTime(ftSystemBoot,ST) then
Result:=SysDateToStr(ST)+' at '+SysTimeToStr(ST)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:='System start: '+NtGetBootDateTime;
label2.Caption:='Last system shutdown: '+GetLastSystemShutdown;
end;
end.
PS: работает только в NT и выше.
Взято из http://forum.sources.ru
Автор: Krid
Отправить комментарий