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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:57:35