derwowusste
Goto Top

Gespeichertes Eventlog per Powershell durchsuchen

Werte Kollegen!

Ich archiviere die Securitylogs des Domänencontrollers jeden Tag.
Wenn ich nun etwas im Log von z.B. vorgestern suchen möchte, öffne ich das alte Log in Eventvwr und suche manuell.
Wie kann ich das in Powershell ansprechen, um es per Skript nach etwas zu durchsuchen?

Beispielskript: https://gallery.technet.microsoft.com/Find-where-a-user-logged-00e13f27
Da finden sich die Zeilen 64-70:
<QueryList>
  <Query Id="0" Path="Security">  
    <Select Path="Security">*[System[(EventID=4769)  
	and TimeCreated[@SystemTime&gt;='$DateThen'   
	and @SystemTime&lt;='$DateNow']]]   
	and*[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]</Select>  
  </Query>
</QueryList>
Ich denke, statt Security müsste ich nur die korrekte Benennung eingeben, aber wie lautet diese, damit es zu diesem Bild passt?
capture

Content-Key: 608788

Url: https://administrator.de/contentid/608788

Printed on: April 19, 2024 at 11:04 o'clock

Member: emeriks
emeriks Sep 30, 2020 at 13:56:16 (UTC)
Goto Top
Hi DWW,
meinst Du vielleicht sowas?
Use PowerShell to Parse Saved Event Logs for Errors

E.
Member: DerWoWusste
DerWoWusste Sep 30, 2020 at 14:11:45 (UTC)
Goto Top
Moin.

Ds war mir bekannt, bringt mich aber mit dem konkreten Skript nicht weiter. Oder wir würdest Du das Skript umgestalten?
Mitglied: 145916
Solution 145916 Sep 30, 2020 updated at 14:31:00 (UTC)
Goto Top
Ich denke, statt Security müsste ich nur die korrekte Benennung eingeben,
Musst du nur weglassen, da muss nur der XPATH Filterpart rein
Get-WinEvent -Path D:\test.evtx -FilterXPath "*[System[(EventID=4769) and TimeCreated[@SystemTime >='$DateThen' and @SystemTime <='$DateNow']]] and *[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]"  
Member: DerWoWusste
DerWoWusste Sep 30, 2020 at 14:45:23 (UTC)
Goto Top
@145916
und dieser Befehl wird jetzt wie im Skript eingebettet?
Mitglied: 145916
145916 Sep 30, 2020 updated at 19:26:27 (UTC)
Goto Top
Im zusätzlichen Parameter der Funktion -evtlogpath den Pfad zur Logdatei angeben

Get-UserLastLogon -User m.tehrani -Days 5 -evtlogpath D:\datei.evtx
<#
.SYNOPSIS
    .
.DESCRIPTION
    This script will query all domain controllers and return a list of 
    computers where the user has logged on to. This query is optimized
    and will run against event viewers of all Domain Controllers.

.PARAMETER User
    This parameter will define the user account which you want to run query
    against. Make sure the name is correct and enter the SAMACCOUNTNAME.

.PARAMETER Days
    This parameter defined the time threshold of query. If you enter 10,
    the list of logons will be created based on last 10 days.

.EXAMPLE
    C:\PS> Get-UserLastLogon -User m.tehrani
    
    This command will get list of computers where (m.tehrani) has logged on to
    in last 90 days.

    C:\PS> Get-UserLastLogon -User m.tehrani -Days 5

    This command will get list of computers where (m.tehrani) has logged on to
    in last 5 days.

.NOTES
    Author: Mahdi Tehrani
    Date  : March 18, 2017   
#>


clear-host
Import-Module activedirectory -ErrorAction stop

function Get-UserLastLogon {
    param (
     [Parameter(Mandatory = $true)]
     [string]$User,

     [Parameter(Mandatory = $false)]
     [array]$Server = @((Get-ADDomainController -Filter *).name) ,

     [Parameter(Mandatory = $false)]
     [array]$Days = 90,
     
     [Parameter(Mandatory = $true)]
     [string]$evtlogpath

           )
begin{
    ## Variables ##
    [Array]$Table         = $null
    $DomainControllers    = $Server
    $AllDomainControllers = @((Get-ADDomainController -Filter *).name)
    [array]$ExclusionList = @($User,'krbtgt')  
    $DCCount              = $DomainControllers.count
    $UPN                  = ((get-addomain).dnsroot).toupper()
    $DateFilter           = "-"+$days  
    $DateThen             = (((Get-Date).AddDays($DateFilter)).ToString("yyyy-MM-dd"))+"T00:00:00.000Z"  
    $DateNow              = (Get-Date -Format yyyy-MM-dd)+"T00:00:00.000Z"  
    $ForestRoot           = ((Get-ADForest).rootdomain).toupper()
    $Counter              = 0

    [xml]$FilterXML = @"*[System[(EventID=4769)  
	and TimeCreated[@SystemTime >='$DateThen'   
	and @SystemTime <='$DateNow']]]   
	and *[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]  
