Возникли проблемы с анализом журнала событий (ID 4725) и выводом целевого поля имени пользователя с помощью Powershell.

По сути, я пытаюсь написать некоторый код, который будет запускаться из запланированной задачи каждый раз, когда запускается событие с идентификатором 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"}

Ожидаемые результаты: возьмите имя пользователя из поля целевого имени пользователя в журнале событий безопасности с идентификатором 4725, выведите его в переменную «#UserName», а затем введите его в API-интерфейс остальных методов.

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


person Reed S    schedule 29.01.2019    source источник
comment
$UserName Get-EventLog -- Я не вижу здесь =.   -  person Roger Lipscombe    schedule 29.01.2019
comment
ПОЖАЛУЙСТА, исправьте форматирование кода... он почти нечитаем. ››› Как форматировать сообщения с помощью Markdown или HTML? - Справочный центр - Переполнение стека — stackoverflow.com/help/formatting   -  person Lee_Dailey    schedule 29.01.2019
comment
Казалось бы, при переформатировании этого поста (спасибо Lotpings за исправление!) остался один момент. Теперь это исправлено.   -  person Reed S    schedule 29.01.2019
comment
Так теперь работает? Он не должен работать на основе этого канала для $username   -  person ArcSet    schedule 29.01.2019
comment
Нет, исходная проблема все еще возникает.   -  person Reed S    schedule 29.01.2019


Ответы (1)


ОК. Давайте посмотрим на этот шаблон события 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, Get-EventLog возвращает тип System.Diagnostics.EventLogEntry.

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

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

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

Ниже приведена функция, которую я написал, которая будет анализировать поле сообщения и создавать новый psobject со свойством 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
person ArcSet    schedule 29.01.2019