Когда пользователь вошел в систему, он может легко использовать quser.exe, чтобы увидеть всех вошедших в систему пользователей.
Я хочу запустить запланированную задачу (работая как SYSTEM) в разное время, и одна функция в скрипте может сделать что-то, что может запустить перезагрузку. Таким образом, перед запуском этой функции мне нужно сначала проверить, вошли ли в систему какие-либо пользователи.
В Win7 я проверял вывод:
quser.exe 2>&1
для строки "No user exist", и это отлично работает. Однако в 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
пустая, то пользователи не вошли в систему. Если она не пустая, то либо пользователи вошли в систему, либо произошла ошибка. Не идеально, но безопаснее.