Проблемы с анализом журнала событий (ID 4725) и выводом целевого поля имени пользователя с помощью Powershell - PullRequest
0 голосов
/ 29 января 2019

Обычно я пытаюсь написать код, который будет запускаться из запланированной задачи каждый раз, когда запускается событие с кодом 4725.Это конкретное событие указывает, что у определенного пользователя отключена учетная запись AD (Windows Server 2016).

Что мне нужно сделать, это взять имя пользователя из этого идентификатора события и вывести его как переменную #UserName для использования в URI restmethod.

# Variables
$params = @{"action"="move";"destination"="/Shared/IT/Archived User Data/"}
$json = $params|ConvertTo-Json
$eventRecordId = 4725
$eventChannel = "Security"

# Gets the latest "disabled user account" event log and outputs the disabled user's name to a variable called $UserName


Get-EventLog –Log Security -InstanceId 4725 -Newest 1 | $UserName = ?{Group-Object -Property "TargetUserName"}

Echo $UserName 

# Calls the Egnyte API to move the disabled user's home folder to the archive folder
Invoke-RestMethod `
    -Method Post `
    -body $json `
    -Uri 'https://xxxxxx.egnyte.com/pubapi/v1/fs/private/"$UserName"' `
    -Headers @{Authorization = "Bearer xxxxxxxxxxxxxxxxxxxxxxx"
               Contenttype = "application/json"}

Ожидаемые результаты: взять имя пользователяиз поля target-username в ID 4725 журнала событий безопасности выведите его в переменную "#UserName", а затем введите его в API метода отдыха.

Фактические результаты: переменная не создается.

1 Ответ

0 голосов
/ 29 января 2019

ОК. Давайте посмотрим на этот шаблон события 4725

(Get-WinEvent -ListProvider * -ErrorAction Ignore).Events |
        Where-Object {$_.Id -eq 4725} |
        select * | 
        Format-List

Мы можем видеть, что существует TargetUserName

<data name="TargetUserName" inType="win:UnicodeString" outType="xs:string"/>

Итак, давайте разберем это Сообщение в XML, Получить-EventLog возвращает тип System.Diagnostics.EventLogEntry

Итак, сначала нам нужно изменить этот объект на System.Diagnostics.Eventing.Reader.EventLogRecord таким образом, мы можем преобразовать в XML

Мы можем сделать эфир Создайте новый вызов, используя Get-WinEvent , который вернет тип System.Diagnostics.Eventing.Reader.EventLogRecord , который имеет метод для преобразования данных в XML

Или мы можем получить индекс из текущей записи и вызвать Get-WinEvent, ищущий EventRecordID.

Ниже приведена функцияя написал, что проанализирую поле сообщения и создам новый псобъект со свойством ParsedMessage

function Parse-WindowsEvents(){
    param(
        [Parameter(Position=1, ValueFromPipeline)]
        #[System.Diagnostics.Eventing.Reader.EventRecord[]]$Events
        [object[]]$Events
    )
    process{
        $ArrayList = New-Object System.Collections.ArrayList
        $Events  | %{
            $EventObj = $_
            $EventObjFullName = $_.GetType().FullName
            if($EventObjFullName -like "System.Diagnostics.EventLogEntry"){   
                $EventObj = Get-WinEvent -LogName security -FilterXPath "*[System[EventRecordID=$($_.get_Index())]]"
            }elseif($EventObjFullName -like "System.Diagnostics.Eventing.Reader.EventLogRecord"){

            }else{
                throw "Not An Event System.Diagnostics.Eventing.Reader.EventLogRecord or System.Diagnostics.EventLogEntry"
            }
            $PsObject =  New-Object psobject
            $EventObj.psobject.properties | %{
                $PsObject | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_.Value
            }
            $XML = [xml]$EventObj.toXml()
            $PsObject2 = New-Object psobject
            $XML.Event.EventData.Data | %{
                $PsObject2 | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_."#text"
            }
            $PsObject | Add-Member -MemberType NoteProperty -Name ParsedMessage -Value $PsObject2
            $ArrayList.add($PsObject) | out-null
        }
        return $ArrayList
    }
}

$Username = Get-EventLog –Log Security -InstanceId 4725 -Newest 1 | Parse-WindowsEvents | select -ExpandProperty ParsedMessage | select TargetUserName
$Username.TargetUserName
#or
$Username = (Get-EventLog –Log Security -InstanceId 4725 -Newest 1 | Parse-WindowsEvents | select -ExpandProperty ParsedMessage).TargetUserName
$Username
...