Linux Sunucularda CPU Limit Ayarları
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
- Örnek:
- 2. PowerShell ile Oturum Listeleme — Basit Yöntem
- 3. Daha Güçlü: Get-RDUserSession (RemoteDesktop modülü)
- 4. Uzaktan Çalışma: Invoke-Command ile Çoklu Sunucuda Listeleme
- 5. Otomatik Uyarı: Uzun Süreli veya Idle Oturumları Tespit Etme
- 6. Güvenli Oturum Sonlandırma: logoff ve PowerShell Yardımı
- 7. Kapsamlı Otomasyon Örneği: Idle Oturumları 15dk sonra Kapat
- 8. Güvenlik ve İzinler
- 9. Logging ve Denetim
- 10. Sonuç ve Öneriler
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.
- Kullanıcıya bildirim gönder (mesaj, e-posta veya RDP mesajı).
- Önce yumuşak sonlandırma: uygulama seviyesinde kapanma imkânı tanı (ör. kullanıcıya 5 dakika verin).
- Sert sonlandırma: gerekirse
logoff <ID> /server:SRVile 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.