7

コンピューターのユーザーのログオンとログオフの数を数えたい。ログオン/ログオフの情報をWindowsイベントログ(Win32_NTLogEvent WMIクラスから)から取得します。たとえば、次のクエリを使用します。

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

ただし、コンピューターを再起動または起動すると、3回のログオンがカウントされ、ユーザーが[スタートメニューから)ログオフまたはロックをクリックしてからログオンすると、1回のログオンがカウントされます。ユーザーは、WindowsActiveDirectoryを介して認証します。ログオン数に影響しますか?ユーザーの明示的な資格情報を使用したログオンの数のみをカウントできますか?

Windowsの起動とシャットダウン用のEventCode:4608と4609を見つけましたが、ユーザーがコンピューターをログオフまたはロックしたときのログオン数も必要です。

4

2 に答える 2

4

私はここでこの解決策を見つけました:

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 (またはネットワーク化されたインフラストラクチャが使用している他のメカニズム) にクエリを実行する必要があります。リンクされたスレッドは、これに対する解決策も提供します。

アップデート:

ログオン イベントを使用したユーザー ログオン アクティビティの追跡に関するEric Fitzgeraldブログ投稿を見ることができます。ここには、対応するコード (および正確な時間追跡のための完全な式) があります。

Fitzgerald の式を使用して正確なアクティビティ時間を計算する予定がある場合は、イベント コード 4624 (LOGON) と 4634 (LOGOFF) に加えて、そこにリストされている他のコードが必要になるようです。

于 2012-03-01T12:24:16.043 に答える
1

より良いアプローチは、システム サービスを使用することです。

RegisterServiceCtrlHandlerEx によって定義される HandlerEx コールバック関数は、ログオン、ログオフ、ロック、およびロック解除イベントを含むセッション変更通知を受信するように構成できます

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

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

于 2012-03-03T23:00:55.363 に答える