Посреди океана |
Отталкиваясь от описания можно заставить FileZille открывать FTP соединение с автоматической авторизацией. Cтрочка "URL override":
cmd://%systemdrive%\progra~1\Filezi~1\filezilla.exe ftp://{USERNAME}:{PASSWORD}@{BASE:RMVSCM}
Проблема: некоторые принтеры на сервере(ах) без закономерности меняют статус на Offline (не подключен)
Подробности: сеть хостера и сеть клиента соединены GRE туннелем. Дабы избежать проблем пробраса принтеров, они были установлены прямо на сервер. Появились жалобы "принтер не работает", перезапуск spooler в 90% решает проблему, в остальных случаях требуется повторный перезапуск. Перезагрузка сервера не решила проблему. Проблема появилась также на других серверах у данного хостера, где установлены принтеры. Сервера на базе Windows server 2019.
Простой скрипт добавления интерфейса IKEv2. Данное решение выполняет следующие задачи:
Понадобилось закодировать скрипт, но не ради обмана антивируса, а из-за нежелания возиться с экранированием символов при создании скрипта из батника. В итоге родилось вот такое чудо:
param ($CreateBatch=$False)
$CurrentDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location -Path $CurrentDir
if ($CreateBatch -eq $true) {
$ps_file_name=(Get-Item $PSCommandPath).Name
$cmd_file_name=((Get-Item $PSCommandPath).Basename+".bat")
$encoded_script=[Convert]::ToBase64String( [System.Text.Encoding]::Unicode.GetBytes( $(Get-Content $ps_file_name -Raw)))
$content=("@echo off`r`n"+
"cd %~dp0`r`n"+
"powershell -Command [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('$encoded_script'))>$ps_file_name`r`n"+
"powershell -NoProfile -ExecutionPolicy Bypass -File $ps_file_name`r`n"+
"pause")
out-file -FilePath $CurrentDir\$cmd_file_name -InputObject $content -Encoding ASCII
exit
}
Данная заготовка добавляет параметр (добавьте его, если блок с параметрами уже есть) и проверяет его, если он истин, то выполняется создание батника с закодированным скриптом. Батник будет иметь такое же имя с расширением bat и лежать в этой же директории.
Именно Get-Content -Raw позволяет закодировать и раскодировать потом скрипт со всеми переносами строк. Если в скрипте нет обращений к файлам с неизвестным расположением, то можно выполнить скрипт без разворачивания в отдельный файл командой powershell -enc "закодированная строка".
Создать RemoteApp без установки оснастки и дополнительных приложений можно прописав в реестре
Пример на Google Chrome
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList\Applications\Chrome]
"RequiredCommandLine"=""
"Name"="Google"
"SecurityDescriptor"=""
"Path"="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
"ShortPath"="C:\\PROGRA~2\\Google\\Chrome\\Application\\chrome.exe"
"ShowInTSWA"=dword:00000000
"CommandLineSetting"=dword:00000000
"VPath"="%SYSTEMDRIVE%\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
И файл RDP
allow desktop composition:i:1
allow font smoothing:i:1
alternate full address:s:SERVER_ADDRESS
alternate shell:s:rdpinit.exe
devicestoredirect:s:*
disableremoteappcapscheck:i:1
drivestoredirect:s:*
full address:s:SERVER_ADDRESS
prompt for credentials on client:i:1
promptcredentialonce:i:0
redirectcomports:i:1
redirectdrives:i:1
remoteapplicationmode:i:1
remoteapplicationname:s:Google
remoteapplicationprogram:s:||Chrome
span monitors:i:1
use multimon:i:1
Да, можно использовать VPN, разрешенные списки IP адресов и прочее, но бывают случаи, когда требуется прямой доступ к машине без всего этого. Тогда встает вопрос о хотя бы защите от грубого перебора паролей? Есть некоторое количество программ, которые позволяют это сделать, но к сожалению они не являются частью ОС Windows. На просторах интернета был найден скрипт и слегка доработан, можно его использовать повесив в планировщике на событие 4625 журнала безопасность.
Также для работы нужно правило в firewall с именем BlockRDP (читай комментарии к скрипту)
# After first run you need to create firewall rule
# New-NetFirewallRule -DisplayName "BlockRDPBruteForce" –RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Block
# In action task scheduler. Check name script file
# %systemroot%\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\ps\ban_rdp_brutfors.ps1"
$log = "C:\ps\blocked_ip.txt"
$interval = 600000; #600000ms = 10min
$count_fail = 5
# фильтр событий в журнале
$XPath = "*[System[Provider[@Name=""Microsoft-Windows-Security-Auditing""]
and Task = 12544
and (band(Keywords,4503599627370496))
and (EventID=4625)
and TimeCreated[timediff(@SystemTime) >= $interval]]]";
$list_IP =@();
$Events = @();
# выбираем события
try { $Events = Get-WinEvent -Logname "security" -FilterXPath $XPath -ErrorAction Stop
}
catch [Exception] {
if ($_.Exception -match "Не удалось найти события, соответствующие указанному условию выбора.") {
Write-Host "Не найдены события перебора паролей за последние $($interval/60000) мин.";
exit;
}
}
# выбираем IP адреса
$list_IP = $Events | ForEach-Object {
([xml]$_.ToXML()).Event.EventData.Data | Where-Object {$_.Name -eq "IpAddress"} | ForEach-Object {$_."#text"}} | Where-Object {$_ -ne "-" };
$current_ips = @((Get-NetFirewallRule -DisplayName "BlockRDP" | Get-NetFirewallAddressFilter ).RemoteAddress)
foreach ($ip in $list_IP) {
if ( $((($list_IP | where {$_ -eq $ip}).count) -gt $count_fail) -AND $(($current_ips | where {$_ -eq $ip}).count -eq 0)) {
(Get-Date).ToString() + " " + $ip + " IP заблокирован за " + $cnt_try + " попыток за $($interval/60000) мин.">> $log # запись события блокировки IP адреса в лог файл
$current_ips += $ip
}
}
$current_ips = $current_ips | gu
if ($current_ips.Length -gt 0) {
Set-NetFirewallRule -DisplayName "BlockRDP" -RemoteAddress $current_ips
}
Get-DnsClientServerAddress покажет список DNS серверов с их интерфейсом и метрикой (индексом). Как это ни странно, при выборе DNS сервера между несколькими сетевыми интерфейсами метрика играет не последнюю роль. Метрика устанавливается в автоматическом режиме по внутренней логике операционной системы и согласно ей интерфейс VPN имеет меньшие затраты нежели WiFi, а значит и предпочтительней.
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