11.06.2013

PowerShell. Заметки.

Начал использовать PowerShell. Инструмент очень мощный. По мощности сравним с шеллом никсов. Не буду утверждать что круче - не разбираюсь ни в том, ни в другом. Решил сделать в качестве памятки несколько заметок по использованию этого инструмента.

1. Заметка номер раз. Простейшие регулярные выражения в PS.

^ - начало строки
$ - конец строки
. - один любой символ

Удалить подстроку или заменить её - -replace . Простейший способ редактирования строк без вникания в код и написания "нормальных" регэкспов - тупо удалить нужное кол-во символов.

 (Get-Content .\list.txt)  -replace "^...................................." | Set-Content list1.txt

Получили содержание файла, прошли по строкам, в каждой строке удалили какое-то количество первых символов, записали в файл.

2. Получить список файлов, открывавшихся определенным пользователем в определенную дату.

Get-EventLog security -after (Get-Date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 560} | ?{$_.username -eq "username"}

Здесь мы получаем события журнала безопасности за текущую дату с 0 часов, 0 минут, 0 секунд с eventid равным 560 (аудит успеха. открытие объекта. Эта информация здесь: Описание событий системы безопасности) и именем пользователя username.
Но для того, чтобы эта команда сработала, необходимо чтобы велся аудит доступа к файловой системе. Об этом можно почитать тут. Позже сам напишу подобный мануал.

Дальше больше



3. Теперь скрипт по мотивам предыдущей заметки. Назначение: получить список пользователей, пытавшихся открыть файлы на ФС. Получаем время доступа, имя файла и имя пользователя.


$Events = Get-EventLog security | ?{$_.eventid -eq 560}
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty File ($null)

$Events | %{

$Data.time = $_.TimeGenerated

$message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()}

$Data.UserName = ($message | ?{$_ -like "Пользователь-клиент:*"} | %{$_ -replace "^.+:."} ) 
$Data.File = ($message | ?{$_ -like "Имя объекта:*"} | %{$_ -replace "^.+:."}) 


$data | Out-File F:\Docs\fs1.txt -Append


Разберем по строкам.

Первая строка получает события типа "безопасность" с кодом 560 (Get-Eventlog - получить данные журнала событий, security - данные журнала "безопасность", где свойство eventid каждого (|) события ($_) эквивалентно (-eq) 560).

Вторая строка создает объект PSObject. 3-5 строки добавляют в объект поля Time, UserName и File.

Затем пробегаемся по событиям следующим способом.
В поле time объекта Data записываем время создания строки с сообщением (время доступа к файлу).

 Строкой $message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()} — в переменную message заносим массив строк, которые разделяются символом переноса строки ('n), функции trimstart(), trimend() убирают все лишние символы в конце и в начале строки, функция split разделяет строку.

Далее во вновь образовавшемся массиве мы ищем совпадения по строке «Пользователь-клиент:» и «Имя объекта:», а -replace в дальнейшем удаляет эти регулярные выражения, оставляя саму информацию.

 И последней строкой записываем то, что получилось в итоге в файл.
 Получается что-то типа этого:
Time                                    UserName                                File                                   
----                                    --------                                ----                                   
13.06.2013 16:52:22                     Seti                                    Docs\Сети\Общая папка\Реестры счет



Time                                    UserName                                File                                   
----                                    --------                                ----                                   
13.06.2013 16:52:22                     Seti                                    Docs\Сети\Общая папка\Реестры счет

Скрипт создан при помощи этих постов: хабр, Поданс.

Комментариев нет:

Отправить комментарий