none
Аудит удаления файлов и папок с записью событий в лог RRS feed

  • Общие обсуждения

  • День добрый,

    что то поиск мне не помог в решении вопроса поэтому вынужден написать тут. Скажу сразу в скриптах я практически 0.

    Задача получение Лог файла с удалением файлов и папок, перемещение данного лога на сервер в не домена.

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

    Стоит English версия OS вроде поправил с Русского имеющийся там текст.

    Код из статьи

    #Переменная $Time тут имеет такое же назначение как в предыдущем скрипте.
    
    $time =  (get-date) - (new-timespan -min 60)
    
    #$Events - содержит время и порядковый номер записи евента с ID=4660. И сортируем по порядковому номеру.
    #!!!!Это важное замечание!!! При удалении файла создается сразу 2 записи, с ID=4660 и ID=4663.
    $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'}}} 
        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 = "\\server\ServerLogFiles\DeletedFilesLog\"+$name
    
    
    $BodyL | out-file $Outfile -append

    Подскажите что поправить и что добавить что бы данный лог файл получить и скопировать в другое место.

    Заранее Большое Спасибо за Помощь.


    Если Вам как то помогли, будьте добры пометьте ответ. Другим будет удобней ориентироваться.

    • Изменен тип PuCtoy 8 апреля 2013 г. 5:02 Вопрос можно закрыть
    5 апреля 2013 г. 12:19

Все ответы

  • Измените путь $Outfile = "\\server\ServerLogFiles\DeletedFilesLog\"+$name на свой.

    5 апреля 2013 г. 12:44
    Отвечающий
  • Менял путь, менял Русские слова на английские типа Пользователь Запись ...

    Политика выполнения скриптов RemoteSign

    На всякий случай мой вариант

    #Переменная $Time тут имеет такое же назначение как в предыдущем скрипте.
    
    $time =  (get-date) - (new-timespan -min 5)
    
    #$Events - содержит время и порядковый номер записи евента с ID=4660. И сортируем по порядковому номеру.
    #!!!!Это важное замечание!!! При удалении файла создается сразу 2 записи, с ID=4660 и ID=4663.
    $Events = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4660;StartTime=$time} | Select TimeCreated,@{n="Record";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Record
    
    #Самые важные команды поиска. Опишу принцип ниже, после листинга скрипта.
    $BodyL = ""
    $TimeSpan = new-TimeSpan -sec 1
    foreach($event in $events){
        $PrevEvent = $Event.Record
        $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="File_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},@{n="User_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}} 
        if ($Body -match ".*Secret*"){
            $BodyL=$BodyL+$Body.TimeCreated+"`t"+$Body.File_+"`t"+$Body.User_+"`n"
        }
    }
    
    
    $Month = $Time.Month
    $Year = $Time.Year
    $name = "DeletedFiles-"+$Month+"-"+$Year+".txt"
    $Outfile = "C:\Users\administrator\Desktop\"+$name
    
    
    $BodyL | out-file $Outfile -append
    

    Вот ошибки

    Get-WinEvent : The parameter is incorrect
    At C:\Users\administrator\Desktop\Audit.ps1:7 char:23
    + $Events = Get-WinEvent <<<<  -FilterHashtable @{LogName="Security";ID=4660;StartTime=$time} | Select TimeCreated,@{n=
    "Record";e={([xml]$_.ToXml()).Event.System.EventRecordID}} |sort Record
        + CategoryInfo          : NotSpecified: (:) [Get-WinEvent], EventLogException
        + FullyQualifiedErrorId : System.Diagnostics.Eventing.Reader.EventLogException,Microsoft.PowerShell.Commands.GetWi
       nEventCommand
    
    The operation '[$null] - [System.TimeSpan]' is not defined.
    At C:\Users\administrator\Desktop\Audit.ps1:17 char:34
    +     $TimeEventStart = $TimeEvent- <<<<  (new-timespan -sec 1)
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NotAdefinedOperationForTypeType
    
    Get-WinEvent : A null value was encountered in the StartTime hash table key. Null values are not permitted.
    At C:\Users\administrator\Desktop\Audit.ps1:18 char:25
    +     $Body = Get-WinEvent <<<<  -FilterHashtable @{LogName="Security";ID=4663;StartTime=$TimeEventStart;EndTime=$TimeE
    ventEnd} |where {([xml]$_.ToXml()).Event.System.EventRecordID -match "$PrevEvent"}|where{ ([xml]$_.ToXml()).Event.Event
    Data.Data |where {$_.name -eq "ObjectName"}|where {($_.'#text') -notmatch ".*tmp"} |where {($_.'#text') -notmatch ".*~l
    ock*"}|where {($_.'#text') -notmatch ".*~$*"}} |select TimeCreated, @{n="File_";e={([xml]$_.ToXml()).Event.EventData.Da
    ta | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},@{n="User_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name
    -eq "SubjectUserName"} | %{$_.'#text'}}}
        + CategoryInfo          : InvalidArgument: (StartTime:String) [Get-WinEvent], Exception
        + FullyQualifiedErrorId : NullNotAllowedInHashtable,Microsoft.PowerShell.Commands.GetWinEventCommand


    Если Вам как то помогли, будьте добры пометьте ответ. Другим будет удобней ориентироваться.

    5 апреля 2013 г. 13:10
  • Версия ОС у Вас какая?

    5 апреля 2013 г. 14:41
    Отвечающий
  • На тестовой площадке 2008 х86, боевые х64, + есть 2003 боевых кучка разных... 

    Если Вам как то помогли, будьте добры пометьте ответ. Другим будет удобней ориентироваться.

    8 апреля 2013 г. 6:59
  • На тестовой площадке 2008 х86, боевые х64, + есть 2003 боевых кучка разных... 

    Если Вам как то помогли, будьте добры пометьте ответ. Другим будет удобней ориентироваться.


    -FilterHashtable - Параметр не работает с Windows Server 2008 без R2,на 2003 - Get-WinEvent не работает.
    8 апреля 2013 г. 7:02
    Отвечающий
  • Под каждую ОС надо выправлять получается... хм зачем так наваяли...

    Спасибо!

    Может посоветуете что то из ПО?


    Если Вам как то помогли, будьте добры пометьте ответ. Другим будет удобней ориентироваться.

    • Изменено PuCtoy 8 апреля 2013 г. 7:19
    8 апреля 2013 г. 7:17