На просторах можно найти полный красивый скрипт, но мне достаточно вот этой строки для оценки
WMIC LogicalDisk WHERE "DriveType='3'" GET FreeSpace^, Name^, Size
На просторах можно найти полный красивый скрипт, но мне достаточно вот этой строки для оценки
WMIC LogicalDisk WHERE "DriveType='3'" GET FreeSpace^, Name^, Size
![]() |
В 4ый раз делать скрин мне лень, логика та же |
Отталкиваясь от описания можно заставить KeePass открывать SCP соединение с автоматической авторизацией в WinSCP. Cтрочка "URL override":
cmd://%systemdrive%\progra~2\WinSCP\WinSCP.exe {BASE:RMVSCM} /newinstance /username={USERNAME} /password={PASSWORD}
У WinScp отдельного параметра для порта нет, поэтому без извращений
Как посмотреть симовлические ссылки в Windows
dir /AL /S "C:\Users\%username%"
А это список ссылок, которые есть в профиле пользователя (пысы, случайно грохнул содержимое своей папки пользователя О_О)
mklink /j "C:\Users\%username%\Application Data" "C:\Users\%username%\AppData\Roaming"
mklink /j "C:\Users\%username%\Cookies" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Cookies"
mklink /j "C:\Users\%username%\Local Settings" "C:\Users\%username%\AppData\Local"
mklink /j "C:\Users\%username%\NetHood" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Network Shortcuts"
mklink /j "C:\Users\%username%\PrintHood" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Printer Shortcuts"
mklink /j "C:\Users\%username%\Recent" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Recent"
mklink /j "C:\Users\%username%\SendTo" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo"
mklink /j "C:\Users\%username%\Главное меню" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu"
mklink /j "C:\Users\%username%\Мои документы" "C:\Users\%username%\Documents"
mklink /j "C:\Users\%username%\Шаблоны" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Templates"
mklink /j "C:\Users\%username%\AppData\Local\Application Data" "C:\Users\%username%\AppData\Local"
mklink /j "C:\Users\%username%\AppData\Local\History" "C:\Users\%username%\AppData\Local\Microsoft\Windows\History"
mklink /j "C:\Users\%username%\AppData\Local\Temporary Internet Files" "C:\Users\%username%\AppData\Local\Microsoft\Windows\Temporary Internet Files"
mklink /j "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Программы" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs"
mklink /j "C:\Users\%username%\Documents\Мои видеозаписи" "C:\Users\%username%\Videos"
mklink /j "C:\Users\%username%\Documents\Мои рисунки" "C:\Users\%username%\Pictures"
mklink /j "C:\Users\%username%\Documents\Моя музыка" "C:\Users\%username%\Music"
Отталкиваясь от описания можно заставить FileZille открывать FTP соединение с автоматической авторизацией. Cтрочка "URL override":
cmd://%systemdrive%\progra~1\Filezi~1\filezilla.exe ftp://{USERNAME}:{PASSWORD}@{BASE:RMVSCM}
Google Chrome (да и большинство браузеров) можно настроить так, что при закрытии он удаляет все данные работы, как инкогнито, но не инкогнито (читай тут). Встала задача провернуть такое же с учеткой Windows.
Сразу, это длинопост, в котором нет конкретного решения, есть мой путь к моему решению в самом конце
СБИС по прежнему не умеет запускать плагин с remoteapp, а мне уж порядком поднадоело ручками создавать задачу в планировщике. Я попробовал сделать задачу при помощи CMD:
set "nameuser=%USERDOMAIN%\%username%"
set "nametask=SBIS Plugin %nameuser%"
schtasks /create /sc ONLOGON /ru %nameuser% /it /tn "%nametask%" /tr "C:\PROGRA~2\TENSOR~1\SBIS3Plugin\sbis3plugin.exe --autostart"
И потерпел фиаско по двум пунктам
$name = Read-Host -Prompt "Enter your name"
$TaskName = "SBIS PLUGIN for $name"
$username ="$env:USERDOMAIN\$name"
#create a scheduled task with powershell
$Action = New-ScheduledTaskAction -Execute "C:\PROGRA~2\TENSOR~1\SBIS3Plugin\sbis3plugin.exe" -Argument "--autostart"
$Trigger = New-ScheduledTaskTrigger -AtLogOn -User $username
Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -User $username
Ничего лишнего, только запрос имени пользователя, домен вытаскивается текущий
Стоит отметить, что параметр --autostart не обязателен
dir /X ~1 "c:\" - отобразит короткие имена каталогов, удобно, когда нельзя использовать пробелы. Логика проста - первые 6 символов + тильда + порядковый номер, понятно, что это условно, но в большинстве случаев нет каталогов с одинаковыми именами.
Например: C:\PROGRA~2\TENSOR~1\SBIS3Plugin\sbis3plugin.exe
Для корректности бэкапа требуется выгнать всех пользователей из системы, году еще в 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
![]() |
В 4ый раз делать скрин мне лень, логика та же |
Отталкиваясь от описания можно заставить KeePass открывать SSH соединение с автоматической авторизацией в PUTTY. Это конечно не best practics, ибо эту же проблему решают ssh ключи, но такое возможно, строчка "URL override":
cmd://Putty.exe -ssh {USERNAME}@{BASE:RMVSCM} -pw {PASSWORD}
Обновление 12/10/2023. Вылез косяк с нестандартными портами, новый вариант выглядит так:
cmd://Putty.exe -ssh {BASE:HOST} -l {USERNAME} -pw {PASSWORD} -P {T-REPLACE-RX:#{BASE:PORT}#-1#22#}
Конструкция в конце говорит, что если порт не найден (не указан в url через ":"), то вставить 22
Отталкиваясь от описания можно заставить KeePass открывать RDP соединение с автоматической авторизацией. Вообще сам mstsc не поддерживает, но можно заранее записать креды, а потом удалить, собственно эта строчка именно это и делает
cmd://powershell.exe "cmdkey /add:{BASE:RMVSCM} /user:{USERNAME} /pass:{PASSWORD}; mstsc /v:{BASE:RMVSCM}; timeout 10; cmdkey /delete:{BASE:RMVSCM}"
Вариант с подстановкой адреса сервера как домена для имени пользователя
cmd://powershell.exe "cmdkey /add:{BASE:RMVSCM} /user:{BASE:RMVSCM}\{USERNAME} /pass:{PASSWORD}; mstsc /v:{BASE:RMVSCM}; timeout 10; cmdkey /delete:{BASE:RMVSCM}"
Таймаут нужен для того, чтобы успеть пройти авторизацию или подключение.
Скорее всего не прокатит для тех, у кого стоит запрет сохранения пароля на стороне сервера и также не поддерживается шлюз
Up
Да, не прокатит, а вот со шлюзом тоже можно настроить.
cmd://powershell.exe "cmdkey /add:{BASE:RMVSCM} /user:{USERNAME} /pass:{PASSWORD}; cmdkey /add:{S:rdpGateway} /user:{USERNAME} /pass:{PASSWORD}; mstsc /v:{BASE:RMVSCM} /g:{S:rdpGateway}; timeout 10; cmdkey /delete:{BASE:RMVSCM};cmdkey /delete:{S:rdpGateway}"
Здесь мы добавляем учетку сразу для шлюза и для сервера, если они совпадают. При этом адрес шлюза записан на вкладке Advanced в String Fields
Лично я сделал отдельную схему для вариантов со шлюзом - grdp
UP
Есть косяк с паролями, которые содержат знак $
Обновление 12/10/2023. Вылез косяк с нестандартными портами, новый вариант выглядит так:
cmd://powershell.exe -NoProfile -WindowStyle Hidden -Command "$user=\"{T-REPLACE-RX:#{BASE:HOST}\{USERNAME}#(.*)\\(.*)\\(.*)#$2\$3#}\"; cmdkey /add:{BASE:HOST} /user:$user /pass:\"{PASSWORD}\"; mstsc /v:{BASE:RMVSCM}; timeout 10; cmdkey /delete:{BASE:HOST}"
И
cmd://powershell.exe -NoProfile -WindowStyle Hidden -Command "$user=\"{T-REPLACE-RX:#{BASE:HOST}\{USERNAME}#(.*)\\(.*)\\(.*)#$2\$3#}\"; cmdkey /add:{BASE:HOST} /user:$user /pass:\"{PASSWORD}\"; cmdkey /add:{S:rdpGateway} /user:$user /pass:\"{PASSWORD}\"; mstsc /v:{BASE:RMVSCM} /g:{S:rdpGateway}; timeout 10; cmdkey /delete:{BASE:HOST};cmdkey /delete:{S:rdpGateway};"
Поясню, конструкция:
"{T-REPLACE-RX:#{BASE:HOST}\{USERNAME}#(.*)\\(.*)\\(.*)#$2\$3#}"
Обманка, подставляет хост как домен, в том случае, если домен не указан в имени пользователя. Я до сих пор не понимаю почему оно работает, я вышел на нее случайным образом.
А конструкция:
-NoProfile -WindowStyle Hidden -Command
Скрывает окно сразу, в диагностических целях можно не добавлять
P.S. даже в кавычках, пароль не принимается со знаком $
Отталкиваясь от описания можно заставить KeePass открывать Anydesk с указанным ID, ID просто передается первым параметром для anydesk.exe.
cmd://"%PROGRAMFILES(x86)%\AnyDesk\AnyDesk.exe" {BASE:RMVSCM}
А как ему еще и пароль воткнуть?
cmd://cmd.exe /C "echo {PASSWORD} | "%PROGRAMFILES(x86)%\AnyDesk\AnyDesk.exe" {BASE:RMVSCM} --with-password"
Но, у этого варианта есть косяк - окно консоли будет висеть до тех пор, пока процесс anydesk не будет завершен
Но, если использовать не CMD, а powershell, то окно закроется сразу после отправки команды
cmd://powershell.exe "echo {PASSWORD} | "C:\progra~2\AnyDesk\AnyDesk.exe" {BASE:RMVSCM} --with-password"
При этом ExecutionPolicy корректировать не надо
Отмечу, что Anydesk устанавливается в "C:\Programm Files (x86)" и из-за пробелов такая конструкция вызовет ошибку:
cmd://powershell.exe -NoProfile -WindowStyle Hidden -Command "echo {PASSWORD} | %PROGRAMFILES(x86)%\anydesk\anydesk.exe {BASE:RMVSCM} --with-password"
UP январь 2024 года. После переустановки ОС и установки последней версии KeePass, перестал работать предыдщуий вариант. Выдавал ошибку:
Выражения допускаются только в качестве первого элемента конвейера.
Вот такой вариант работает
cmd://powershell.exe -NoProfile -WindowStyle Hidden -Command "Write-Output {PASSWORD} | &"$Env:ProgramFiles\AnyDesk\AnyDesk.exe" {BASE:RMVSCM} --with-password"
Говорят, если запретить 1С выход в интернет, то она работает быстрее. Сервисами чел не пользуется, так что решил на нем потренироваться и описал такой скрпит:
@echo off
set Prg="%systemdrive%\progra*"
SETLOCAL EnableDelayedExpansion
FOR /D %%i in ("!Prg!") do (
FOR /D %%j in ("%%i\1cv8\8*") do (
echo %%j
set pathProg=%%j\bin
set ver=!pathProg:*1cv8\=!
FOR /F "tokens=*" %%k in ('dir /b "!pathProg!\1cv*.exe"') do (
echo. %%k
set nameEXE=!pathProg!\%%k
set nameFW="Block1C_%%k_!ver!"
netsh advfirewall firewall show rule name=!nameFW! >null && set RuleExist=1 || set RuleExist=0
if !RuleExist! EQU 0 (
netsh advfirewall firewall add rule name="!nameFW!" dir=out program="!nameEXE!" profile=any action=block
) else (
echo. Rule !nameFW! are exist
)
)
echo.
)
echo.
)
SETLOCAL DisableDelayedExpansion
Что он делает - проверяет на наличие (по имени сформированному им самим) и добавляет, при отсутствии, правила блокировки для \Progra*\1cv8\8*\bin\1cv*.exe, т.е. неважно какая платформа, какая разрядность или какой клиент.
Вот так просто получаем список правил:
Как видим, задача решена простым перебором во вложенных циклах. Данный скрипт оставляю на память:
Простенький однострочный скрипт для мониторинга обновления dns записи. Для мониторинга SOA записи не очень подходит, т.к. на днс яндекса записи некоторое время бесятся, а вот верификация - да
FOR /L %N IN () DO nslookup -type=soa domen.ru 77.88.8.8 2> NULL |findstr /i "dns-hosting.yandex.ru" && (echo OK && ping -t 127.0.0.1 ) || (echo not && ping -n 10 127.0.0.1 > NULL && cls)
С человеческим таймаутом
FOR /L %N IN () DO nslookup -type=soa domen.ru 77.88.8.8 2> NULL |findstr /i "dns-hosting.yandex.ru" && (echo OK && ping -t 127.0.0.1 ) || (echo not && timeout 10 && cls)
Пока не появится фраза "dns-hosting.yandex.ru" в выдаче команды nslookup будет выдаваться not, как только появится - пойдет непрекращающийся пинг. Открывает в пол отдельного монитора и смотрим крайем глаза. Пример цикла пока истина
Когда нет GPO, приходится довольствоваться руками и собственной автоматизацией. Чтобы не ходить по пользователям можно подготовить пачку батников и попросить их запустить их.
cmdkey /add:nas /user:USERNAME /pass:USER_PASS
net use /DELETE Z:
net use /DELETE Y:
net use Z: \\nas\SharedFolder /persistent:yes
net use Y: \\nas\Skan /persistent:yes
Совсем простенько, первая строка добавляет запись в "Учетные данные Windows", если у пользователя локального имя и пароль совпадают с шарой, то необязательно.
Вторая и третья удаляют текущие занятые диски, можно использовать net use /DELETE *
Последние добавляют шары, можно использовать имя ресурса, а не IP.
IP привязывать на роутере. У Mikrotik для этого нужно использовать домен (иначе не будет резловить за пределами роутера):
Если речь идет о сервере (я подключал NAS через туннель), то сопоставить можно в файле hosts