You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Python-mss捕获Windows系统中其他用户的屏幕?

从管理员账户捕获Windows其他用户屏幕的可行方案

首先直接给结论:这个需求是可以实现的,但你得绕开Windows的会话隔离机制,而且需要特定的权限和工具支持。你遇到的问题本质是Windows的用户会话隔离——每个用户登录后都会运行在独立的会话(Session)里,默认情况下,一个会话中的进程根本没法直接访问另一个会话的显示输出,这就是为什么你切换用户后脚本还是只录管理员账户的屏幕。

下面给你几个实际可行的方案,从易到难排序:

方案1:用psexec把捕获脚本放到kiosk会话里运行

这是最省心的方法,原理就是让捕获脚本直接运行在kiosk用户的会话中,自然就能捕获它的屏幕。步骤大概是这样:

  1. 先获取kiosk用户的会话ID:打开管理员命令行,运行query session,找到kiosk账户对应的ID号(比如可能是2)。
  2. 用Sysinternals的psexec工具,以SYSTEM权限在kiosk会话中启动你的Python捕获脚本:
    psexec -s -i <kiosk_session_id> python "C:\path\to\your\capture_script.py"
    
    这里-s表示以SYSTEM权限运行,-i指定要附着的会话ID。
  3. 脚本运行后,录制的内容可以存到共享文件夹里,或者你直接在管理员账户里通过进程通信获取,只要确保权限设置正确,管理员能访问这些文件就行。

方案2:改用支持跨会话捕获的工具替代mss

mss本身是基于用户态的GDI/DXGI捕获工具,天生只能访问当前会话的内容。如果你不想把脚本放到kiosk会话,那得换用支持跨会话的工具或API:

  • 用ffmpeg的gdigrab模块:在SYSTEM权限下,ffmpeg可以指定目标会话的桌面进行捕获。先获取kiosk的会话ID,然后运行类似这样的命令(Python可以用subprocess调用):
    ffmpeg -f gdigrab -desktop_name \\<session_id>\WinSta0\Default -framerate 30 -i none "C:\shared\kiosk_recording.mp4"
    
  • 调用Windows的DuplicateOutput API:这个API允许高权限进程捕获其他会话的显示输出,但实现起来比较复杂,需要用pywin32库来调用,还要处理窗口站、桌面句柄的权限问题,适合有一定Windows API经验的开发者。

关键注意事项

  • 权限是核心:所有跨会话捕获的操作都需要SYSTEM权限,普通的管理员权限不够。你可以用runas /user:NT AUTHORITY\SYSTEM cmd.exe来启动一个SYSTEM权限的命令行,再在里面运行工具或脚本。
  • 会话ID别搞错:一定要确认kiosk用户的会话ID,query session命令会列出所有当前登录的会话,仔细核对用户名对应的ID。
  • mss的局限性:如果坚持要用mss,那只能把它部署到kiosk会话中运行,没办法在管理员会话直接捕获kiosk的屏幕——这是mss的设计限制,没法绕过。

总的来说,Windows的用户隔离确实增加了难度,但通过高权限工具和跨会话执行的方式,完全可以实现你的需求,推荐先试试方案1,操作起来最简单。

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

火山引擎 最新活动