none
Запись событий 4659,4663,4660 в лог файл RRS feed

  • Вопрос

  • Добрый день Камрады!

    Помогите решить вопрос с записью событий в файл.

    Задача следующая  события с номерами 4659,4663,4660 записывать в файл.

    Читал статьи на technet   и конечно же https://habrahabr.ru/post/150149/

    Не помогло мне продвинуться в перёд.

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

    #Переменная $Time тут имеет такое же назначение как в предыдущем скрипте.
    
    $time =  (get-date) - (new-timespan -min 60)
    
    #$Events - содержит время и порядковый номер записи евента с ID=4660. И сортируем по порядковому номеру.
    #!!!!Это важное замечание!!! При удалении файла создается сразу 2 записи, с ID=4660 и ID=4663.
    $Events = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4663;StartTime=$time} | Select TimeCreated,@{n="Запись";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Запись
    
    #Самые важные команды поиска. Опишу принцип ниже, после листинга скрипта.
    $BodyL = ""
    $TimeSpan = new-TimeSpan -sec 1
    foreach($event in $events){
        $PrevEvent = $Event.Запись
        $PrevEvent = $PrevEvent - 1
        $TimeEvent = $Event.TimeCreated
        $TimeEventEnd = $TimeEvent+$TimeSpan
        $TimeEventStart = $TimeEvent- (new-timespan -sec 1)
        $Body = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4663;StartTime=$TimeEventStart;EndTime=$TimeEventEnd} |where {([xml]$_.ToXml()).Event.System.EventRecordID -match "$PrevEvent"}|where{ ([xml]$_.ToXml()).Event.EventData.Data |where {$_.name -eq "ObjectName"}|where {($_.'#text') -notmatch ".*tmp"} |where {($_.'#text') -notmatch ".*~lock*"}|where {($_.'#text') -notmatch ".*~$*"}} |select TimeCreated, @{n="Файл_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},@{n="Пользователь_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}}
        if ($Body -match ".*Secret*"){
            $BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
        }
    }
    
    
    $Month = $Time.Month
    $Year = $Time.Year
    $name = "DeletedFiles-"+$Month+"-"+$Year+".txt"
    $Outfile = "\\ServerName\Event_Logs\"+$name
    
    
    $BodyL | out-file $Outfile -append



    20 октября 2017 г. 9:20

Ответы

