Batch脚本用Query User判断Windows服务器用户登录状态出错求助
解决Batch脚本误判断开连接用户为登录状态的问题
你的问题出在只检查了目标用户是否存在于query user的输出中,却没有过滤用户的连接状态。query user会列出所有曾经登录过(包括已断开)的用户,断开状态的用户会显示Disc(英文系统)或断开(中文系统),而真正处于活动登录的用户状态是Active(英文)或活动(中文)。如果脚本只匹配用户名,自然会把断开的用户误判为登录状态。
典型错误脚本(模拟你的写法)
@echo off set "targetUser=TestUser" query user | findstr /i "%targetUser%" if %errorlevel% equ 0 ( echo 用户已登录 ) else ( echo 用户未登录 )
这个脚本只要用户出现在列表里就判定登录,完全忽略了状态字段。
修正后的脚本
根据你的系统语言选择对应的版本:
英文系统版本
@echo off set "targetUser=TestUser" :: 先定位目标用户行,再过滤出状态为Active的记录 query user | findstr /i "%targetUser%" | findstr /i "Active" if %errorlevel% equ 0 ( echo %targetUser% 处于活动登录状态 ) else ( echo %targetUser% 未登录或已断开连接 )
中文系统版本
@echo off set "targetUser=测试用户" :: 先定位目标用户行,再过滤出状态为活动的记录 query user | findstr /i "%targetUser%" | findstr /i "活动" if %errorlevel% equ 0 ( echo %targetUser% 处于活动登录状态 ) else ( echo %targetUser% 未登录或已断开连接 )
原理说明
query user的典型输出(英文系统)示例:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME >administrator console 1 Active none 2024/5/20 10:00 testuser 2 Disc 1+00:00 2024/5/19 16:30
可以看到,活动用户的STATE列是Active,断开用户是Disc。修正后的脚本通过两次findstr:
- 第一次找到包含目标用户名的行
- 第二次只保留状态为活动的行
只有两次匹配都成功(errorlevel为0),才判定用户处于有效登录状态。
内容的提问来源于stack exchange,提问作者Jon Zavialov
相关产品推荐
相关产品推荐

