В качестве фона для этого вопроса: у нас есть терминальный сервер Windows Server 2012 R2, на котором пользователи выполняют длительную работу, поэтому мы очень стараемся не перезагружать сервер безуспешно. Однако иногда это необходимо (установка обновлений является наиболее важным), и в настоящее время для этого требуется много общения и ручное вмешательство.
Это было бы очень важно, если бы перезагрузка могла произойти автоматически, когда сервер не используется. До сих пор моя лучшая попытка включала запланированную задачу, запускаемую по событию Security/Security Auditing/4634 (Logoff)
, но мне не удалось затем определить, был ли только что отключенный сеанс последним сеансом, и в любом случае это может быть не лучшим подходом.
Есть ли способ выполнить задачу (например, PS Restart-Computer) при отсутствии активных сеансов (интерактивных или отключенных)?
Что-то вроде этого может сработать. Запустите его как одноразовую запланированную задачу с системой идентификации, когда вам нужно перезапустить.
SET LOGFILE=C:\TEMP\Reboot.log
ECHO. (*) %DATE% %TIME% > %LOGFILE%
:CHECKSESSIONS
ECHO. (*) %DATE% %TIME% Waiting one minute... >> %LOGFILE%
REM WAIT ONE MINUTE
TIMEOUT /T 60
QUERY USER >> %LOGFILE% 2>&1
FOR /F "tokens=*" %%i IN ('QUERY USER ^| FIND /C "Active"') DO SET ACTIVESESSIONS=%%i >> %LOGFILE% 2>&1
IF %ACTIVESESSIONS% GTR 0 (
ECHO Active sessions: %ACTIVESESSIONS% >> %LOGFILE% 2>&1
GOTO :CHECKSESSIONS
)
FOR /F "tokens=*" %%i IN ('QUERY USER ^| FIND /C "Disc"') DO SET DISCONNECTEDSESSIONS=%%i >> %LOGFILE% 2>&1
IF %DISCONNECTEDSESSIONS% GTR 0 (
ECHO Disconnected sessions: %DISCONNECTEDSESSIONS% >> %LOGFILE% 2>&1
GOTO :CHECKSESSIONS
)
ECHO. (*) %DATE% %TIME% Restarting computer >> %LOGFILE%
SHUTDOWN /F /R /T 0 >> %LOGFILE% 2>&1