|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой |
|
PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой
|
Новый участник Сообщения: 14 |
Профиль | Отправить PM | Цитировать Всем доброе время.
Нашел в сети 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 |
Deadooshka Сообщения: 2482
|
Профиль | Отправить PM | Цитировать |
Последний раз редактировалось Sham, 23-04-2020 в 13:01. Причина: "система" же ещё Отправлено: 12:26, 23-04-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Эта комманда удаляет все, где есть -.
Удаляет и такие строки: 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! |
Последний раз редактировалось rises, 23-04-2020 в 13:39. Отправлено: 13:29, 23-04-2020 | #3 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Подскажите еще pls, можно как-то в выводе этом не выводить первые строчки?
Выводить данные, но не выводить их описание? TimeGenerated ClientIP Username LogType ------------- -------- -------- ------- |
Отправлено: 16:02, 23-04-2020 | #4 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Наковырял такой способ:
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" Только кавычки теперь глаза мозолят, можно как-то кавычки все убрать? |
|
Отправлено: 17:11, 23-04-2020 | #5 |
Deadooshka Сообщения: 2482
|
Профиль | Отправить PM | Цитировать Format-Table -HideTableHeaders можно
|
Отправлено: 17:27, 23-04-2020 | #6 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Ура! Получилось то, что нужно может кому пригодится.
На Windows Server запускается этот скрипт каждый час и пишет в лог за последний час успешные входы в систему, с какого IP кто именно, какой тип соединения. Соотвественно имеем лог входов в систему. Get-EventLog -LogName Security -after ((Get-date).AddMinutes(-60))| ?{(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' }) } | where ClientIP -ne '-' | 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)"} } }} | ConvertTo-Csv -NoType | Select-Object -Skip 1 | % {$_ -replace '"',''} >> C:\logs\logons\logon.txt Цитата Sham:
|
|
Отправлено: 17:35, 23-04-2020 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата rises:
|
|
Отправлено: 19:43, 23-04-2020 | #8 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Посмотрел логи - ни одной дублирующей записи пока не нашел, понаблюдаю дальше. В принципе правильнее было бы может быть отслеживать время записи последнего события в логе и стартовать от него, нужно хранить это время в файлике и перед стартом скрипта указывать это время как стартовое. Или читать последнюю строчку лог файла и брать из нее время. Есть ли такая функция как в 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 по времени изменения файла. Берем это время и старт от него, будет точнее. |
|
Отправлено: 07:41, 24-04-2020 | #9 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Что-то типа такого(файл должен существовать, если это первый запуск, можно создать пустой, лом добавлять это):
$file = Get-Item 'C:\logs\logons\logon.txt' Get-EventLog -LogName Security -after $file.LastWriteTime | ?{(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' }) } | where ClientIP -ne '-' | 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)"} } }} | ConvertTo-Csv -NoType | Select-Object -Skip 1 | % {$_ -replace '"',''} >> C:\logs\logons\logon.txt #}} | Format-Table -HideTableHeaders >> C:\logs\logons\logon.txt |
Последний раз редактировалось rises, 24-04-2020 в 08:18. Отправлено: 08:08, 24-04-2020 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|