当用户登录时,他们可以轻松使用 quser.exe 查看所有登录的用户。
我想在不同时间运行计划任务(以 SYSTEM 身份运行),并且脚本中的一个函数可能会执行一些可能导致重新启动的操作。因此,在运行该函数之前,我需要先检查是否有任何用户已登录。
在 Win7 中,我一直在检查输出:
quser.exe 2>&1
表示“不存在用户”字符串,效果很好。然而,在 Win10 中却不起作用。
当无人登录时,在 Win10 中执行同一命令的输出似乎为空白。测试空值似乎很危险,因为空字符串可能存在许多错误源,导致用户遇到意外重启。 我无法使用通知和倒计时警告用户。
还有其他方法(显然是自动化的)来验证当前没有用户登录吗?
答案1
与其使用quser
(即查询用户)并依赖有效的空返回,更好的解决方案似乎是使用qwinsta
(即查询会话)。
基本上,查询所有会话,并解析返回的用户名。在服务或 SYSTEM 下运行的会话没有用户名。因此在 PowerShell 中:
$qwinstaOut = & "$env:windir\system32\QWinSta.exe"
if (-not $qwinstaOut) {
$UserSessions = "unknown"
} else {
$UserSessions = $qwinstaOut[1..($qwinstaOut.count-1)] | % {$_.substring(19)} | ? {$_ -match "^\w"}
}
# If there are no sessions with a username, this must be running as SYSTEM
if (-not $UserSessions) {
...
如果变量$userSessions
为空,则表示没有用户登录。如果不为空,则表示用户已登录或出现错误。虽然不完美,但更安全。