2012-02-24 26 views
7

自分のコンピュータのユーザーのログオンとログオフの回数をカウントします。私はログオン/ログオフの情報をWindowsイベントログ(Win32_NTLogEvent WMIクラスから)から取り出します。次のクエリでたとえば:コンピュータを再起動するか、ユーザーがログオフまたはロックをクリックしたとき、3回のログオンをカウントし始め(スタートメニューから)、次にログオンしたときにコンピュータのログオンとログオフWindows 7

select * from Win32_NtLogEvent 
where EventCode = 4648 and TimeGenerated > '20120224000000.000000-***' 

しかし、それは1回のログオンをカウントします。ユーザーは、Windows Active Directory経由で認証を行います。ログオン数に影響しますか?ユーザーの明示的な資格情報を使用してログオン数のみをカウントできますか?

Windowsの起動とシャットダウンのためにEventCode:4608と4609が見つかりましたが、ユーザーがログオフしたときやコンピュータをロックしたときにもログオンする必要があります。

+0

これが役立つかどうかわかりません。http://msdn.microsoft.com/en-us/library/windows/desktop/ms676845(v=vs.85).aspx – Simon

+0

ワークステーションのロックを解除しようとしていますか、またはそれを数えないようにしようとしていますか? –

+0

私はコンピュータ上のユーザーの支出時間を数えようとしています。 –

答えて

4

私は、このソリューションhereが見つかりました:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:{(Security)}\\" & _ 
    strComputer & "\root\cimv2") 

Set colEvents = objWMIService.ExecQuery _ 
    ("SELECT * FROM Win32_NTLogEvent WHERE LogFile = 'Security' AND " & _ 
     "EventCode = 528 AND User = 'fabrikam\\kmyer'") 

Wscript.Echo colEvents.Count 

は、単にあなたが望むものを使用して値を置き換えます。

これはJavaではなくVBコードですが、Javaプログラムから使用できるWMIインターフェイスを使用しているようです。あるいは、醜い何かを行い、Java(またはスケジュールされたタスク)からバッチスクリプトを呼び出してその出力を読むか、またはバインディングを使用することができます。

これはもちろん、あなたの質問が示唆したように、あなたのコンピュータでこれをチェックしたいと仮定しています。グローバルレベルと異なるマシンからログオンをカウントする場合は、Active Directory(またはネットワークインフラストラクチャが使用している他のメカニズム)を照会する必要があります。リンクされたスレッドは、このためのソリューションも提供します。

更新:

あなたは(正確な時間追跡のためだけでなく、完全な式)を使用すると、対応するコードを持っているTracking User Logon Activity Using Logon Events、上Eric Fitzgeraldblogポストを見てすることができます。

Fitzgeraldの公式を使用して正確な活動時間を計算する予定がある場合、明らかにイベントコード4624(LOGON)と4634(LOGOFF)が表示されます。

+0

Windows 7はコード528でイベントを生成しません。 –

+0

@VentsislavMarinov:アップデートを参照してください。 – haylem

1

より良い方法は、system serviceを使用することです。

RegisterServiceCtrlHandlerExで定義されたHandlerExコールバック関数は、ログオン、ログオフ、ロックおよびロック解除イベントを含むsession change notificationsを受け取るように設定できます。

HandlerExで受信したログオフイベントが信頼できるものであるかどうか、またはイベントログと同じ問題が発生しているかどうかは完全にはわかりません。バックアップとして、SetConsoleCtrlHandlerでは、ログオフ通知を受け取るコールバック関数を定義することができます。これらの通知は信頼できるものです。

WTSEnumerateSessionsなどのリモートデスクトップサービスAPI関数は、現在ログオンしているユーザーを任意の時点で一覧表示したり、特定のセッションに関する追加情報を取得したりするのに役立ちます。これらの機能のサブセットのみがワークステーションで使用できますが、必要な機能です。