Linux Sunucularda CPU Limit Ayarları

Linux Sunucularda CPU Limit Ayarları
Yazı Özetini Göster

PowerShell ile RDP Kullanıcılarını Listeleme ve Sonlandırma

Uzak Masaüstü (RDP) oturumlarının yönetimi, özellikle paylaşılan sunucularda ve uzaktan erişim senaryolarında kritik bir idari görevdir. Oturumları hızlıca listelemek, uzun süreli ya da yetkisiz bağlantıları tespit etmek ve gerektiğinde güvenli şekilde sonlandırmak için PowerShell güçlü ve otomatikleştirilebilir araçlar sunar. Bu rehberde hem tek sunucuda hem de birden fazla sunucuda RDP oturumlarını nasıl listeleyip sonlandıracağınızı, otomasyon örneklerini ve dikkat edilmesi gereken güvenlik noktalarını adım adım açıklayacağım.

1. Temel Komutlar: query, qwinsta, quser ve logoff

Windows ortamlarında klasik araçlar aşağıdaki gibidir:

  • qwinsta veya query session — Sunucuda aktif RDP oturumlarını listeler.
  • quser veya query user — Kullanıcı bazlı oturum bilgisi verir (kullanıcı, oturum ID, durum).
  • logoff <ID> — Belirtilen oturum ID’sini sonlandırır.

Örnek:

qwinsta /server:SRV01
quser /server:SRV01
logoff 2 /server:SRV01

2. PowerShell ile Oturum Listeleme — Basit Yöntem

PowerShell ile klasik araçların çıktısını okuyarak daha düzenli bir liste elde edebilirsiniz. Aşağıdaki örnek, yerel veya uzak bir sunucuda oturumları listeler:

# Yerel sunucuda oturumları listele (quser çıktısını parse ediyor)
$raw = quser 2>&1
$raw | ForEach-Object {
    if ($_ -match '^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\S+)') {
        [pscustomobject]@{
            User = $Matches[1]
            SessionName = $Matches[2]
            Id = $Matches[4]
            State = $Matches[6]
        }
    }
}

Bu yöntemle kullanıcı adı, oturum ID ve durum (Active, Disc, Idle) gibi alanları kolayca elde edebilirsiniz.

3. Daha Güçlü: Get-RDUserSession (RemoteDesktop modülü)

Eğer Remote Desktop Services rolü kullanıyorsanız, Get-RDUserSession cmdlet’i çok daha temiz sonuç verir. Uzak Desktop sunucularında bu modül kuruluysa aşağıdaki komut işe yarar:

Import-Module RemoteDesktop
Get-RDUserSession -ConnectionBroker "rdcb.contoso.local"

Bu çıktı kullanıcıyı, oturum ID’sini, oturum durumunu ve oturum süresini doğrudan verir — production RDS ortamlarında önerilir.

4. Uzaktan Çalışma: Invoke-Command ile Çoklu Sunucuda Listeleme

Birden fazla sunucuya aynı anda bakmak için Invoke-Command kullanabilirsiniz:

$servers = @('srv01','srv02','srv03')
Invoke-Command -ComputerName $servers -ScriptBlock {
    quser | Select-Object -Skip 1
} | ForEach-Object {
    # parse işlemi burada yapılır
}

Bu şekilde merkezi bir kontrol ile hangi sunucuda hangi kullanıcıların bağlı olduğunu hızlıca görebilirsiniz.

5. Otomatik Uyarı: Uzun Süreli veya Idle Oturumları Tespit Etme

Güvenlik veya maliyet yönetimi için belli bir süreden uzun açık kalan oturumları tespit edip bildirim göndermek faydalıdır:

# 1 saatten uzun idle oturumları tespit et ve e-posta at (örnek)
Invoke-Command -ComputerName srv01 -ScriptBlock {
    quser /server:$env:COMPUTERNAME | ForEach-Object {
        # parse ve idle süresini hesapla, eğer > 1:00 ise çıktıya ekle
    }
} | Where-Object { $_.IdleHours -ge 1 } | ForEach-Object {
    # Send-MailMessage ile yöneticiyi bilgilendir
}

6. Güvenli Oturum Sonlandırma: logoff ve PowerShell Yardımı

Oturum sonlandırırken kullanıcı verilerinin kaybolmaması için önce uyarı, sonra kademeli sonlandırma uygulanmalıdır.

  1. Kullanıcıya bildirim gönder (mesaj, e-posta veya RDP mesajı).
  2. Önce yumuşak sonlandırma: uygulama seviyesinde kapanma imkânı tanı (ör. kullanıcıya 5 dakika verin).
  3. Sert sonlandırma: gerekirse logoff <ID> /server:SRV ile oturumu kapatın.
# Uzak sunucuda belirli bir oturumu sonlandırma örneği
Invoke-Command -ComputerName srv01 -ScriptBlock {
    logoff 3
}

7. Kapsamlı Otomasyon Örneği: Idle Oturumları 15dk sonra Kapat

# Kural: 15dk idle olan oturumları kapat
$servers = @('srv01','srv02')
foreach ($s in $servers) {
  Invoke-Command -ComputerName $s -ScriptBlock {
    $quser = quser | Select-Object -Skip 1
    foreach ($line in $quser) {
      # parse: kullanıcı, id, state, idle time
      # örnek: eğer Idle >= 00:15 ve State -eq 'Disc' veya 'Active' ise logoff
      if ($idleMinutes -ge 15) { logoff $id }
    }
  }
}

Bu betik örneği gereksinime göre genişletilip test edilmelidir; canlı ortamlarda çalıştırmadan önce test sunucularında doğrulama şarttır.

8. Güvenlik ve İzinler

  • Oturumları listeleyip sonlandırmak için yönetici yetkisi veya uygun uzak izinlere sahip olmalısınız.
  • PowerShell Remoting (WinRM) güvenli şekilde yapılandırılmalı (HTTPS/Negotiate/Kerberos tercih edin).
  • Bu tür otomasyonları bir SOC veya IT Operasyon prosedürüyle ilişkilendirip audit loglarını saklayın.

9. Logging ve Denetim

Tüm logoff/terminate işlemlerini merkezi olarak kaydedin (Event Log veya SIEM). Örnek olarak:

# Log kaydı ekleme örneği
Write-EventLog -LogName Application -Source "RDP-Manager" -EventId 5001 -EntryType Information -Message "User X logged off from SRV01 by automation"

Bu kayıtlar VDS veya kurumsal sunucularınızda denetim amaçlı önemli veri sağlar.

10. Sonuç ve Öneriler

PowerShell ile RDP oturumlarını listelemek ve gerektiğinde güvenli biçimde sonlandırmak, hem operasyonel istikrar hem de güvenlik açısından önemlidir. Kısa özet olarak:

  • Basit ihtiyaçlar için quser/qwinsta ve logoff yeterlidir.
  • RDS ortamları için Get-RDUserSession tercih edin.
  • Çoklu sunucular ve otomasyon için Invoke-Command ve merkezi loglama kullanın.
  • Her zaman önce kullanıcı bilgilendirmesi yapın; otomatik sonlandırmaları kademeli uygulayın.

Bu yapılandırmaları kendi sunucularınızda test etmek ve ölçeklendirmek için HostLigo’nun Windows Rehberleri ve Premium VDS çözümlerinden yararlanabilirsiniz.

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer Yazılar