Некоторые картинки не загружаются из РФ и РК, используйте VPN.

воскресенье, 4 июня 2023 г.

Batch Script logoff users

Для корректности бэкапа требуется выгнать всех пользователей из системы, году еще в 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


Комментариев нет:

Отправить комментарий