我想安排强制注销闲置的 XP Home 用户,这些用户已“注销”,即他们已“切换”出控制台会话,但仍有进程在运行。我该怎么做?
我知道qwinsta.exe
和logoff.exe
。我想我已经接近解决方案了,但我对 Windows 脚本不够熟悉,无法制作连贯的批处理文件或调度(在 Unix 下,它很简单计划任务,awk, 和参数...)。
答案1
命令行功夫有一个精彩一集关于如何引导用户。我大量借鉴了这一集的内容并对其进行了修改以回答 pilcrow 的问题。
此命令使用 qwinsta 查询远程服务器的会话列表,并使用 rwinsta 重置断开的会话:
FOR /F "tokens=2,3" %i IN ('qwinsta /server:serverName ^| findstr "Disc"') DO @echo %i | findstr /v "[a-z]" && rwinsta /server:serverName %i
怎么运行的:
Qwinsta 创建一个表,显示目标服务器 serverName 上的终端会话。例如:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
0 Disc rdpwd
rdp-tcp 65536 Listen rdpwd
console 15 Conn wdcon
rdp-tcp#64 joeuser 8 Active rdpwd
rdp-tcp#84 janeuser 17 Active rdpwd
janetuser 20 Disc rdpwd
rdp-tcp#300 jimuser 25 Active rdpwd
processid 76 Disc rdpwd
使用 Qwinsta 查询服务器 serverName 中的所有会话,输出通过管道 (^|) 传入 findstr,使用“Disc”匹配断开连接的会话。这将仅匹配 ID 为 0、20 和 76 的会话。
'qwinsta /server:serverName ^| findstr "Disc"'
这FOR 循环执行命令 1,该命令将产生多行输出(取决于会话数)。对于每行输出,第 2 和第 3 个文本块(“tokens=2,3”)存储在 %i 和 %j 中(%j 是隐含的),然后执行命令 2,该命令将访问 %i 和 %j。对于 ID 0:%i = Disc,%j = rdpwd;对于 ID 20:%i = 20,%j = Disc;对于 ID 76:%i = 76,j% = Disc。
FOR /F "tokens=2,3" %i IN (command1) DO command2
这将显示第二个文本块,可以是 ID 或 STATE。
@echo %i
查找字符串匹配所有非字母字符,并丢弃 ID = 0 的行(因为 %i = Disc 且包含字母字符。
findstr /v "[a-z]"
仅当 findstr 成功完成时才会执行此操作。Rwinsta 重置会话,以 ID 为键,现在存储在 %i 中。这将重置 ID 20 和 76。
rwinsta /server:serverName %i
可以将其放入 .bat 文件中,然后使用Windows 调度重复运行该作业。在 .bat 文件中使用时,For 循环变量必须以额外的 % 作为前缀,因此 %i 将变成 %%i。