Все ответы

  • Проверьте что находится в переменных $Events и $BodyL.

    Сервер у вас русскоязычный или англоязычный? Версия и редакция сервера какая?

    P.S. Оформляйте пожалуйста скрипты в код блоки, их так намного проще читать


    The opinion expressed by me is not an official position of Microsoft

    20 октября 2017 г. 9:37
    Модератор
  • Проверьте что находится в переменных $Events и $BodyL.

    Сервер у вас русскоязычный или англоязычный? Версия и редакция сервера какая?

    P.S. Оформляйте пожалуйста скрипты в код блоки, их так намного проще читать


    The opinion expressed by me is not an official position of Microsoft

    Windows 2012R2  англоязычная

    20 октября 2017 г. 9:43
  • В переменных вот здесь ?

    $BodyL = ""

    Честно сказать я не знаю что там должно быть

    • Изменено Vaiss 20 октября 2017 г. 9:45
    20 октября 2017 г. 9:44
  • У вас, как и у авторма, тоже папка Secret?

    if ($Body -match ".*Secret*"){
            $BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
        }

    20 октября 2017 г. 9:59
    Отвечающий
  • Вы открываете мне глаза :)

    Нет такой папки, я хочу собирать сведения о событиях с любой папки на сервере.

    Сам Аудит у меня на строен и Event ID 4660,4663,4659 в логах присутствуют.

    20 октября 2017 г. 10:05
  • if ($Body -match ".*Secret*"){
            $BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
        }

    Оставить:

     $BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
    

    20 октября 2017 г. 10:07
    Отвечающий
  • Как я понял здесь:  if ($Body -match ".*Secret*")

    В место secret  нужно указать какое то значение говорящее любую папку?

    20 октября 2017 г. 10:08
  • Как я понял здесь:  if ($Body -match ".*Secret*")

    В место secret  нужно указать какое то значение говорящее любую папку?


    Вам выше дали ответ: достаточно просто убрать If... и скобку которая к нему относится

    The opinion expressed by me is not an official position of Microsoft

    20 октября 2017 г. 10:13
    Модератор
  • Как я понял здесь:  if ($Body -match ".*Secret*")

    В место secret  нужно указать какое то значение говорящее любую папку?


    Вам выше дали ответ: достаточно просто убрать If... и скобку которая к нему относится

    The opinion expressed by me is not an official position of Microsoft

    Так и сделал но лог так же пустой вот отрезок кода :

    foreach($event in $events){
        $PrevEvent = $Event.Запись
        $PrevEvent = $PrevEvent - 1
        $TimeEvent = $Event.TimeCreated
        $TimeEventEnd = $TimeEvent+$TimeSpan
        $TimeEventStart = $TimeEvent- (new-timespan -sec 1)
        $Body = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4663;StartTime=$TimeEventStart;EndTime=$TimeEventEnd} |where {([xml]$_.ToXml()).Event.System.EventRecordID -match "$PrevEvent"}|where{ ([xml]$_.ToXml()).Event.EventData.Data
     |where {$_.name -eq "ObjectName"}|where {($_.'#text') -notmatch ".*tmp"} |where {($_.'#text') -notmatch ".*~lock*"}|where {($_.'#text') -notmatch ".*~$*"}} |select TimeCreated, @{n="Файл_";e={([xml]$_.ToXml()).Event.EventData.Data
     | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},@{n="Пользователь_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}}
    
         $BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
        
    }
    
    
    $Month = $Time.Month
    $Year = $Time.Year
    $name = "DeletedFiles-"+$Month+"-"+$Year+".txt"
    $Outfile = "\\ServerName\Event_Logs\"+$name




    • Изменено Vaiss 20 октября 2017 г. 10:34 ошибка
    20 октября 2017 г. 10:30
  • Вставить в коносль и привести сюда вывод:

    $time =  (get-date) - (new-timespan -min 60)
    $Events = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4660;StartTime=$time} | Select TimeCreated,@{n="Запись";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Запись
    $Events

    20 октября 2017 г. 10:39
    Отвечающий
  • PS C:\Windows\system32> $time =  (get-date) - (new-timespan -min 60)
    $Events = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4660;StartTime=$time} | Select TimeCreated,@{n="Запись";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Запись
    $Events
    
    TimeCreated                                                                                     Запись                                                                                        
    -----------                                                                                     ------                                                                                        
    10/20/2017 4:42:53 PM                                                                           3146270   


    20 октября 2017 г. 10:48
  • Теперь вывод:

    $time =  (get-date) - (new-timespan -min 60)
    $Events = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4660;StartTime=$time} | Select TimeCreated,@{n="Запись";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Запись
    
    $BodyL = ""
    $TimeSpan = new-TimeSpan -sec 1
    foreach($event in $events){
    	$PrevEvent = $Event.Запись
    	$PrevEvent = $PrevEvent - 1
    	$TimeEvent = $Event.TimeCreated
    	$TimeEventEnd = $TimeEvent+$TimeSpan
    	$TimeEventStart = $TimeEvent - (new-timespan -sec 1)
    	$Body = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4663;StartTime=$TimeEventStart;EndTime=$TimeEventEnd} |where {([xml]$_.ToXml()).Event.System.EventRecordID -match "$PrevEvent"}|where{ ([xml]$_.ToXml()).Event.EventData.Data |where {$_.name -eq "ObjectName"}|where {($_.'#text') -notmatch ".*tmp"} |where {($_.'#text') -notmatch ".*~lock*"}|where {($_.'#text') -notmatch ".*~$*"}} |select TimeCreated, @{n="Файл_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},@{n="Пользователь_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}} 
    	$BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
    }
    
    $BodyL

    20 октября 2017 г. 10:51
    Отвечающий
  • PS C:\Windows\system32> $time =  (get-date) - (new-timespan -min 60)
    $Events = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4660;StartTime=$time} | Select TimeCreated,@{n="Запись";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Запись
    
    $BodyL = ""
    $TimeSpan = new-TimeSpan -sec 1
    foreach($event in $events){
    	$PrevEvent = $Event.Запись
    	$PrevEvent = $PrevEvent - 1
    	$TimeEvent = $Event.TimeCreated
    	$TimeEventEnd = $TimeEvent+$TimeSpan
    	$TimeEventStart = $TimeEvent - (new-timespan -sec 1)
    	$Body = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4663;StartTime=$TimeEventStart;EndTime=$TimeEventEnd} |where {([xml]$_.ToXml()).Event.System.EventRecordID -match "$PrevEvent"}|where{ ([xml]$_.ToXml()).Event.EventData.Data |where {$_.name -eq "ObjectName"}|where {($_.'#text') -notmatch ".*tmp"} |where {($_.'#text') -notmatch ".*~lock*"}|where {($_.'#text') -notmatch ".*~$*"}} |select TimeCreated, @{n="Файл_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},@{n="Пользователь_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}} 
    	$BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.Файл_+"`t"+$Body.Пользователь_+"`n"
    }
    
    $BodyL
    10/20/2017 16:42:53	E:\База данных \666665526522	V.Pupkin

    20 октября 2017 г. 10:58
  • Отрабатывает, как нужно.
    • Помечено в качестве ответа Vaiss 20 октября 2017 г. 12:35
    20 октября 2017 г. 11:00
    Отвечающий