我想安排强制注销闲置的XP Home家庭用户,他们已经“注销”了,因为他们已经从他们的控制台会话中“切换”出来,但仍然有进程在运行。 我怎样才能做到这一点?
我知道qwinsta.exe和logoff.exe 。 我想我已经接近了一个解决scheme,但是对Windows脚本编制不够熟悉,无法做出连贯的batch file或调度(在Unix下它就像cron , awk和xargs一样简单)。
命令行功夫有关如何启动用户的一个很好的插曲 。 我已经从这个剧集中借了很多钱,并且修改它来回答这个问题。
此命令使用qwinsta向远程服务器查询会话列表,并使用rwinsta重置断开连接的会话:
FOR /F "tokens=2,3" %i IN ('qwinsta /server:serverName ^| findstr "Disc"') DO @echo %i | findstr /v "[az]" && rwinsta /server:serverName %i
怎么运行的:
Qwinsta在目标服务器serverName上创build一个显示terminal会话的表格。 例如:
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循环执行command1,它产生几行输出(取决于会话的数量)。 对于每行输出,第二和第三块文本(“标记= 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%=光盘。
FOR /F "tokens=2,3" %i IN (command1) DO command2
这将显示第二个文本块,可以是ID或STATE。
@echo %i
Findstr匹配所有非字母字符,并丢弃ID = 0的行(因为%i = Disc且包含字母字符。
findstr /v "[az]"
这只有在findstr成功完成时才会执行。 Rwinsta重置会话,由ID键入,现在存储在%i中。 这将重置ID 20和76。
rwinsta /server:serverName %i
这可以通过将其放在.bat文件中,并使用Windows计划来重复运行作业来实现自动化。 在.bat文件中使用时,For循环variables必须以%为前缀,所以%i变成%% i。