SYSTEM上下文下任务计划执行PowerShell脚本无法捕获query user输出
任务计划以SYSTEM上下文执行PowerShell脚本无输出的原因及解决办法
问题回顾
本地执行以下PowerShell脚本时,能正常捕获用户会话并输出到D:\output.txt,但通过任务计划以SYSTEM账户执行时,输出文件为空:
$AllSessions = C:\WINDOWS\system32\query.exe user 2>&1 $UserSessions = $AllSessions | Select-String -Pattern '^>(?!Testuser1)(\w+)' $UserSessions | Out-File "D:\output.txt"
核心原因
- 文件系统重定向导致工具版本不一致:64位Windows系统中,若任务计划调用32位PowerShell进程,访问
C:\WINDOWS\system32\query.exe会被自动重定向到C:\WINDOWS\SysWOW64\query.exe,32位版本的query.exe输出格式与64位存在差异,SYSTEM账户下的输出可能没有正则匹配的^>开头行。 - SYSTEM账户的会话输出无
>标记:普通用户执行query user时,当前活跃会话会以>标记开头,但SYSTEM账户本身无交互式登录会话,执行该命令的输出格式不包含此标记,导致正则表达式无法匹配到内容。
解决办法
1. 强制调用64位query.exe
使用Sysnative别名绕过文件系统重定向,确保调用64位版本的工具:
$AllSessions = C:\WINDOWS\Sysnative\query.exe user 2>&1 $UserSessions = $AllSessions | Select-String -Pattern '^>(?!Testuser1)(\w+)' $UserSessions | Out-File "D:\output.txt"
2. 调整正则表达式,脱离>标记依赖
修改正则匹配逻辑,直接匹配用户名部分并排除Testuser1,无需依赖>标记:
$AllSessions = C:\WINDOWS\system32\query.exe user 2>&1 # 匹配非Testuser1的用户会话,以用户名开头 $UserSessions = $AllSessions | Select-String -Pattern '^(?!Testuser1)(\w+)\s+' $UserSessions | Out-File "D:\output.txt"
3. 指定任务计划使用64位PowerShell
在任务计划的操作设置中,明确指定64位PowerShell的路径:
- 程序/脚本:
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe - 添加参数:
-ExecutionPolicy Bypass -File "你的脚本完整路径.ps1"
4. 先验证SYSTEM账户下的query输出
手动以SYSTEM权限执行query user查看实际输出格式,再调整正则:
- 借助PsTools工具,打开命令提示符执行
psexec -s cmd.exe - 在弹出的SYSTEM权限命令行中执行
query user,根据输出内容修改正则表达式。
内容的提问来源于stack exchange,提问作者Dhillli4u
相关产品推荐
相关产品推荐

