Trabalhando com logs de eventos no Powershell

3

Eu tenho tentado analisar registros do log de Segurança do Windows e ter um pouco de dificuldade para obter valores específicos de alguns dos eventos de logon / logoff. Vamos dar uma olhada em um exemplo específico - aqui está o XML de uma das entradas de log.

<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
    <System>
        <Provider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-a5ba-3e3b0328c30d}'/>
        <EventID>4634</EventID>
        <Version>0</Version>
        <Level>0</Level>
        <Task>12545</Task>
        <Opcode>0</Opcode>
        <Keywords>0x8020000000000000</Keywords>
        <TimeCreated SystemTime='2011-08-16T17:15:38.702857400Z'/>
        <EventRecordID>107947</EventRecordID>
        <Correlation/>
        <Execution ProcessID='680' ThreadID='972'/>
        <Channel>Security</Channel>
        <Computer>SRV1.DOMAIN.LOCAL</Computer><Security/>
    </System>
    <EventData>
        <Data Name='TargetUserSid'>S-1-5-21-963414502-3093649508-813756320-3274</Data>
        <Data Name='TargetUserName'>billgates</Data>
        <Data Name='TargetDomainName'>MYDOMAIN</Data>
        <Data Name='TargetLogonId'>0x1c01acc</Data>
        <Data Name='LogonType'>10</Data>
    </EventData>
</Event>

Como eu poderia, por exemplo, extrair o 0x1c01acc armazenado no nó Data com o atributo Name igual a 'TargetLogonId' ?

    
por pk. 23.08.2011 / 01:55

3 respostas

5

Verifique se sua string é XML válida (isto é, adicione </Event> ao final do que você postou acima e, em seguida, converta essa string como XML:

$xml = [xml]$yourStringHere

Então você pode retirar o TargetLogonId assim:

$xml.Event.SelectSingleNode("//*[@Name='TargetLogonId']") | select -ExpandProperty '#text'

Agradecemos a Shay Levy e a este post: link

    
por 23.08.2011 / 04:14
2

Se você receber apenas o XML bruto, poderá carregar o documento XML. Como você postou um fragmento XML, presumo que ele foi exportado do log e possui uma tag raiz <Events> . A parte complicada é o namespace.

$xml = [xml](get-content "PathToXml.xml")
$xmlns = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $xml.NameTable
$xmlns.AddNamespace("el", "http://schemas.microsoft.com/win/2004/08/events/event")
$value = $xml.SelectSingleNode("/Events/el:Event/el:EventData/el:Data[@Name = 'TargetLogonId']/text()", $xmlns).Value

O XML que usei:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Events>
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
    <Provider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-a5ba-3e3b0328c30d}'/>
    <EventID>4634</EventID>
    <Version>0</Version>
    <Level>0</Level>
    <Task>12545</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8020000000000000</Keywords>
    <TimeCreated SystemTime='2011-08-16T17:15:38.702857400Z'/>
    <EventRecordID>107947</EventRecordID>
    <Correlation/>
    <Execution ProcessID='680' ThreadID='972'/>
    <Channel>Security</Channel>
    <Computer>SRV1.DOMAIN.LOCAL</Computer><Security/>
</System>
<EventData>
    <Data Name='TargetUserSid'>S-1-5-21-963414502-3093649508-813756320-3274</Data>
    <Data Name='TargetUserName'>billgates</Data>
    <Data Name='TargetDomainName'>MYDOMAIN</Data>
    <Data Name='TargetLogonId'>0x1c01acc</Data>
    <Data Name='LogonType'>10</Data>
</EventData>
</Event>
</Events>
    
por 23.08.2011 / 04:18
1

Para obter o XML de uma entrada do log de eventos:

Get-WInEvent ‹parameters to select the events› | Foreach-Object { $_.ToXml() }

Em seguida, use as técnicas mostradas nas outras respostas para extrair o valor específico de <Data> .

    
por 23.08.2011 / 09:22