Для корректности бэкапа требуется выгнать всех пользователей из системы, году еще в 17ом написал скрипт, сегодня немного подпилил. В этом скрипте стоит отметить как заметку - использование "функции". Скрипт проверен и на Windows server 2008 и на Windows server 2019. Для работы требует повышения прав, поэтому в лучше запихать в планировщик задач.
@echo off
:://Скрипт логофа пользователей всех кроме заданного или текущего
::// logoff.bat name_exclude path_log_file
cd %~dp0
set tmp=tmp.txt
set nprg=%~nx0
set pprg=%~dp0
set ver=0.2
set logout=%systemroot%\System32\logoff.exe
set sys32=%systemroot%\system32\
if "%~1" == "help" (
echo -------------------------------------------------
echo.
echo Batch-script '%nprg% ver %ver%'
echo.
echo -------------------------------------------------
echo Use %nprg% name_user_exclude path_log_file
echo.
echo Example:
echo %nprg% admin C:\logFile.log
echo.
echo If run without param, exluded is user runed script, without log
echo.
echo If run
echo %nprg% "" path_log_file
echo exluded is user runed script, with your logFile
exit /b 0
)
echo %date% Batch-script '%nprg% ver %ver%' is on
echo %date% Use %nprg% help
:://Если параметр не передан, то юзенэйм равно текущий юзер
if "%~1" == "" ( set usern=%username%) else ( set usern=%~1 )
if "%~2" == "" ( Call :Log "Log file not specifed!" ) else ( set log_file=%~2 )
Call :Log "-------------------------------------------------"
Call :Log "Exclude %usern%"
echo.
cd %pprg%
Setlocal EnableDelayedExpansion
%sys32%\query.exe user | %sys32%\findstr.exe /v /i %usern%> %tmp%
::// Вариации: токен 1 или 2 - это имя пользователя; токен 2 или 3 - ID
for /f "skip=1 tokens=1-3" %%a in ( 'cmd /c type %tmp%') DO (
echo.
echo -------------------------------------------------
echo.
Call :FindToken "%%c"
if !errorlevel!==0 (
set "user=%%a"
rem Удаляем ">" из имени текущего пользователя, если не удалить, то функция лога не отработает
set "user=!!user:>=!!"
set "ID=%%c"
) else (
set "user=%%a"
set "ID=%%b"
)
Call :Log "Found user=!user! ID=!ID!"
if "!usern!" neq "!user!" (
start /WAIT !logout! !ID!
if !errorlevel! equ 0 (
set "stateLogOff=succesfully"
) else (
set "stateLogOff=FAILED"
)
Call :Log " Session user '!user!' ended !stateLogOff!"
)
)
Endlocal
echo.
Call :Log "-------------------------------------------------"
del /Q %tmp%
Exit
:://Возвращает 1, если в токене № 3 есть нечисловые символы - "^" заворачивает условие в другую сторону О_О
:FindToken
echo.%~1|>nul %sys32%\findstr.exe /R "[^0-9]" && exit /b 1
echo.%~1|>nul %sys32%\findstr.exe /R "[^0-9]" || exit /b 0
:://Функция логирования
:Log
set ech=%~1
echo %time% %ech%
if defined log_file ( echo %date% %time% %ech% >>%log_file% )
exit /b 0
Комментариев нет:
Отправить комментарий