You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中跟踪切换用户事件后的当前活跃Windows用户

解决多用户切换时的活跃用户监控问题

这问题我之前帮同事处理过类似的——你的监控进程现在只在启动和新用户登录时捕获用户信息,但用户切换是动态的系统事件,必须主动监听这些变化,而不是被动依赖启动时机。下面分平台给你具体的实现思路:

Windows平台解决方案

Windows通过会话通知机制来管理用户切换这类事件,核心是监听WM_WTSSESSION_CHANGE消息:

  • 第一步:让你的监控进程注册会话通知
    调用Win32 API WTSRegisterSessionNotification,把进程窗口(如果是后台服务,需适配服务级会话通知)注册为接收会话变更事件的对象。
    代码片段示例(C++):

    #include <Windows.h>
    #include <Wtsapi32.h>
    
    BOOL RegisterSessionNotifications(HWND hWnd) {
        return WTSRegisterSessionNotification(hWnd, NOTIFY_FOR_ALL_SESSIONS);
    }
    
  • 第二步:处理会话切换事件
    在消息循环中捕获WM_WTSSESSION_CHANGE消息,当wParam为WTS_SESSION_SWITCH时,说明发生了用户切换。此时用WTSQuerySessionInformation获取当前活跃会话的用户名:

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
        if (uMsg == WM_WTSSESSION_CHANGE) {
            if (wParam == WTS_SESSION_SWITCH) {
                DWORD sessionId = WTSGetActiveConsoleSessionId();
                WCHAR username[256];
                DWORD bytesReturned;
                if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionId, WTSUserName, &username, &bytesReturned)) {
                    // 更新监控目标用户为当前获取到的username
                    wprintf(L"当前活跃用户: %s\n", username);
                    WTSFreeMemory(username);
                }
            }
        }
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    

Linux平台解决方案

Linux的用户切换分桌面会话和虚拟控制台两种场景,需要分别处理:

1. 桌面会话切换(GNOME/KDE等)

大部分现代桌面环境通过D-Bus广播会话切换事件:

  • 先用dbus-monitor命令测试事件输出:
    dbus-monitor "type='signal',interface='org.gnome.SessionManager'"
    
    切换用户时会看到SessionSwitched信号,包含新会话ID。
  • 在监控进程中,用libdbus或者Python的dbus库监听该信号,再通过会话ID查询对应用户名(比如调用loginctl工具)。

2. 虚拟控制台(TTY)切换

对于纯终端环境的用户切换,可采用两种方式:

  • 定时轮询who -u命令,筛选带*标记的活跃会话:
    who -u | grep '*' | awk '{print $1}'
    
  • 用loginctl直接获取当前活跃会话的用户:
    loginctl show-session $(loginctl list-sessions | grep active | awk '{print $1}') -p User --value
    
    把这个逻辑集成到监控进程中,可定时执行或用inotify监控/proc相关文件变化触发检测。

通用优化建议

  • 维护一个全局的当前活跃用户变量,每次检测到切换就更新它,后续所有活动记录都关联这个变量,避免混淆不同用户的操作。
  • 对于多会话同时活跃的场景(比如远程桌面+本地桌面),要区分“前台活跃”和“后台会话”,可以给每个会话单独记录活动,或只聚焦前台用户。
  • 测试时模拟各种切换场景:Windows的Win+L锁屏切换、Linux的Ctrl+Alt+F1/F7控制台切换、远程桌面登录后的切换,确保监控逻辑能准确捕获变化。

内容的提问来源于stack exchange,提问作者Yuval Perelman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:00:39