6

小さな問題が発生しました。

スタッフと教師が RDC を使用して自宅から学校のネットワークにアクセスできるように、Netgear のインターネット接続 VPN があります。

Web ブラウザーを使用して VPN にログインし、リモート サーバーの 1 つをクリックすると、RDC に接続されます。

しかし、人々はログオフという大きな問題を抱えています。彼らの頭から逃げているようです。すべてのユーザーが行っているのは、RDC クライアントの [閉じる] ボタンをクリックすることであり、ログオフしていません。

これを整理するプログラムを作成しています。アイデアは、リモート デスクトップ API に「フック」し、セッションが切断されているかどうかを確認し、切断されている場合はユーザーをログオフすることです。

プログラムは、サービスまたは物理的に最小化された EXE としてバックグラウンドで実行されます。

これを C# でビルドしています。では、.NET 4 を使用して呼び出すことができる RDC イベントを知っている人はいますか? ユーザーがいつセッションを閉じているかを知ることができるもの。

これについてさらに情報が必要な場合は、お知らせください。

乾杯

4

2 に答える 2

6

とった。

電話

SystemEvents.SessionSwitch += new SessionSwitchEventHandle SystemEvents_SessionSwitch);

それで

        static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        if (e.Reason == SessionSwitchReason.RemoteDisconnect || e.Reason == SessionSwitchReason.ConsoleDisconnect)
        {
            // Log off the user...

        }
        else
        {
            // Physical Logon
        }
    }
于 2012-10-06T12:04:10.567 に答える
1

これは、上記の他の回答よりもうまく機能します。

        public Form1()
    {
        InitializeComponent();

        if (!WTSRegisterSessionNotification(this.Handle, NOTIFY_FOR_THIS_SESSION))
        {
            Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
        }
    }

    [DllImport("user32.dll")]
    public static extern int ExitWindowsEx(int uFlags, int dwReason);

    [DllImport("WtsApi32.dll")]
    private static extern bool WTSRegisterSessionNotification(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)]int dwFlags);

    [DllImport("WtsApi32.dll")]
    private static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd);

    // constants that can be passed for the dwFlags parameter
    const int NOTIFY_FOR_THIS_SESSION = 0;
    const int NOTIFY_FOR_ALL_SESSIONS = 1;

    // message id to look for when processing the message (see sample code)
    const int WM_WTSSESSION_CHANGE = 0x2b1;

    // WParam values that can be received: 
    const int WTS_CONSOLE_CONNECT = 0x1; // A session was connected to the console terminal.
    const int WTS_CONSOLE_DISCONNECT = 0x2; // A session was disconnected from the console terminal.
    const int WTS_REMOTE_CONNECT = 0x3; // A session was connected to the remote terminal.
    const int WTS_REMOTE_DISCONNECT = 0x4; // A session was disconnected from the remote terminal.
    const int WTS_SESSION_LOGON = 0x5; // A user has logged on to the session.
    const int WTS_SESSION_LOGOFF = 0x6; // A user has logged off the session.
    const int WTS_SESSION_LOCK = 0x7; // A session has been locked.
    const int WTS_SESSION_UNLOCK = 0x8; // A session has been unlocked.
    const int WTS_SESSION_REMOTE_CONTROL = 0x9; // A session has changed its remote controlled status.

    protected override void OnHandleDestroyed(EventArgs e)
    {
        // unregister the handle before it gets destroyed
        WTSUnRegisterSessionNotification(this.Handle);
        base.OnHandleDestroyed(e);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_WTSSESSION_CHANGE)
        {
            int value = m.WParam.ToInt32();
            if (value == WTS_REMOTE_DISCONNECT)
            {
                ExitWindowsEx(4, 0); // Logout the user on disconnect
            }
            else if (value == WTS_REMOTE_CONNECT)
            {
                MessageBox.Show("Welcome to the VPN. There is no need to Logout anymore, as when you close this session it will automatically log you out");
            }
        }
        base.WndProc(ref m);
    }
于 2012-10-06T13:28:53.807 に答える