Quando um usuário está logado, ele pode facilmente usar quser.exe para ver todos os usuários logados.
Quero executar uma tarefa agendada (executando como SYSTEM) em vários momentos, e uma função no script tem o potencial de fazer algo que possa iniciar uma reinicialização. Portanto, antes que essa função seja executada, preciso primeiro verificar se algum usuário está logado.
No Win7, tenho verificado a saída de:
quser.exe 2>&1
para uma string "Nenhum usuário existe" e isso funciona muito bem. No entanto, não está funcionando no Win10.
A saída desse mesmo comando no Win10 quando ninguém está logado parece estar em branco/vazio. Um valor vazio parece algo arriscado de se testar porque há muitas fontes de erro possíveis para uma string vazia, levando o usuário a sofrer uma reinicialização inesperada. Não consigo usar uma notificação e contagem regressivapara avisar o usuário.
Existe alguma outra maneira (automatizada, obviamente) de verificar se nenhum usuário está logado no momento?
Responder1
Em vez de usar quser
(ou seja, consultar o usuário) e confiar em um retorno válido e vazio, uma solução melhor parece ser qwinsta
(ou seja, sessões de consulta).
Basicamente, consulte todas as sessões e analise o retorno dos nomes de usuário. As sessões executadas em serviços ou SYSTEM não possuem um nome de usuário. Então, no 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) {
...
Se a variável $userSessions
estiver em branco, nenhum usuário está logado. Se não estiver em branco, os usuários estão logados ou houve um erro. Não é perfeito, mas é mais seguro.