2

セッション 0 で実行されている Windows サービスからログオフ イベントをリッスンすることに興味があります。

  • また、ログオフしているユーザー (セッション ID) も把握しています。
  • ここでは、ログオフ イベントではなく、キャンセル可能なログオフ イベントについて話していることに注意してください。

どのユーザーがログオフしているかを調べる方法 - SessionEndingEventArgsからセッション ID を取得しますか?

protected override void OnStart(string[] args)
    {
        SystemEvents.SessionEnding += SystemEvents_SessionEnding;
    }

private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
    {
        // SessionEndingEventArgs does not contain SID
        // or other user identifying info?
    }

[そして、Windows サービスが実際に SessionEnding イベントをキャプチャできるかどうかはテストしていません]


または、 SessionChangeDescriptionを使用して、ログオフしようとしているユーザーを識別できますか?

public ServiceApp()
    {
        CanHandleSessionChangeEvent = true;
    }

protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        // Although changeDescription has SessionId property
        // I'm not sure it has the equivalent of session ending event?
        base.OnSessionChange(changeDescription);
    }

他のイベント ソース ?

  • または、 Cassiaはユーザー アカウント情報を含むそのようなイベントを提供しますか?
  • または、どこかの WMI から取得できますか?
  • または、Win32 API を直接使用しますか?
4

1 に答える 1

3

WM_QUERYENDSESSIONは、終了セッションでデスクトップ上のすべての最上位ウィンドウに送信されます。ただし、通常、サービスは別のセッションで実行されるため、通常は通知を受け取りません。Vista より前は、デスクトップとの対話を有効にしてセッション 0 のユーザーとデスクトップを共有できましたが、ログオフが別のセッションで発生した場合、メッセージは送信されません。XP 以降では、セッション 0 の分離により、ユーザー セッションからメッセージを取得できません。

このメッセージをサービスに通知するには、各セッションでエージェント プロセスを実行し (つまり、ユーザーが [スタート] メニューのショートカットまたはレジストリ経由でログインしたときに自動開始するように登録する)、WM_QUERYENDSESSION をリッスンする必要があります (.Net 用語では、メッセージ ポンプを Windows フォームで Application.Run のように使用し、SystemEvents.SessionEnding をサブスクライブする)、セッション情報を収集し、名前付きパイプのようなプロセス間通信方法を使用してサービスに通知を送信します (WCF を使用する場合は、NetNamedPipeBinding を使用します)。現在のセッションを取得する場合は、WTSQuerySessionInformation (.Net 用語では Process.GetCurrentProcess().SessionId) を使用します。

OnSessionChange メソッドは、ユーザーがログオフした後に呼び出されます。SENS のログオフ イベントも同じなので、この 2 つは遅すぎます。

于 2013-06-28T15:26:45.633 に答える