![]() |
Как отфильтровать вывод скрипта, удалив из него строки с подстрокой
Всем доброе время.
Нашел в сети 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 ‘Тип входа:’}| %{ |
перед sort
Код:
where {$_.UserDomain -ne '-' -and $_.UserName.tolower() -ne 'система'} | |
Эта комманда удаляет все, где есть -.
Удаляет и такие строки: 23.04.2020 11:48:34 202.137.7.58 -\АНОНИМНЫЙ ВХОД Network conection to shared folder 23.04.2020 10:35:25 - -\DWM-16 Interactive - local logon Ура! Я понял принцип... Вот так работает! where UserName -ne 'СИСТЕМА' Thanks! |
Подскажите еще pls, можно как-то в выводе этом не выводить первые строчки?
Выводить данные, но не выводить их описание? TimeGenerated ClientIP Username LogType ------------- -------- -------- ------- |
Наковырял такой способ:
ConvertTo-Csv -NoType | Select-Object -Skip 1 Получаем что-то типа: "23.04.2020 16:56:54","202.166.174.27","-\АНОНИМНЫЙ ВХОД","Network conection to shared folder" "23.04.2020 16:56:54","202.166.174.27","-\АНОНИМНЫЙ ВХОД","Network conection to shared folder" Только кавычки теперь глаза мозолят, можно как-то кавычки все убрать? :) |
Format-Table -HideTableHeaders можно
|
Ура! Получилось то, что нужно может кому пригодится.
На Windows Server запускается этот скрипт каждый час и пишет в лог за последний час успешные входы в систему, с какого IP кто именно, какой тип соединения. Соотвественно имеем лог входов в систему. Код:
Get-EventLog -LogName Security -after ((Get-date).AddMinutes(-60))| ?{(4624) -contains $_.EventID -and $_.Message -match ‘Тип входа:’}| %{ Цитата:
|
Цитата:
|
Цитата:
Посмотрел логи - ни одной дублирующей записи пока не нашел, понаблюдаю дальше. В принципе правильнее было бы может быть отслеживать время записи последнего события в логе и стартовать от него, нужно хранить это время в файлике и перед стартом скрипта указывать это время как стартовое. Или читать последнюю строчку лог файла и брать из нее время. Есть ли такая функция как в unix подобных системах? Чтобы не затрачивать время на чтение всего файла, скажем который вырастет до 50Мб, и добавит время работы скрипта? Вот такой строчкой скажем сейчас заканчивается файл. 24.04.2020 4:15:10,201.216.208.137,-\АНОНИМНЫЙ ВХОД,Network conection to shared folder Кстати сделано это все для отслеживания левых подключений, пытаюсь понять, что это за левые Анонимные входы с левых IP. Хотя придумал простой способ, нужно брать время последнего изменения файла и стартовать от него. Скрипт запустился в 5:00 Закончил работу в 24 апреля 2020 г., 5:00:23 по времени изменения файла. Берем это время и старт от него, будет точнее. |
Что-то типа такого(файл должен существовать, если это первый запуск, можно создать пустой, лом добавлять это):
Код:
$file = Get-Item 'C:\logs\logons\logon.txt' |
rises, по поводу «Такого не может быть, потому что такого не может быть никогда» — оставлю на Вашей совести. Это… такое себе… Как показывает практика, то, что может произойти — рано или поздно, но происходит.
Цитата:
Цитата:
|
Я согласен, что можно сделать красиво, но лично для моих целей этого достаточно. Благодаря этому логу я наглядно вижу, что попытки анонимного доступа прекращены и бонусом к этому я имею себе лог файл времени и источника входа пользователей на сервер. Можно допилить и сделать качественный и правильный продукт, но тут уже вопрос цель/средство. Может быть кто-то допилит этот скрипт и сделает что-то более красивое и правильное. ;-)
|
все данные можно взять из массива строк ReplacementStrings, и желательно не лезть в Message c тяжёлыми регулярками.
|
структура ReplacementStrings привязана к eventid, поэтому идея такая
Код:
$eventid = 4624 |
Sham, крутецкая тема, спасибо, может кому еще сгодится. :-)
|
Вот такой код оставил, крутится нормально. Запускается шедулером через каждые пол часа.
Берет время изменения файла и от него выводит лог. Код:
$file = Get-Item 'C:\logs\logons\logon.txt' |
Кстати заметил, что скрипт немного несвязно выводит даты, можно как-то вывод упорядочить по дате и времени?
Выводит как-то так: 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) |
Цитата:
Код:
....| |
Foreigner, спасибо, вроде бы едет.
|
А можно как-то добавить сюда не только логин, но и дисконнект?
Если добавить событие $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 |
overrise,
Цитата:
|
В самом событии дисконнекта, если на него посмотреть, есть и имя и пк с которого вышел пользователь и его IP.
Если в журнале Windows отфильтровать событие 4779(Данное событие возникает, когда пользователь отключается от существующего сеанса служб терминалов либо переключается с существующего рабочего стола с помощью быстрого переключения пользователей.), я вижу: AccountName serg AccountDomain FILESERVER LogonID 0xe44811e SessionName RDP-Tcp#58 ClientName LAPTOP ClientAddress 192.168.20.74 Может быть дело в парсинге данных? |
Цитата:
|
Странно, при дисконнекте по RDP выскакивать должно это событие по любому. Законнектиться, закрыть соединение и оно появляется.
Вот XML события: Код:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> |
Ну а так, что-нибудь показывает?
Код:
|
Вот такое выдает, по ходу там имя пользователя в другой переменной хранится при дисконнекте, если я правильно понимаю:
InstanceID EventID MachineName UserName TimeGenerated ---------- ------- ----------- -------- ------------- 4624 4624 fileserver serg 18.05.2020 8:15:03 4624 4624 fileserver serg 18.05.2020 8:15:03 4624 4624 fileserver DWM-7 18.05.2020 8:15:03 4624 4624 fileserver DWM-7 18.05.2020 8:15:03 4779 4779 fileserver 192.168.20.74 18.05.2020 8:15:51 4624 4624 fileserver serg 18.05.2020 8:16:02 4624 4624 fileserver serg 18.05.2020 8:16:03 4624 4624 fileserver serg 18.05.2020 8:16:03 4624 4624 fileserver DWM-7 18.05.2020 8:16:03 4624 4624 fileserver DWM-7 18.05.2020 8:16:03 |
Если я беру событие 4779 и вывожу echo $_.ReplacementStrings, то получаю вот такие ответы:
serg FILESERVER 0xe44811e RDP-Tcp#77 LAPTOP 192.168.20.74 serg FILESERVER 0xe44811e RDP-Tcp#78 LAPTOP 192.168.20.74 |
Цитата:
Код:
$report = |
При этом 4624:
Код:
S-1-0-0 Цитата:
А вот что выдает новый скрипт: InstanceID EventID MachineName UserName TimeGenerated ---------- ------- ----------- -------- ------------- 4624 4624 fileserver S-1-5-18 18.05.2020 8:45:01 4624 4624 fileserver S-1-5-18 18.05.2020 8:45:01 4624 4624 fileserver S-1-5-18 18.05.2020 8:50:00 4624 4624 fileserver S-1-5-18 18.05.2020 8:55:00 4779 4779 fileserver serg 18.05.2020 8:56:27 4624 4624 fileserver S-1-0-0 18.05.2020 8:56:33 4624 4624 fileserver S-1-5-18 18.05.2020 8:56:34 4624 4624 fileserver S-1-5-18 18.05.2020 8:56:34 4624 4624 fileserver S-1-5-18 18.05.2020 8:56:34 4624 4624 fileserver S-1-5-18 18.05.2020 8:56:34 Походу да, Microsoft решила сделать для каждого события свой набор переменных. |
Забыл точку после $_
Код:
if ($_.InstanceID |
Я победил эту тему немного тупо, но зато результат правильный, скрипт супер :)
Выводит так: 18.05.2020 8:56:27; 46.219.124.185; serg\LAPTOP; DISCONNECT 18.05.2020 8:56:33; 46.219.124.185; serg\LAPTOP; 3:Network conection to shared folder) 18.05.2020 8:56:34; 46.219.124.185; serg\FILESERVER; 10:RDP Код:
$eventid = 4624,4779 Цитата:
InstanceID EventID MachineName UserName TimeGenerated ---------- ------- ----------- -------- ------------- 4624 4624 fileserver serg 18.05.2020 9:30:00 4624 4624 fileserver serg 18.05.2020 9:30:01 4624 4624 fileserver serg 18.05.2020 9:30:01 4624 4624 fileserver serg 18.05.2020 9:30:01 4779 4779 fileserver serg 18.05.2020 9:33:14 4624 4624 fileserver serg 18.05.2020 9:33:18 4624 4624 fileserver serg 18.05.2020 9:33:19 4624 4624 fileserver serg 18.05.2020 9:33:19 4624 4624 fileserver DWM-7 18.05.2020 9:33:19 4624 4624 fileserver DWM-7 18.05.2020 9:33:19 |
Цитата:
Цитата:
script.ps1
Код:
#requires -v 5.0 - может пригодится... |
Время: 21:39. |
Время: 21:39.
© OSzone.net 2001-