mrheisenberg
Goto Top

Skript zur Live Logon-Logoff aufzeichnung

Moin Leute,

mein Vorgänger hatte ein Skript welches auf unserm Domaincontroller WinSRV 2016 live die LogOn/LogOff Daten aus dem Eventviewer rausholt, funktionierte bis dato auch immer dass die Daten gekommen sind, im Endeffekt wie ping-t nur mit den User/Timestamp anhand der Event-ID, Skript wird in der ISE geöffnet, bricht aber ohne Fehler ab und die ISE beendet sich ohne Grund, andere Skripte laufen in der ISE ohne Probleme, nur hier happerts:

if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "Das Skript muss mit Administratorrechten ausgeführt werden." -ForegroundColor Red  
    exit
}

function Start-LogonLogoffMonitoring {
    $logonEventID = 4624
    $logoffEventID = 4634

    $filterXml = "@"  
<QueryList>
  <Query Id="0" Path="Security">  
    <Select Path="Security">  
        *[System[(EventlD=$logonEventID or EventlD=$logoffEventID)]]
    </Select>
  </Query>
</QueryList>
"@  

    $events = Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue

    if (!$events) {
        Write-Host "Es wurden keine Logon- oder Logoff-Ereignisse gefunden." -ForegroundColor Yellow  
        return
    }

    $eventHash = @{}
    foreach (event in events) {
        eventHash[event.RecordId] = event
    }

    Write-Host "Starte die Überwachung von Logon- und Logoff-Ereignissen. Drücke [Ctrl+C], um zu beenden."  

    while ($true) {
        $newEvents = Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue | Where-Object { $_.RecordId -notin $eventHash.Keys }

        foreach (event in newEvents) {
            $eventHash[event.RecordId] = event

            if ($event.Id -eq $logonEventID) {
                $eventType = "Logon"  
                $userName = $event.Properties[5].Value
            }
            elseif ($event.Id -eq $logoffEventID) {
                $eventType = "Logoff"  
                $userName = $event.Properties[4].Value
            }

            $timeStamp = event.TimeCreated
            $computerName = event.MachineName

            Write-Host "[$timeStamp] [$eventType] $userName angemeldet am Computer $computerName"  
        }

        Start-Sleep -Seconds 1
    }
}

Start-LogonLogoffMonitoring

jetzt will mir dieses Skript nicht mehr starten, ich finde aber keinen offenbaren Fehler, wird als Admin ausgeführt (Powershell ISE) aber die ISE bricht ohne Fehler ab und beendet sich... ich hab jetzt keinen Plan mehr wo hier der Haken ist, bis letzte Woche hats normal seinen Dienst verrichtet, Updates wurden keine Eingespielt...

Bevor jetzt die Diskussion beginnt warum wir hier Live die Daten auswerten, im DV ist dieser Part verankert.

Grüße

Content-Key: 7425917771

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

Printed on: May 5, 2024 at 23:05 o'clock

Mitglied: 7426148943
Solution 7426148943 Jun 05, 2023 updated at 12:12:22 (UTC)
Goto Top
Moin.
ich finde aber keinen offenbaren Fehler
Kurz überflogen. Da ist ein Anführungszeichen zu viel in der HereDoc Syntax und diverse Variablen ohne Dollarzeichen, das kann so niemals funktioniert haben 😀
$filterXml = "@"

if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "Das Skript muss mit Administratorrechten ausgeführt werden." -ForegroundColor Red  
    exit
}

function Start-LogonLogoffMonitoring {
    $logonEventID = 4624
    $logoffEventID = 4634

    $filterXml = @"  
<QueryList>
  <Query Id="0" Path="Security">  
    <Select Path="Security">  
        *[System[(EventlD=$logonEventID or EventlD=$logoffEventID)]]
    </Select>
  </Query>
</QueryList>
"@  

    $events = Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue

    if (!$events) {
        Write-Host "Es wurden keine Logon- oder Logoff-Ereignisse gefunden." -ForegroundColor Yellow  
        return
    }

    $eventHash = @{}
    foreach ($event in $events) {
        $eventHash[event.RecordId] = $event
    }

    Write-Host "Starte die Überwachung von Logon- und Logoff-Ereignissen. Drücke [Ctrl+C], um zu beenden."  

    while ($true) {
        $newEvents = Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue | Where-Object { $_.RecordId -notin $eventHash.Keys }

        foreach ($event in $newEvents) {
            $eventHash[event.RecordId] = $event

            if ($event.Id -eq $logonEventID) {
                $eventType = "Logon"  
                $userName = $event.Properties[5].Value
            }
            elseif ($event.Id -eq $logoffEventID) {
                $eventType = "Logoff"  
                $userName = $event.Properties[4].Value
            }

            $timeStamp = $event.TimeCreated
            $computerName = $event.MachineName

            Write-Host "[$timeStamp] [$eventType] $userName angemeldet am Computer $computerName"  
        }

        Start-Sleep -Seconds 1
    }
}

Start-LogonLogoffMonitoring
Zeppel
Member: Kraemer
Solution Kraemer Jun 05, 2023 at 09:59:46 (UTC)
Goto Top
und, wenn ich mich nicht verzählt habe, stehen da 9 Variablen ohne Dollar-Zeichen da...
Member: MrHeisenberg
MrHeisenberg Jun 05, 2023 at 13:23:22 (UTC)
Goto Top
Danke Leute,

habs ausgebessert, vielen Dank Leute

if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "Das Skript muss mit Administratorrechten ausgeführt werden." -ForegroundColor Red  
    exit
}

function Start-LogonLogoffMonitoring {
    $logonEventID = 4624
    $logoffEventID = 4634

    $filterXml = @"  
<QueryList>
  <Query Id="0" Path="Security">  
    <Select Path="Security">  
        *[System[(EventID=$logonEventID or EventID=$logoffEventID)]]
    </Select>
  </Query>
</QueryList>
"@  

    $events = Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue

    if (!$events) {
        Write-Host "Es wurden keine Logon- oder Logoff-Ereignisse gefunden." -ForegroundColor Yellow  
        return
    }

    $eventHash = @{}
    foreach ($event in $events) {
        $eventHash[$event.RecordId] = $event
    }

    Write-Host "Starte die Überwachung von Logon- und Logoff-Ereignissen. Drücke [Ctrl+C], um zu beenden."  

    while ($true) {
        $newEvents = Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue | Where-Object { $_.RecordId -notin $eventHash.Keys }

        foreach ($event in $newEvents) {
            $eventHash[$event.RecordId] = $event

            if ($event.Id -eq $logonEventID) {
                $eventType = "Logon"  
                $userName = $event.Properties[5].Value
            }
            elseif ($event.Id -eq $logoffEventID) {
                $eventType = "Logoff"  
                $userName = $event.Properties[4].Value
            }

            $timeStamp = $event.TimeCreated
            $computerName = $event.MachineName

            Write-Host "[$timeStamp] [$eventType] $userName angemeldet am Computer $computerName"  
        }

        Start-Sleep -Seconds 1
    }
}

Start-LogonLogoffMonitoring