"@  

}

process{   

try
{
$COND = Get-ADUser $User 
Foreach($DCName in $DomainControllers)
{
    $Events       = $null
    $CounterEvent = 1
    $Counter++
    $Domain       = (Get-ADDomain).dnsroot
    $UPNLength    = $Domain.length + 1 
    Write-Progress -Activity "Filtering logs on $DCName ($Counter/$DCCount)" -Status "Finding events for ($User) with ($days) days of timespan" -percentComplete ($Counter/$DCCount*100) -Id 1  
    
    try
    {
        $Events     = Get-WinEvent -Path $evtlogpath -FilterXml $FilterXML -ComputerName $DCName -ErrorAction stop
        $CountEvent = $Events.count
    }
    
    catch
    {
        Write-Warning "$_ (Occured on $DCName)"  
        continue
    }
    
    foreach($Event in $Events)
    {
            Write-Progress -Activity "Please Wait" -Status "Processing Events $CounterEvent\$CountEvent" -percentComplete (($CounterEvent/$CountEvent)*100) -Id 2 -ParentId 1  
            $UserName   = $Event.Properties.Value
            $UserLength = $UserName.length
            $UserName   = $UserName.substring(0,$UserLength-$UPNLength)
            $Location   = $Event.Properties[2].Value 
            $Location   = $Location.trim("$")  
            $Time       = ($Event.TimeCreated).ToString($G)
            $Domain     = $Event.Properties[1].Value
            $CounterEvent++
            
            if ($UserName -eq $User)
            { 
             
                $obj      = New-Object -TypeName PSObject -Property @{
                            "User"     =    $UserName  
                            "Location" =    $Location  
                            "Time"     =    $Time  
                            "Domain"   =    $Domain   
                            "DC"       =    $DCName  
                                                           }
                        $Table += $obj
            }
        
        }  
    Write-Progress -Activity "Please Wait" -Completed  
}
}
catch
{
    Write-Host "User $user does not exist!" -ForegroundColor Yellow -BackgroundColor Red -ErrorAction stop  
}
}

end{
$Table = $Table | Where-Object {($_.Location -notin $AllDomainControllers) -and ($_.Location -ne $ForestRoot) -and ($_.Location -notin $ExclusionList)} 
$Table | Sort Time | FT Time,User,Location,Domain,DC -AutoSize 
}
}
Member: DerWoWusste
DerWoWusste Sep 30, 2020 updated at 15:12:08 (UTC)
Goto Top
Das findet leider nichts im gespeicherten Eventlog... bei Dir?
-nein, ich suche nicht nach m.tehrani face-wink
Mitglied: 145916
145916 Sep 30, 2020 at 16:44:10 (UTC)
Goto Top
Jopp.
Member: DerWoWusste
DerWoWusste Sep 30, 2020 at 17:20:24 (UTC)
Goto Top
Und du hast vor der Suche das aktuelle Log geleert, so dass nur das gespeicherte durchsucht wird? Sonst findet das Skript natürlich was.
Mitglied: 145916
145916 Sep 30, 2020 updated at 18:19:24 (UTC)
Goto Top
Zitat von @DerWoWusste:

Und du hast vor der Suche das aktuelle Log geleert, so dass nur das gespeicherte durchsucht wird? Sonst findet das Skript natürlich was.
Das Skript kann gar nicht im aktuellen Log was suchen weil ich das Skript in Zeile 66 und 90 oben ja so abgeändert habe das es nur in einer Datei suchen kann 😉.
Member: DerWoWusste
DerWoWusste Sep 30, 2020 at 19:10:26 (UTC)
Goto Top
Hm, warum tut es das dann bei mir? Es zeigt mir Logons vom 30.9. an, obwohl das gespeicherte Log von vorgestern ist.
Mitglied: 145916
145916 Sep 30, 2020 updated at 19:33:49 (UTC)
Goto Top
Der Müll ist ist ja nicht auf meinem Mist gewachsen habe ja nur die nötigen Stellen angepasst, der hatte da übrigens eine feste Zeit im Datum einprogrammiert... Ist nicht alles so toll was man da im Skriptcenter so lädt.
Und mein Einzeiler oben macht es ja einwandfrei. Brauchst dir nur die Variablen schnappen und die dann vor den Einzeiler einpflegen , mitdenken bitte erwünscht.
Ich bin raus.
Member: DerWoWusste
DerWoWusste Oct 01, 2020 at 09:10:52 (UTC)
Goto Top
Beispiel für eine funktionierende Syntax:
Get-WinEvent -Path some.evtx -FilterXPath "*[System[(EventID=4697) and TimeCreated[@SystemTime >='2020-09-21T20:30:00.000Z' and @SystemTime <='2020-10-01T20:30:00.000Z']]] and *[EventData[Data[@Name='TargetUserName'] and (Data='gesuchterUser')]]"  
Danke an den abgemeldeten Eaglefinder!