|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой |
|
PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой
|
Новый участник Сообщения: 14 |
Всем доброе время.
Нашел в сети powershell скрипт и допилил его под себя. (для русской Windows Server) Он на windows Server (2016) читает лог успешных попыток входа и выводит их за определенное время. Выводит он что-то типа такого: TimeGenerated ClientIP Username LogType ------------- -------- -------- ------- 23.04.2020 10:45:33 - -\СИСТЕМА Service 23.04.2020 10:41:44 - -\СИСТЕМА Service 23.04.2020 10:41:44 - -\СИСТЕМА Service 23.04.2020 10:35:26 192.168.0.66 MAINS\acidс RDP 23.04.2020 10:35:26 192.168.0.66 MAINS\acidс RDP 23.04.2020 10:35:25 - -\DWM-16 Interactive - local logon Можно ли как-то куда-то перенаправить вывод, чтобы отфильтровать строки, содержащие "-\СИСТЕМА"? Чтобы остались только: 23.04.2020 10:35:26 192.168.0.66 MAINS\acidс RDP 23.04.2020 10:35:25 - -\DWM-16 Interactive - local logon Get-EventLog -LogName Security -after ((Get-date).AddMinutes(-200))| ?{(4624) -contains $_.EventID -and $_.Message -match ‘Тип входа:’}| %{ #rdp - 10, без него будет выводить все логины match 'Тип входа:\s+(10)\s' (new-object -Type PSObject -Property @{ TimeGenerated = $_.TimeGenerated ClientIP = $_.Message -replace '(?smi).*Сетевой адрес источника:\s+([^\s]+)\s+.*','$1' UserName =(([regex]'(?<=Новый вход:.*[\s\S]*.*записи:.\s)([\s\S]*)(?=\s\n.*Домен)').match($_.message).value) UserDomain = $_.Message -replace '(?smi).*Имя рабочей станции:\s+([^\s]+)\s+.*','$1' LogonType = $_.Message -replace '(?smi).*Тип входа:\s+([^\s]+)\s+.*','$1' }) } | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP ` , @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} ` , @{N='LogType';E={ switch ($_.LogonType) { 2 {'Interactive - local logon'} 3 {'Network conection to shared folder)'} 4 {'Batch'} 5 {'Service'} 7 {'Unlock (after screensaver)'} 8 {'NetworkCleartext'} 9 {'NewCredentials (local impersonation process under existing connection)'} 10 {'RDP'} 11 {'CachedInteractive'} default {"LogType Not Recognised: $($_.LogonType)"} } }} |
|
Отправлено: 11:13, 23-04-2020 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать rises, по поводу «Такого не может быть, потому что такого не может быть никогда» — оставлю на Вашей совести. Это… такое себе… Как показывает практика, то, что может произойти — рано или поздно, но происходит.
Цитата rises:
Цитата rises:
|
||
Отправлено: 12:20, 24-04-2020 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Я согласен, что можно сделать красиво, но лично для моих целей этого достаточно. Благодаря этому логу я наглядно вижу, что попытки анонимного доступа прекращены и бонусом к этому я имею себе лог файл времени и источника входа пользователей на сервер. Можно допилить и сделать качественный и правильный продукт, но тут уже вопрос цель/средство. Может быть кто-то допилит этот скрипт и сделает что-то более красивое и правильное. ;-)
|
Отправлено: 13:10, 24-04-2020 | #12 |
Deadooshka Сообщения: 2563
|
Профиль | Отправить PM | Цитировать все данные можно взять из массива строк ReplacementStrings, и желательно не лезть в Message c тяжёлыми регулярками.
|
Отправлено: 14:06, 24-04-2020 | #13 |
Deadooshka Сообщения: 2563
|
Профиль | Отправить PM | Цитировать структура ReplacementStrings привязана к eventid, поэтому идея такая
$eventid = 4624 $logontypes = @{ 2 = 'Interactive - local logon'; 3 = 'Network conection to shared folder)'; 4 = 'Batch'; 5 = 'Service'; 7 = 'Unlock (after screensaver)'; 8 = 'NetworkCleartext'; 9 = 'NewCredentials (local impersonation process under existing connection)'; 10 = 'RDP'; 11 = 'CachedInteractive' } get-eventlog -LogName Security -InstanceId $eventid -after (get-date).AddMinutes(-1000) | select TimeGenerated, ReplacementStrings | where {$arr = $_.ReplacementStrings; $arr[18] -ne '-'} | #IP foreach { $ip = $arr[18] $domain_name = $arr[5] + @('', ('\' + $arr[11]))[[bool]$arr[11]] $logontype = $arr[8] + ':' + $logontypes[[int]$arr[8]] $_.TimeGenerated, $ip, $domain_name, $logontype -join '; ' } |
Отправлено: 20:13, 24-04-2020 | #14 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Sham, крутецкая тема, спасибо, может кому еще сгодится. :-)
|
Отправлено: 16:34, 26-04-2020 | #15 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Вот такой код оставил, крутится нормально. Запускается шедулером через каждые пол часа.
Берет время изменения файла и от него выводит лог. $file = Get-Item 'C:\logs\logons\logon.txt' $eventid = 4624 $logontypes = @{ 2 = 'Interactive - local logon'; 3 = 'Network conection to shared folder)'; 4 = 'Batch'; 5 = 'Service'; 7 = 'Unlock (after screensaver)'; 8 = 'NetworkCleartext'; 9 = 'NewCredentials (local impersonation process under existing connection)'; 10 = 'RDP'; 11 = 'CachedInteractive' } get-eventlog -LogName Security -InstanceId $eventid -after ($file.LastWriteTime) | select TimeGenerated, ReplacementStrings | where {$arr = $_.ReplacementStrings; $arr[18] -ne '-'} | #IP foreach { $ip = $arr[18] $domain_name = $arr[5] + @('', ('\' + $arr[11]))[[bool]$arr[11]] $logontype = $arr[8] + ':' + $logontypes[[int]$arr[8]] $_.TimeGenerated, $ip, $domain_name, $logontype -join '; ' } >> C:\logs\logons\logon.txt |
Отправлено: 21:20, 26-04-2020 | #16 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Кстати заметил, что скрипт немного несвязно выводит даты, можно как-то вывод упорядочить по дате и времени?
Выводит как-то так: 07.05.2020 14:36:44; 192.168.0.249; АНОНИМНЫЙ ВХОД\JUL; 3:Network conection to shared folder) 07.05.2020 15:30:01; 192.168.0.249; АНОНИМНЫЙ ВХОД\JUL; 3:Network conection to shared folder) 07.05.2020 15:25:21; 192.168.0.249; АНОНИМНЫЙ ВХОД\JUL; 3:Network conection to shared folder) |
Отправлено: 22:24, 07-05-2020 | #17 |
Ветеран Сообщения: 1758
|
Цитата rises:
|
|
Отправлено: 00:03, 08-05-2020 | #18 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Foreigner, спасибо, вроде бы едет.
|
Отправлено: 14:05, 08-05-2020 | #19 |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать А можно как-то добавить сюда не только логин, но и дисконнект?
Если добавить событие $eventid = 4624,4779, то он пишет в лог IP адрес, но не пишет имени пользователя, можно это как-то подправить? Тогда лог будет более полноценным и на коннект и на дисконнект? Пишет на дисконнект так: 16.05.2020 19:30:00; 192.168.20.74; serg\FILESERVER; 10:RDP 16.05.2020 19:40:16; ; 192.168.20.74; : 16.05.2020 19:40:21; 192.168.20.74; serg\LAPTOP; 3:Network conection to shared folder |
Отправлено: 19:56, 16-05-2020 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [решено] Как вставить в тело сообщения вывод из данного скрипта - | LLC | Скриптовые языки администрирования Windows | 8 | 06-04-2015 08:36 | |
CMD/BAT - [решено] Вычитание символов из строки и вывод на экран | Instant_SR | Скриптовые языки администрирования Windows | 4 | 25-07-2013 11:37 | |
CMD/BAT - [решено] Копирование имени файла и определённой строки из него в другой файл | Liquid Ocelot | Скриптовые языки администрирования Windows | 10 | 05-07-2013 09:35 | |
CMD/BAT - [решено] вывод строки из *.xml | LAKERS824 | Скриптовые языки администрирования Windows | 26 | 08-07-2012 00:09 | |
Запуск PHP-скрипта из командной строки Windows | vadimiron | Вебмастеру | 4 | 01-12-2005 15:12 |
|