Write-EventLog -logname rdpuserfail -source powershell.exe -message "Сессия RDP завершена`nUSER: $usera `nIP: $ipa пользователь отключен." -eventid 1 #Заносим попытку входа не с разрешенного IP в журнал
$ObjUser = [ADSI]"WinNT://servername/$usera" #Кладем пользователя в ObjUser
$objUser.userflags = $objUser.userflags[0] -bor 2 #ставим галочку что пользователь отключен
$objUser.setinfo() #Записываем инфо в учетную запись
}
$eventuser = Get-EventLog -Logname security -message "*Тип входа:???10*" -Newest 1 #| ?{$_.eventid -eq 4624 } #получаем из журнала secyrity последнюю запись об успешном входе последнего пользователя rdp(тип входа 10)
if ($eventuser -ne $null) {
$message = $eventuser.message.substring($eventuser.message.indexof("Новый вход:"),($eventuser.message.indexof("Сведения о проверке подлинности:")-$eventuser.message.indexof("Новый вход:"))) #вырезаем из сообщения журнала только нужное от нового входа до сведений о проверке подлинности(в начале журнала дублируется имя пользователя неверное)
#IP
$StartstringIP = ($message.indexof("Сетевой адрес источника:"))+25 #находим позицию вхождения строки, добавляем длинну вхождения чтоб начать вырезать IP адрес а не начало строки
$endstringIP = ($message.indexof("Порт источника:"))-3 #в журнале следующая строка отделяется 3 переводами строки
$Ipstring = $message.substring($StartstringIP,$endstringIP-$StartstringIP) # режем только необходимое
#USER
$Startstringuser = ($message.indexof("Имя учетной записи:"))+21
$endstringuser = ($message.indexof("Домен учетной записи:"))-3
$userstring = $message.substring($Startstringuser,$endstringuser-$Startstringuser)
$localnet = "1.1.*"
$localnetvpn = "2.2.2.*"
function userfail
{
$queryResults = (qwinsta $args[0] | foreach { (($_.trim() -replace "\s+",","))} | ConvertFrom-Csv) #запрашиваем инфо о сессии rdp пользователя, переводим полученное в таблицу
logoff $queryResults.ID # Отключаем сеанс неугодных
$usera = $args[0] #Первый аргумент ФУНуции
$ipa = $args[1]
Write-EventLog -logname rdpuserfail -source powershell.exe -message "Сессия RDP завершена`nUSER: $usera `nIP: $ipa пользователь отключен." -eventid 1 #Заносим попытку входа не с разрешенного IP в журнал
$ObjUser = [ADSI]"WinNT://servername/$usera" #Кладем пользователя в ObjUser
$objUser.userflags = $objUser.userflags[0] -bor 2 #ставим галочку что пользователь отключен
$objUser.setinfo() #Записываем инфо в учетную запись
}
$eventuser = Get-EventLog -Logname security -message "*Тип входа:???10*" -Newest 1 #| ?{$_.eventid -eq 4624 } #получаем из журнала secyrity последнюю запись об успешном входе последнего пользователя rdp(тип входа 10)
if ($eventuser -ne $null) {
$message = $eventuser.message.substring($eventuser.message.indexof("Новый вход:"),($eventuser.message.indexof("Сведения о проверке подлинности:")-$eventuser.message.indexof("Новый вход:"))) #вырезаем из сообщения журнала только нужное от нового входа до сведений о проверке подлинности(в начале журнала дублируется имя пользователя неверное)
#IP
$StartstringIP = ($message.indexof("Сетевой адрес источника:"))+25 #находим позицию вхождения строки, добавляем длинну вхождения чтоб начать вырезать IP адрес а не начало строки
$endstringIP = ($message.indexof("Порт источника:"))-3 #в журнале следующая строка отделяется 3 переводами строки
$Ipstring = $message.substring($StartstringIP,$endstringIP-$StartstringIP) # режем только необходимое
#USER
$Startstringuser = ($message.indexof("Имя учетной записи:"))+21
$endstringuser = ($message.indexof("Домен учетной записи:"))-3
$userstring = $message.substring($Startstringuser,$endstringuser-$Startstringuser)
#Проверка разрешений для пользователей
switch ($userstring) {
#Локальная сеть
user1 {if ($Ipstring -notlike $localnet) {userfail $userstring $Ipstring}; break}
}
}
Работает на windows server 2008r2