Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой

Ответить
Настройки темы
PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить 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

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


rises, по поводу «Такого не может быть, потому что такого не может быть никогда» — оставлю на Вашей совести. Это… такое себе… Как показывает практика, то, что может произойти — рано или поздно, но происходит.

Цитата rises:
нужно хранить это время в файлике »
Или в реестре. Но лучше вообще поменять парадигму (см. ниже).

Цитата rises:
Или читать последнюю строчку лог файла и брать из нее время.
Есть ли такая функция как в unix подобных системах? Чтобы не затрачивать время на чтение всего файла, скажем который вырастет до 50Мб, и добавит время работы скрипта? »
Писать лучше всего не в текстовый файл, а в базу данных, пусть даже в mdb. Поскольку содержимым базы данных легко манипулировать — и запросы произвольные к ней составлять, и время последней записи получать и прочая, и прочая…

Отправлено: 12:20, 24-04-2020 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Я согласен, что можно сделать красиво, но лично для моих целей этого достаточно. Благодаря этому логу я наглядно вижу, что попытки анонимного доступа прекращены и бонусом к этому я имею себе лог файл времени и источника входа пользователей на сервер. Можно допилить и сделать качественный и правильный продукт, но тут уже вопрос цель/средство. Может быть кто-то допилит этот скрипт и сделает что-то более красивое и правильное. ;-)

Отправлено: 13:10, 24-04-2020 | #12


Deadooshka


Сообщения: 2563
Благодарности: 697

Профиль | Отправить PM | Цитировать


все данные можно взять из массива строк ReplacementStrings, и желательно не лезть в Message c тяжёлыми регулярками.

Отправлено: 14:06, 24-04-2020 | #13


Deadooshka


Сообщения: 2563
Благодарности: 697

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Sham, крутецкая тема, спасибо, может кому еще сгодится. :-)

Отправлено: 16:34, 26-04-2020 | #15


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить 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
Благодарности: 966

Профиль | Цитировать


Цитата rises:
можно как-то вывод упорядочить по дате и времени? »
Код: Выделить весь код
....|
select TimeGenerated, ReplacementStrings | sort TimeGenerated |
where....
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:03, 08-05-2020 | #18


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Foreigner, спасибо, вроде бы едет.

Отправлено: 14:05, 08-05-2020 | #19


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Как отфильтровать вывод скрипта, удалив из него строки с подстрокой

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход