sunucu.com.tr
Windows Sunucular

RDP sunucu oturum yönetimi: PowerShell ile bağlı kullanıcıları listeleme, boşta ve kopuk oturumları otomatik kapatma

RDP sunucu üzerinde kimin bağlı olduğunu PowerShell ile tablo halinde görün. Boşta ve kopuk oturumları önce deneme kipinde listeleyip kullanıcıya uyarı vererek kapatın, işi zamanlanmış görevle otomatikleştirin ve kalıcı sınırı Grup İlkesi ile koyun.

13 dk okuma

Logo, Mikro ya da benzeri bir programı çalıştıran bir RDP sunucu üzerinde kullanıcılar çoğu zaman pencereyi kapatıp gider. Oturumu kapatmazlar. Oturum "kopuk" durumda açık kalır, program arka planda çalışmaya devam eder, RAM tüketir ve bazen dosya ya da kayıt kilidi tutar. Bu rehber, bağlı kullanıcıları PowerShell ile listelemek, boşta ve kopuk oturumları güvenli biçimde kapatmak ve bunu zamanlanmış görevle otomatikleştirmek isteyen sistem yöneticileri ve KOBİ sahipleri için hazırlandı.

RDP sunucuda açık kalan oturumlar neden sorun olur?

Uzak Masaüstü penceresinin sağ üstteki X düğmesi oturumu kapatmaz, yalnızca bağlantıyı keser. Sunucu tarafında kullanıcının masaüstü, açık programları ve bellekteki verisi olduğu gibi durur. Bunun üç somut etkisi vardır:

  • Bellek: Her açık oturum kendi Explorer sürecini, tarayıcı sekmelerini ve iş programının istemcisini bellekte tutar. Kopuk oturum sayısı arttıkça aktif kullanıcılara kalan RAM azalır. Sunucunuzun gerçek bellek ihtiyacını ölçmek için Windows bulut sunucu RAM ölçüm rehberindeki betiği kullanabilirsiniz; kopuk oturumları temizlemeden yapılan ölçüm ihtiyacı olduğundan yüksek gösterir.
  • Lisans ve oturum sınırı: RD Session Host rolü kurulu olmayan bir sunucuda aynı anda yalnız iki yönetim oturumu açılabilir. Kopuk kalan bir oturum bu iki yerden birini tutar. Ayrıntı için aynı anda kaç kullanıcı bağlanır yazısına bakın. İş programlarının eşzamanlı kullanıcı lisansı da arka planda açık kalan program örneğini kullanıcı olarak sayabilir.
  • Kilitler: Açık kalan bir fiş ekranı, rapor ya da dönem işlemi veritabanında ya da paylaşılan dosyada kilit tutabilir. Başka kullanıcı aynı kaydı açamaz, gün sonu işlemleri beklemede kalır.

Çözümün iki katmanı var: PowerShell betiğiyle görünürlük ve kontrollü temizlik, ardından Grup İlkesi ile kalıcı süre sınırı.

Ön koşullar

  • Windows Server 2019, 2022 ya da 2025; Windows PowerShell 5.1.
  • Yerel yönetici yetkisi. Betikler quser, msg ve logoff araçlarını kullanır; bunlar Windows Server'da hazır gelir.
  • Betikleri koyacağınız bir klasör. Örneklerde C:\Scripts kullanılıyor.
  • Hangi hesapların hiçbir zaman kapatılmayacağının listesi (yönetici hesapları, servis hesapları).

quser çıktısını PowerShell nesnesine çevirme

quser (eşdeğeri query user) bağlı kullanıcıları gösterir. Belgesi Microsoft Learn quser sayfasında bulunur. Tipik çıktı şöyledir:

text
 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>yonetici              rdp-tcp#12          2  Active          .  31.10.2026 08:02
 muhasebe1             rdp-tcp#15          3  Active         47  31.10.2026 08:40
 depo2                                     4  Disc       2+03:15  29.10.2026 09:11

Sorun, bu çıktının düz metin olmasıdır. Kopuk oturumlarda SESSIONNAME sütunu boş kalır, bu yüzden boşluğa göre bölmek sütunları kaydırır. IDLE TIME de dört farklı biçimde gelir: . ya da none (boşta değil), 47 (dakika), 1:05 (saat:dakika), 2+03:15 (gün+saat:dakika). qwinsta (query session) aynı bilgiyi oturum odaklı verir ama boşta süresini göstermez; bu yüzden temel olarak quser kullanıyoruz.

Aşağıdaki betik iki fonksiyon tanımlar: boşta süresini dakikaya çeviren ConvertTo-BostaDakika ve her satırı nesneye dönüştüren Get-RdpOturum. Windows Server 2019, 2022 ve 2025 üzerinde PowerShell 5.1 için hazırlandı. Yalnızca okuma yapar, hiçbir oturuma dokunmaz; geri almak için dosyayı silmeniz yeterlidir. C:\Scripts\Get-RdpOturum.ps1 olarak kaydedin.

powershell
# Get-RdpOturum.ps1
# quser çıktısını nesneye çevirir. Yalnızca okur, oturum kapatmaz.
# Windows Server 2019/2022/2025 ve PowerShell 5.1 için hazırlandı.

function ConvertTo-BostaDakika {
    param([string]$Deger)
    $Deger = $Deger.Trim()
    # Boşta değil: ".", "none" ya da yerelleştirilmiş karşılığı
    if ($Deger -match '^(none|yok|\.)$') { return 0 }
    # gün+saat:dakika  ör. 2+03:15
    if ($Deger -match '^(\d+)\+(\d{1,2}):(\d{2})$') {
        return ([int]$Matches[1] * 1440) + ([int]$Matches[2] * 60) + [int]$Matches[3]
    }
    # saat:dakika  ör. 1:05
    if ($Deger -match '^(\d{1,2}):(\d{2})$') {
        return ([int]$Matches[1] * 60) + [int]$Matches[2]
    }
    # yalnız dakika  ör. 47
    if ($Deger -match '^\d+$') { return [int]$Deger }
    # Tanınmayan biçim: çağıran taraf bu oturumu atlamalı
    return -1
}

function Get-RdpOturum {
    [CmdletBinding()]
    param([string]$Sunucu = $env:COMPUTERNAME)

    # Hiç kullanıcı yoksa quser hata döndürür; sessizce boş sonuç ver
    $satirlar = quser /server:$Sunucu 2>$null
    if (-not $satirlar) { return }

    # Oturum adı isteğe bağlı: kopuk oturumlarda boş gelir.
    # Durum tek ya da çok sözcüklü olabilir (yerelleştirilmiş sistemler için).
    $desen = '^\s*>?(?<Kullanici>\S+)\s+(?:(?<Oturum>\S+)\s+)?(?<Id>\d+)\s+(?<Durum>.+?)\s+' +
             '(?<Bosta>none|yok|\.|\d+\+\d{1,2}:\d{2}|\d{1,2}:\d{2}|\d+)\s+(?<Giris>\d.*)$'

    foreach ($satir in ($satirlar | Select-Object -Skip 1)) {
        if ($satir -match $desen) {
            # $Matches başka bir -match ile ezilmeden önce değerleri kopyala
            $kullanici = $Matches['Kullanici']
            $oturumAdi = $Matches['Oturum']
            $id        = [int]$Matches['Id']
            $durum     = $Matches['Durum'].Trim()
            $bostaHam  = $Matches['Bosta']
            $giris     = $Matches['Giris'].Trim()

            # Kopuk: oturum adı boş ya da durum "Disc" ile başlıyor
            $kopuk = [string]::IsNullOrEmpty($oturumAdi) -or ($durum -match '^Disc')

            [pscustomobject]@{
                Sunucu      = $Sunucu
                Kullanici   = $kullanici
                OturumAdi   = $oturumAdi
                Id          = $id
                Durum       = $durum
                Kopuk       = $kopuk
                BostaHam    = $bostaHam
                BostaDakika = ConvertTo-BostaDakika -Deger $bostaHam
                GirisZamani = $giris
            }
        }
        else {
            Write-Warning "Çözümlenemeyen satır: $satir"
        }
    }
}

Doğrulamak için yönetici PowerShell penceresinde şunu çalıştırın:

powershell
. C:\Scripts\Get-RdpOturum.ps1
Get-RdpOturum | Sort-Object BostaDakika -Descending |
    Format-Table Kullanici, Id, Durum, Kopuk, BostaHam, BostaDakika, GirisZamani -AutoSize

Beklenen çıktı, yukarıdaki örnek için depo2 satırında Kopuk = True ve BostaDakika = 3075 olmalıdır. "Çözümlenemeyen satır" uyarısı görürseniz ham quser çıktısını o satırla karşılaştırın. Türkçe arayüzlü sistemlerde durum sözcükleri farklı gelebilir; betik kopukluğu öncelikle boş oturum adından anladığı için bu çoğu durumda sorun çıkarmaz, ama ilk kurulumda bir kez gözle kontrol edin.

Boşta ve kopuk oturumları güvenli kapatma betiği

Kapatma betiği iki eşik kullanır:

  • Kopuk oturum eşiği (varsayılan 30 dakika): Bağlantısı kopmuş ve bu süreden uzun süredir hareketsiz oturumlar. Kullanıcı ekran başında olmadığı için mesaj gönderilmez, doğrudan kapatılır.
  • Boşta aktif oturum eşiği (varsayılan 120 dakika): Bağlı ama uzun süredir klavye ve fare hareketi olmayan oturumlar. Önce msg ile uyarı gönderilir, bekleme süresi sonunda oturum yeniden sorgulanır. Kullanıcı bu arada ekrana döndüyse oturum kapatılmaz.

Ek güvenlik önlemleri:

  • Betiği çalıştıran oturum (kendi oturumunuz) her zaman atlanır.
  • -Haric listesindeki hesaplar hiçbir koşulda kapatılmaz.
  • -Uygula anahtarı verilmezse betik deneme kipinde çalışır: yalnızca neyi kapatacağını günlüğe yazar.
  • Her çalışma aylık bir günlük dosyasına tarih ve saatle kaydedilir.

Betik Windows Server 2019, 2022 ve 2025 ile PowerShell 5.1 için hazırlandı. ORNEK_YONETICI yerine kendi yönetici hesap adlarınızı yazın. Kapatılan bir oturum geri getirilemez; betiğin kendisini geri almak için dosyayı ve kurduysanız zamanlanmış görevi silmeniz yeterlidir. C:\Scripts\Clear-RdpOturum.ps1 olarak kaydedin.

powershell
# Clear-RdpOturum.ps1
# Boşta ve kopuk RDP oturumlarını kapatır. -Uygula verilmezse yalnız raporlar.
# Windows Server 2019/2022/2025 ve PowerShell 5.1 için hazırlandı.
[CmdletBinding()]
param(
    [int]$KopukDakika   = 30,     # kopuk oturum için eşik (dakika)
    [int]$BostaDakika   = 120,    # aktif ama boşta oturum için eşik (dakika)
    [int]$UyariSaniye   = 120,    # uyarı mesajından sonra bekleme süresi
    [string[]]$Haric    = @('Administrator', 'ORNEK_YONETICI'),  # asla kapatılmayacak hesaplar
    [string]$GunlukKlasoru = 'C:\Scripts\Logs',
    [switch]$Uygula
)

. (Join-Path $PSScriptRoot 'Get-RdpOturum.ps1')

# Günlük klasörü yoksa oluştur (tekrar çalıştırmada sorun çıkarmaz)
if (-not (Test-Path $GunlukKlasoru)) {
    New-Item -ItemType Directory -Path $GunlukKlasoru -Force | Out-Null
}
$gunluk = Join-Path $GunlukKlasoru ('rdp-oturum-{0:yyyy-MM}.log' -f (Get-Date))

function Write-Gunluk {
    param([string]$Metin)
    $satir = '{0:yyyy-MM-dd HH:mm:ss} {1}' -f (Get-Date), $Metin
    Add-Content -Path $gunluk -Value $satir -Encoding UTF8
    Write-Host $satir
}

$kip = if ($Uygula) { 'UYGULA' } else { 'DENEME' }
$benimOturum = [System.Diagnostics.Process]::GetCurrentProcess().SessionId
$oturumlar = @(Get-RdpOturum)
Write-Gunluk "Başladı. Kip: $kip. Oturum sayısı: $($oturumlar.Count)"

$kopuklar = New-Object System.Collections.Generic.List[object]
$bostalar = New-Object System.Collections.Generic.List[object]

foreach ($o in $oturumlar) {
    if ($o.Id -eq $benimOturum)        { continue }   # kendi oturumumuz
    if ($Haric -contains $o.Kullanici) { continue }   # korunan hesaplar
    if ($o.BostaDakika -lt 0) {
        Write-Gunluk "ATLANDI: $($o.Kullanici) (Id $($o.Id)) boşta süresi okunamadı: $($o.BostaHam)"
        continue
    }
    if ($o.Kopuk -and $o.BostaDakika -ge $KopukDakika) { $kopuklar.Add($o) }
    elseif (-not $o.Kopuk -and $o.BostaDakika -ge $BostaDakika) { $bostalar.Add($o) }
}

# 1) Kopuk oturumlar: mesaj anlamsız, doğrudan kapat
foreach ($o in $kopuklar) {
    $bilgi = "$($o.Kullanici) (Id $($o.Id), kopuk, $($o.BostaDakika) dk)"
    if ($Uygula) {
        logoff $o.Id
        if ($LASTEXITCODE -eq 0) { Write-Gunluk "KAPATILDI: $bilgi" }
        else { Write-Gunluk "HATA: $bilgi kapatılamadı, çıkış kodu $LASTEXITCODE" }
    }
    else { Write-Gunluk "DENEME: kapatılacaktı: $bilgi" }
}

# 2) Boşta aktif oturumlar: önce uyar, bekle, yeniden kontrol et
if ($bostalar.Count -gt 0) {
    $mesaj = "Oturumunuz $BostaDakika dakikadır boşta. $UyariSaniye saniye içinde kapatılacak. " +
             "Açık işinizi kaydedin ya da fareyi hareket ettirin."
    foreach ($o in $bostalar) {
        if ($Uygula) {
            msg $o.Id /TIME:$UyariSaniye $mesaj
            Write-Gunluk "UYARI GÖNDERİLDİ: $($o.Kullanici) (Id $($o.Id), $($o.BostaDakika) dk)"
        }
        else { Write-Gunluk "DENEME: uyarı ve kapatma yapılacaktı: $($o.Kullanici) (Id $($o.Id), $($o.BostaDakika) dk)" }
    }

    if ($Uygula) {
        Start-Sleep -Seconds $UyariSaniye
        $guncel = @(Get-RdpOturum)
        foreach ($o in $bostalar) {
            # Aynı Id ve aynı kullanıcı hâlâ var mı, hâlâ boşta mı?
            $simdi = $guncel | Where-Object { $_.Id -eq $o.Id -and $_.Kullanici -eq $o.Kullanici }
            if (-not $simdi) { Write-Gunluk "ATLANDI: $($o.Kullanici) oturumu zaten kapanmış"; continue }
            if ($simdi.BostaDakika -lt $BostaDakika) {
                Write-Gunluk "ATLANDI: $($o.Kullanici) ekrana döndü (boşta $($simdi.BostaDakika) dk)"
                continue
            }
            logoff $o.Id
            if ($LASTEXITCODE -eq 0) { Write-Gunluk "KAPATILDI: $($o.Kullanici) (Id $($o.Id), boşta)" }
            else { Write-Gunluk "HATA: $($o.Kullanici) kapatılamadı, çıkış kodu $LASTEXITCODE" }
        }
    }
}

Write-Gunluk "Bitti. Kopuk aday: $($kopuklar.Count), boşta aday: $($bostalar.Count)"

Önce deneme kipinde çalıştırın ve günlüğü okuyun:

powershell
C:\Scripts\Clear-RdpOturum.ps1 -KopukDakika 30 -BostaDakika 120
Get-Content "C:\Scripts\Logs\rdp-oturum-$(Get-Date -Format yyyy-MM).log" -Tail 20

DENEME: kapatılacaktı satırlarında beklemediğiniz bir hesap görürseniz onu -Haric listesine ekleyin. Liste doğru göründüğünde aynı komutu -Uygula ile çalıştırın ve ardından quser ile kopuk oturumların gittiğini kontrol edin.

RDS dağıtımında Get-RDUserSession ve Invoke-RDUserLogoff

Connection Broker içeren tam bir Uzak Masaüstü Hizmetleri dağıtımınız varsa quser çözümlemeye gerek yoktur. RemoteDesktop modülü oturumları doğrudan nesne olarak verir ve birden fazla Session Host'u tek yerden yönetir. Komutların belgesi Invoke-RDUserLogoff sayfasında yer alır. Tek başına çalışan, broker'sız bir sunucuda bu modül çalışmaz; o durumda önceki betik geçerlidir.

Aşağıdaki betik Windows Server 2019, 2022 ve 2025 üzerinde RDS rolleri kurulu bir dağıtım için hazırlandı. rdcb01.example.local yerine kendi Connection Broker adınızı yazın. $Uygula = $false iken yalnızca listeler.

powershell
# RDS dağıtımında kopuk oturumları kapatma
# Windows Server 2019/2022/2025, RemoteDesktop modülü ve Connection Broker için hazırlandı.
Import-Module RemoteDesktop

$Broker      = 'rdcb01.example.local'   # kendi Connection Broker adınız
$KopukDakika = 30
$Uygula      = $false                   # önce $false ile listeleyin
$sinir       = (Get-Date).AddMinutes(-$KopukDakika)

# Önce özellik adlarını kendi ortamınızda doğrulayın:
# Get-RDUserSession -ConnectionBroker $Broker | Select-Object -First 1 | Format-List *

Get-RDUserSession -ConnectionBroker $Broker |
    Where-Object { $_.SessionState -eq 'STATE_DISCONNECTED' -and $_.DisconnectTime -lt $sinir } |
    ForEach-Object {
        $bilgi = '{0}\{1} sunucu {2} oturum {3} koptu {4}' -f $_.DomainName, $_.UserName,
                 $_.HostServer, $_.UnifiedSessionId, $_.DisconnectTime
        if ($Uygula) {
            Invoke-RDUserLogoff -HostServer $_.HostServer -UnifiedSessionID $_.UnifiedSessionId -Force
            "KAPATILDI: $bilgi"
        }
        else { "DENEME: $bilgi" }
    }

Aktif kullanıcılara bakım duyurusu göndermek için Send-RDUserMessage -HostServer ... -UnifiedSessionID ... -MessageTitle 'Bakım' -MessageBody '...' komutunu kullanabilirsiniz. Kapatma ölçütünü DisconnectTime üzerinden kurmak, kopukluk süresini doğrudan ölçtüğü için quser boşta süresine göre daha nettir.

Betiği zamanlanmış görevle mesai dışında çalıştırma

Kopuk oturum temizliğini mesai dışında yapmak kaydedilmemiş iş riskini azaltır. Aşağıdaki betik Clear-RdpOturum.ps1 için her gün 22:30 ve 03:00'te çalışan bir görev oluşturur. Görev SYSTEM hesabıyla çalışır, bu yüzden betik kendi oturumunu (oturum 0) zaten görmez. -Force sayesinde tekrar çalıştırıldığında görevi çoğaltmaz, günceller. Windows Server 2019, 2022 ve 2025 ile PowerShell 5.1 için hazırlandı.

powershell
# Zamanlanmış görev oluşturur ya da günceller (tekrar çalıştırılabilir)
$gorevAdi = 'RDP Oturum Temizleme'
$betik    = 'C:\Scripts\Clear-RdpOturum.ps1'

$eylem = New-ScheduledTaskAction -Execute 'powershell.exe' `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$betik`" -KopukDakika 30 -BostaDakika 120 -Uygula"

$tetikler = @(
    New-ScheduledTaskTrigger -Daily -At '22:30'
    New-ScheduledTaskTrigger -Daily -At '03:00'
)

$kimlik = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest

$ayar = New-ScheduledTaskSettingsSet -StartWhenAvailable -MultipleInstances IgnoreNew `
    -ExecutionTimeLimit (New-TimeSpan -Minutes 30)

Register-ScheduledTask -TaskName $gorevAdi -Action $eylem -Trigger $tetikler `
    -Principal $kimlik -Settings $ayar -Description 'Boşta ve kopuk RDP oturumlarını kapatır' -Force

# Hemen bir kez çalıştırıp sonucu kontrol edin
Start-ScheduledTask -TaskName $gorevAdi
Start-Sleep -Seconds 5
Get-ScheduledTaskInfo -TaskName $gorevAdi | Select-Object LastRunTime, LastTaskResult, NextRunTime

LastTaskResult değeri 0 ise görev hatasız tamamlanmıştır. Bekleme süresi nedeniyle görev hâlâ çalışıyorsa 267009 görürsünüz; birkaç dakika sonra tekrar bakın. Ardından günlük dosyasında bu çalışmanın satırlarını arayın. Görevi kaldırmak için:

powershell
Unregister-ScheduledTask -TaskName 'RDP Oturum Temizleme' -Confirm:$false

Mesai içinde de temizlik istiyorsanız ikinci bir görev tanımlayın ama yalnızca kopuk oturumları hedefleyin: -BostaDakika değerini çok yüksek (ör. 100000) vererek boşta aktif oturumları devre dışı bırakabilirsiniz.

Kalıcı çözüm: Grup İlkesi ile oturum süre sınırları

Betik görünürlük ve esneklik sağlar. Windows'un kendi süre sınırları ise her an çalışır ve betiğe ihtiyaç duymaz. İkisini birlikte kullanmak mantıklıdır: ilke tabanı belirler, betik raporlar ve istisnaları yönetir.

Ayarlar şu yoldadır: Bilgisayar Yapılandırması > Yönetim Şablonları > Windows Bileşenleri > Uzak Masaüstü Hizmetleri > Uzak Masaüstü Oturumu Ana Bilgisayarı > Oturum Zaman Sınırları. Alan denetleyicisi yoksa aynı ayarları yerel ilke düzenleyicisinde (gpedit.msc) yapabilirsiniz.

  • Bağlantısı kesilmiş oturumlar için zaman sınırı ayarla: Kopuk oturum bu süre sonunda kapatılır. 30 dakika ile 2 saat arası çoğu ofis için makul bir başlangıçtır.
  • Etkin ama boşta olan oturumlar için zaman sınırı ayarla: Boşta oturum bu süre sonunda kesilir. Aşağıdaki ayar etkin değilse oturum kapanmaz, kopuk duruma geçer ve bir önceki sınır devreye girer.
  • Zaman sınırlarına ulaşıldığında oturumu sonlandır: Etkinleştirilirse sınır aşıldığında oturum kopuk kalmak yerine kapatılır.

İlkenin uygulandığını kontrol etmek için gpupdate /force sonrası kayıt defterine bakın. Değerler milisaniye cinsindendir (30 dakika = 1.800.000):

powershell
Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -ErrorAction SilentlyContinue |
    Select-Object MaxDisconnectionTime, MaxIdleTime, fResetBroken

Komut boş dönüyorsa ilke henüz uygulanmamıştır. Toplu oturum kapatmanın komut satırı yöntemleri için Microsoft'un tüm Uzak Masaüstü kullanıcılarının oturumunu kapatma belgesine de bakabilirsiniz.

Sık yapılan hatalar

Yönetici oturumunu kapatmak. Bakım sırasında kendi oturumunuzu ya da uzun süren bir kurulumu bekleyen yönetici oturumunu kapatmak işi yarıda bırakır. Betik kendi oturumunu atlar, ama başka bir yönetici hesabını -Haric listesine eklemeyi unutmayın.

Kaydedilmemiş iş kaybı. logoff programları kapatır; kaydedilmemiş belge ya da yarım kalmış fiş kaybolur. Veritabanında tamamlanmamış işlem genellikle geri alınır, ama kullanıcının ekrandaki girişi geri gelmez. Boşta aktif oturumlar için uyarı ve yeniden kontrol adımını atlamayın, eşikleri kısa tutmayın.

Gün sonu işlemlerinin ortasında kapatmak. Gece çalışan dönem kapanışı, toplu rapor ya da veri aktarımı bir kullanıcı oturumunda başlatıldıysa o oturum boşta görünür ama çalışıyordur. Bu işleri ayrılmış bir hesapla çalıştırıp hesabı hariç tutun ya da zamanlanmış görevi bu işlerin bitiş saatinden sonraya koyun.

Deneme kipini atlamak. İlk çalıştırmayı doğrudan -Uygula ile yapmak, quser çözümlemesindeki bir sorunu fark etmeden yanlış oturumları kapatmanıza neden olabilir. En az bir iş günü boyunca deneme günlüğünü okuyun.

Yerelleştirmeyi kontrol etmemek. Farklı dilde arayüze sahip sunucuda quser başlıkları ve durum sözcükleri değişebilir. "Çözümlenemeyen satır" uyarısı görürseniz düzenli ifadeyi o çıktıya göre uyarlayın.

Bu ayarları sıfırdan kurmak yerine çok kullanıcılı erişimi hazır bir yapı üzerinde başlatmak isterseniz uzak masaüstü çözümü sayfasındaki seçeneklere göz atabilirsiniz.

Sık sorulan sorular

Kopuk oturum ile oturumu kapatmak arasındaki fark nedir?

Kopuk oturumda kullanıcının programları sunucuda çalışmaya devam eder ve tekrar bağlandığında kaldığı yerden devam eder. Oturum kapatıldığında tüm programlar sonlanır ve bellek boşalır. RDP penceresindeki X düğmesi oturumu kopuk bırakır; kapatmak için Başlat menüsünden "Oturumu kapat" kullanılmalıdır.

Betik başka bir sunucudaki oturumları da kapatabilir mi?

Get-RdpOturum -Sunucu SUNUCUADI ile uzak sunucunun oturumları listelenebilir, ancak kapatma betiği logoff ve msg komutlarını yerel çalıştırır. Uzak sunucuda kapatma için logoff ID /server:SUNUCUADI biçimi gerekir. Daha güvenli yol, betiği her sunucuda kendi zamanlanmış göreviyle çalıştırmaktır.

Grup İlkesi varken betiğe yine de ihtiyaç var mı?

İlke tek başına yeterli olabilir. Betik ise kimin bağlı olduğunu raporlar, belirli hesapları hariç tutar, boşta kullanıcıya uyarı gönderip ekrana dönüp dönmediğini kontrol eder ve her işlemi günlüğe yazar. İlkenin yapamadığı bu ayrıntılar için betik tamamlayıcıdır.

Kullanıcı uyarıyı görmezse ne olur?

msg penceresi /TIME süresi kadar ekranda kalır. Kullanıcı bu sürede fareyi ya da klavyeyi kullanırsa boşta süresi sıfırlanır ve betik yeniden kontrolde oturumu kapatmaz. Hiç tepki yoksa oturum kapatılır; bu yüzden boşta eşiğini ofisin çalışma düzenine göre cömert tutun.

Hangi eşik değerleriyle başlamalıyım?

Kopuk oturumlar için 30 ile 60 dakika, boşta aktif oturumlar için 2 ile 4 saat genellikle güvenli bir başlangıçtır. Bir hafta boyunca günlükte kapatılan oturumları ve kullanıcı şikâyetlerini izleyip değerleri buna göre daraltın ya da genişletin.

Sonuç

RDP sunucu üzerinde oturum düzeni üç adımda kurulur: quser çıktısını nesneye çevirip kimin ne durumda olduğunu görün, kapatma betiğini önce deneme kipinde çalıştırıp günlüğü doğrulayın, ardından zamanlanmış görev ve Grup İlkesi süre sınırlarıyla işi otomatiğe bağlayın. Korunan hesap listesini ve eşikleri düzenli gözden geçirdiğinizde kopuk oturumlar bellek ve kilit sorunu yaratmayı bırakır.

  • #rdp
  • #uzak masaüstü
  • #powershell
  • #windows server
  • #oturum yönetimi
  • #zamanlanmış görev
  • #grup ilkesi

Yazar

Kurucu, sunucu.com.tr · Bulut altyapısı ve yapay zeka otomasyonları

sunucu.com.tr ve Sunucu UK'in kurucusu. Bulut altyapısı, sanallaştırma ve sunucu yönetimi üzerine çalışıyor; şirketlerin iş yazılımlarını, web sitelerini ve yapay zeka iş yüklerini güvenli sunuculara taşıyor. Blogdaki rehberler sahada karşılaşılan kurulum, güvenlik ve taşıma işlerinden derlenir; yazılar yapay zeka desteğiyle hazırlanır ve kaynaklarla doğrulanır.

Tüm yazılarıProfil