掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
電源オン、オフの時間の所得 (ID:33416)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
イベントログサービスの開始・終了をログオン・ログオフとする場合のイベントログから読み込むサンプル。 TButtonとTMemoをおいて type // Internal structure for event logs PEVENTLOGRECORD = ^EVENTLOGRECORD; EVENTLOGRECORD = packed record Length : DWORD; Reserved : DWORD; RecordNumber : DWORD; TimeGenerated : DWORD; TimeWritten : DWORD; EventID : DWORD; EventType : WORD; NumStrings : WORD; EventCategory : WORD; ReservedFlags : WORD; ClosingRecordNumber : DWORD; StringOffset : DWORD; UserSidLength : DWORD; UserSidOffset : DWORD; DataLength : DWORD; DataOffset : DWORD; // Then follows Variant Area ..... // TCHAR SourceName[] // TCHAR Computername[] // SID UserSid // TCHAR Strings[] // BYTE Data[] // CHAR Pad[] // DWORD Length; end; TEventLogRecord =EVENTLOGRECORD; const EVENTLOG_SEQUENTIAL_READ = 1; EVENTLOG_SEEK_READ = 2; EVENTLOG_FORWARDS_READ = 4; EVENTLOG_BACKWARDS_READ = 8; function TimeGeneratedToDateTime(aTimeGenerated: DWORD): TDateTime; const SecondPerDay = 60 * 60 * 24; //一日の秒数 begin Result := EncodeDate(1970,1,1) + EncodeTime(9,0,0,0); Result := ((Result * SecondPerDay) + aTimeGenerated) / SecondPerDay; end; procedure TForm1.Button2Click(Sender: TObject); const //最新のログから順次読み込む READ_FLAG= EVENTLOG_SEQUENTIAL_READ or EVENTLOG_BACKWARDS_READ; var eLogHandle: THandle; logCount: DWORD; i: Integer; eventID: Integer; pBuf: PEventLogRecord; bufSize: Integer; readNum, readNeed: DWORD; lastLogOn: TDateTime; lastLogOut: TDateTime; begin eLogHandle := OpenEventLog(nil, 'System'); //クリア lastLogOn := 0; lastLogOut := 0; Memo1.Lines.Clear; if eLogHandle > 0 then begin //ログ数を取得 if not GetNumberOfEventLogRecords(eLogHandle, logCount) then logCount := 0; //メモリ確保 bufSize := SizeOf(TEventLogRecord); pBuf := AllocMem(bufSize); for i := 1 to logCount do begin {読み込み} if not ReadEventLog(eLogHandle, READ_FLAG, logCount - 1, pBuf, bufSize, readNum, readNeed) then begin if GetLastError = ERROR_INSUFFICIENT_BUFFER then begin //メモリの再割り当て bufSize := readNeed; ReallocMem(pBuf, bufSize); if not ReadEventLog(eLogHandle, READ_FLAG, logCount - 1, pBuf, readNeed, readNum, readNeed) then begin //失敗 Break; end; end else begin //失敗 Break; end; end; eventID := pBuf^.EventID AND $FFFF; if eventID = 6005 then begin lastLogOn := TimeGeneratedToDateTime(pBuf^.TimeGenerated); if lastLogOut > 0 then Break; end else if eventID = 6006 then begin lastLogOut := TimeGeneratedToDateTime(pBuf^.TimeGenerated); if lastLogOn > 0 then Break; end; end; Memo1.Lines.Add('最終ログイン:' + FormatDateTime('yyyy/mm/dd hh:nn:ss', lastLogOn)); Memo1.Lines.Add('最終ログオフ:' + FormatDateTime('yyyy/mm/dd hh:nn:ss', lastLogOut)); //メモリ開放 FreeMem(pBuf); //ログを閉じる CloseEventLog(eLogHandle); end; end; 細かいとこわかってないので、突っ込んだ質問には答えられません。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.