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

Ausgedruckt am: 19.03.2024 um 03:03 Uhr

Mitglied: emeriks
emeriks 30.09.2020 um 15:56:16 Uhr
Goto Top
Hi DWW,
meinst Du vielleicht sowas?
Use PowerShell to Parse Saved Event Logs for Errors

E.
Mitglied: DerWoWusste
DerWoWusste 30.09.2020 um 16:11:45 Uhr
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
Lösung 145916 30.09.2020 aktualisiert um 16:31:00 Uhr
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')]]"  
Mitglied: DerWoWusste
DerWoWusste 30.09.2020 um 16:45:23 Uhr
Goto Top
@145916
und dieser Befehl wird jetzt wie im Skript eingebettet?
Mitglied: 145916
145916 30.09.2020 aktualisiert um 21:26:27 Uhr
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 
}
}
Mitglied: DerWoWusste
DerWoWusste 30.09.2020 aktualisiert um 17:12:08 Uhr
Goto Top
Das findet leider nichts im gespeicherten Eventlog... bei Dir?
-nein, ich suche nicht nach m.tehrani face-wink
Mitglied: 145916
145916 30.09.2020 um 18:44:10 Uhr
Goto Top
Jopp.
Mitglied: DerWoWusste
DerWoWusste 30.09.2020 um 19:20:24 Uhr
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 30.09.2020 aktualisiert um 20:19:24 Uhr
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 😉.
Mitglied: DerWoWusste
DerWoWusste 30.09.2020 um 21:10:26 Uhr
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 30.09.2020 aktualisiert um 21:33:49 Uhr
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.
Mitglied: DerWoWusste
DerWoWusste 01.10.2020 um 11:10:52 Uhr
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!