如何在Windows 11的Session 0服务中监控用户活动?
Windows 11 Session 0 服务中监控用户活动的问题
我之前用以下方案从服务中监控用户活动,在Windows 10中可正常运行,但在Windows 11里仅能识别按键按下/释放事件,无法检测鼠标活动——显然Windows 11下csrss.exe的行为发生了变化。
我已排查psutil返回的csrss.exe所有可用信息,未找到Windows 11中监控鼠标活动的替代方法。核心需求是:如何在Windows 11的Session 0服务中监控用户活动?
希望找到可与现有方案结合或直接替代的方法,感谢帮助!
原方案代码
import psutil def get_csrss_pids() -> list[int]: """获取Windows客户端服务器运行时进程(csrss.exe)的PID列表""" return [ proc.pid for proc in psutil.process_iter(attrs=['name']) if proc.name() == 'csrss.exe' ] def get_io(pids: list[int]) -> list[int]: """返回给定csrss.exe PID的最后一次read_bytes值""" return [psutil.Process(pid).io_counters().read_bytes for pid in pids] pids = get_csrss_pids() last_io = get_io(pids) # 存储初始值用于后续对比 while True: try: if (tick := get_io(pids)) != last_io: # 检测到活动时 print(tick) # 执行对应操作 last_io = tick # 更新对比值 except KeyboardInterrupt: break
可行替代方案
1. 基于Windows API GetLastInputInfo(跨会话访问)
Session 0服务默认无法直接访问用户会话输入信息,需先获取用户会话权限:
- 调用
WTSGetActiveConsoleSessionId获取当前活跃用户会话ID - 用
WTSQueryUserToken获取该会话的用户令牌 - 通过
SetThreadToken将服务线程切换到用户令牌上下文 - 打开用户会话桌面(
OpenDesktop)并设置线程桌面(SetThreadDesktop) - 此时可调用
GetLastInputInfo获取最后输入时间,以此判断用户活跃状态
2. 全局钩子+跨进程通信
创建在用户会话中运行的辅助进程,用User32.dll的SetWindowsHookEx注册WH_MOUSE_LL/WH_KEYBOARD_LL全局钩子捕获鼠标/键盘事件,再通过命名管道等IPC方式将事件传递给Session 0服务。
3. 监控系统事件日志
通过监控系统中与用户活动相关的事件日志间接判断状态,例如:
- 事件ID 4624(用户登录)
- 事件ID 4634(用户注销)
- 系统睡眠唤醒事件
注:此方式无法实时监控鼠标/键盘的即时操作
注意事项
- Windows 11对Session 0隔离限制更严格,跨会话访问需确保服务以Local System身份运行并拥有足够权限
- 全局钩子必须在用户会话进程中注册,无法直接在Session 0服务中创建
内容的提问来源于stack exchange,提问作者JRiggles
相关产品推荐
相关产品推荐

