Windows Server da Uzak Masaüstü Yapan Kullanıcı Listesi PS scripti

Windows Server da Uzak Masaüstü Yapan Kullanıcı Listesi PS scripti

Windows server da son 24 saatte hangi kullanıcılar hangi ip den bağlantı yapmışlar bu aşağıdaki script ile görebiliriz.

$Baslangic = (Get-Date).AddHours(-24)

$events = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    StartTime = $Baslangic
    ID = 4624,4634,4647
} -ErrorAction SilentlyContinue

$oturumlar = @()

foreach ($ev in $events) {

    $xml = [xml]$ev.ToXml()

    $data = @{}
    foreach ($d in $xml.Event.EventData.Data) {
        $data[$d.Name] = $d.'#text'
    }

    switch ($ev.Id) {

        4624 {
            if ($data.LogonType -eq '10') {

                $oturumlar += [PSCustomObject]@{
                    LogonID      = $data.TargetLogonId
                    Kullanici    = "$($data.TargetDomainName)\$($data.TargetUserName)"
                    Giris        = $ev.TimeCreated
                    Cikis        = $null
                    Disconnect   = $null
                    IP           = $data.IpAddress
                    Durum        = "Bağlı"
                }
            }
        }

        4634 {
            $session = $oturumlar |
                Where-Object { $_.LogonID -eq $data.TargetLogonId } |
                Select-Object -Last 1

            if ($session -and !$session.Cikis) {
                $session.Cikis = $ev.TimeCreated
                $session.Durum = "Çıkış Yapmış"
            }
        }

        4647 {
            $session = $oturumlar |
                Where-Object { $_.LogonID -eq $data.TargetLogonId } |
                Select-Object -Last 1

            if ($session -and !$session.Cikis) {
                $session.Cikis = $ev.TimeCreated
                $session.Durum = "Logoff"
            }
        }
    }
}

$oturumlar |
Select-Object `
    Kullanici,
    Giris,
    Disconnect,
    Cikis,
    @{
        Name='Sure';
        Expression={
            if ($_.Cikis) {
                New-TimeSpan -Start $_.Giris -End $_.Cikis
            }
            else {
                New-TimeSpan -Start $_.Giris -End (Get-Date)
            }
        }
    },
    IP,
    Durum |
Sort-Object Giris -Descending |
Format-Table -AutoSize

Aşağıda da hangi kullanıcılar bağlanıp nekadar bağlı kalmışlar onu görebiliriz.

$baslangic = (Get-Date).AddHours(-24)

$events = Get-WinEvent -FilterHashtable @{
    LogName = @(
        'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational'
    )
    StartTime = $baslangic
} -ErrorAction SilentlyContinue

$oturumlar = @{}

foreach ($e in $events | Sort-Object TimeCreated) {

    switch ($e.Id) {

        # Login
        21 {
            if ($e.Properties.Count -ge 2) {

                $user = $e.Properties[0].Value
                $sessionId = $e.Properties[1].Value

                $oturumlar[$sessionId] = [PSCustomObject]@{
                    SessionID   = $sessionId
                    Kullanici   = $user
                    Giris       = $e.TimeCreated
                    Disconnect  = $null
                    Cikis       = $null
                    Durum       = 'Bağlı'
                }
            }
        }

        # Disconnect
        24 {
            $sessionId = $e.Properties[0].Value

            if ($oturumlar.ContainsKey($sessionId)) {
                $oturumlar[$sessionId].Disconnect = $e.TimeCreated
                $oturumlar[$sessionId].Durum = 'Disconnected'
            }
        }

        # Reconnect
        25 {
            $sessionId = $e.Properties[0].Value

            if ($oturumlar.ContainsKey($sessionId)) {
                $oturumlar[$sessionId].Durum = 'Tekrar Bağlandı'
            }
        }

        # Logoff
        23 {
            $sessionId = $e.Properties[0].Value

            if ($oturumlar.ContainsKey($sessionId)) {
                $oturumlar[$sessionId].Cikis = $e.TimeCreated
                $oturumlar[$sessionId].Durum = 'Çıkış Yapmış'
            }
        }
    }
}

$oturumlar.Values |
Select-Object `
    Kullanici,
    SessionID,
    Giris,
    Disconnect,
    Cikis,
    @{
        Name='Sure'
        Expression={
            if ($_.Cikis) {
                (New-TimeSpan $_.Giris $_.Cikis).ToString("dd\.hh\:mm\:ss")
            }
            else {
                (New-TimeSpan $_.Giris (Get-Date)).ToString("dd\.hh\:mm\:ss")
            }
        }
    },
    Durum |
Sort-Object Giris -Descending |
Format-Table -AutoSize

Kodlar Powershell dir, powershell in ne olduğun bilmiyorsanız zaten size lazım da değildir. 🙂

Related Post