安排空闲用户的硬注销

安排空闲用户的硬注销

我想安排强制注销闲置的 XP Home 用户,这些用户已“注销”,即他们已“切换”出控制台会话,但仍有进程在运行。我该怎么做?

我知道qwinsta.exelogoff.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。

相关内容