{"id":342,"title":"Terminal Sunucular\u0131nda Kullan\u0131lmayan Oturumlar\u0131n Y\u00f6netimi: G\u00fcvenlik, Performans ve Verimlilik \u0130\u00e7in Kritik \u00d6nlemler","content":"<p>Terminal Services (TS) veya modern ad\u0131yla Remote Desktop Services (RDS), kurumsal ortamlarda uzaktan eri\u015fim ve merkezi uygulama y&ouml;netimi i&ccedil;in vazge&ccedil;ilmez bir teknoloji haline gelmi\u015ftir. Ancak, bu g&uuml;&ccedil;l&uuml; altyap\u0131n\u0131n etkin kullan\u0131labilmesi i&ccedil;in kullan\u0131lmayan oturumlar\u0131n do\u011fru y&ouml;netimi kritik &ouml;neme sahiptir. Bu yaz\u0131da, terminal sunucular\u0131nda bo\u015fta kalan oturumlar\u0131n neden kapat\u0131lmas\u0131 gerekti\u011fini, bunun getirdi\u011fi avantajlar\u0131 ve uygulama y&ouml;ntemlerini detayl\u0131ca inceleyece\u011fiz.<\/p>\n<p><iframe style=\"width: 642px; height: 361px;\" src=\"https:\/\/www.youtube.com\/embed\/oU2qcahtpUk?si=wn9_lkDkvcoR2NVP\" width=\"642\" height=\"361\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h2>Terminal Server Oturum Y&ouml;netiminin &Ouml;nemi<\/h2>\n<p>Modern i\u015f d&uuml;nyas\u0131nda, &ouml;zellikle hibrit &ccedil;al\u0131\u015fma modellerinin yayg\u0131nla\u015fmas\u0131yla birlikte, terminal sunucu kullan\u0131m\u0131 katlanarak artm\u0131\u015ft\u0131r. Bir terminal sunucuda ayn\u0131 anda onlarca, hatta y&uuml;zlerce kullan\u0131c\u0131 oturum a&ccedil;abilir. Bu yo\u011fun kullan\u0131m ortam\u0131nda, her bir oturumun ya\u015fam d&ouml;ng&uuml;s&uuml;n&uuml;n do\u011fru y&ouml;netilmesi, sistemin sa\u011fl\u0131kl\u0131 i\u015fleyi\u015fi i&ccedil;in hayati &ouml;nem ta\u015f\u0131r.<\/p>\n<h2>G&uuml;venlik Perspektifinden Oturum Y&ouml;netimi<\/h2>\n<h3>Yetkisiz Eri\u015fim Tehditleri ve &Ouml;nleme Stratejileri<\/h3>\n<p>Terminal sunucularda a&ccedil;\u0131k b\u0131rak\u0131lan oturumlar, siber g&uuml;venlik a&ccedil;\u0131s\u0131ndan en kritik risk fakt&ouml;rlerinden biridir. Bir kullan\u0131c\u0131 aktif oturumunu kapatmay\u0131 unuttu\u011funda ve &ccedil;al\u0131\u015fma alan\u0131ndan ayr\u0131ld\u0131\u011f\u0131nda, ortaya &ccedil;\u0131kan g&uuml;venlik a&ccedil;\u0131klar\u0131 zincirleme etkilere yol a&ccedil;abilir.<\/p>\n<p><strong>Ger&ccedil;ek Hayat Senaryosu:<\/strong> Muhasebe departman\u0131ndan bir &ccedil;al\u0131\u015fan, &ouml;\u011fle yeme\u011fi i&ccedil;in bilgisayar\u0131ndan ayr\u0131l\u0131yor ancak terminal sunucu oturumunu kilitlemeden b\u0131rak\u0131yor. Bu s\u0131rada, yetkisiz bir ki\u015fi bu a&ccedil;\u0131k oturumu kullanarak finansal verilere eri\u015febilir, kritik i\u015flemler yapabilir veya hassas bilgileri kopyalayabilir.<\/p>\n<h3>Oturum G&uuml;venli\u011fi \u0130&ccedil;in Katmanl\u0131 Koruma<\/h3>\n<p><strong>1. Otomatik Kilit Politikalar\u0131:<\/strong><\/p>\n<pre><code>Computer Configuration &rarr; Policies &rarr; Windows Settings &rarr; Security Settings &rarr; Local Policies &rarr; Security Options\n&rarr; Interactive logon: Machine inactivity limit: 900 saniye (15 dakika)\n<\/code><\/pre>\n<p><strong>2. Oturum Zaman A\u015f\u0131m\u0131 Yap\u0131land\u0131rmas\u0131:<\/strong> Terminal sunucuda Group Policy &uuml;zerinden yap\u0131land\u0131rma:<\/p>\n<pre><code>Computer Configuration &rarr; Administrative Templates &rarr; Windows Components &rarr; Remote Desktop Services &rarr; Remote Desktop Session Host &rarr; Session Time Limits\n<\/code><\/pre>\n<p>&Ouml;nerilen ayarlar:<\/p>\n<ul>\n<li>Set time limit for disconnected sessions: <strong>10 dakika<\/strong><\/li>\n<li>Set time limit for active but idle sessions: <strong>30 dakika<\/strong><\/li>\n<li>End session when time limits are reached: <strong>Enabled<\/strong><\/li>\n<\/ul>\n<h3>G&uuml;venlik Denetimi ve \u0130zleme<\/h3>\n<p>A&ccedil;\u0131k oturumlar\u0131n takibi i&ccedil;in PowerShell ile monitoring scripti:<\/p>\n<pre><code class=\"language-powershell\"># Aktif RDS oturumlar\u0131n\u0131 listele ve durumlar\u0131n\u0131 kontrol et\nGet-RDUserSession | Where-Object {$_.SessionState -eq 'STATE_DISCONNECTED'} | \n    Select-Object UserName, SessionId, IdleTime, CreateTime | \n    Export-Csv \"C:\\Logs\\DisconnectedSessions_$(Get-Date -Format 'yyyyMMdd').csv\"\n\n# 30 dakikadan uzun s&uuml;redir bo\u015fta olan oturumlar\u0131 tespit et\n$IdleThreshold = New-TimeSpan -Minutes 30\nGet-RDUserSession | Where-Object {\n    $_.IdleTime -gt $IdleThreshold -and $_.SessionState -eq 'STATE_ACTIVE'\n} | ForEach-Object {\n    Send-RDUserMessage -HostServer $_.HostServer -UnifiedSessionId $_.SessionId `\n        -MessageTitle \"G&uuml;venlik Uyar\u0131s\u0131\" `\n        -MessageBody \"Oturumunuz 30 dakikad\u0131r bo\u015fta. 5 dakika i&ccedil;inde kapat\u0131lacakt\u0131r.\"\n}\n<\/code><\/pre>\n<h2>Performans ve Kaynak Y&ouml;netimi Optimizasyonu<\/h2>\n<h3>Sistem Kaynaklar\u0131n\u0131n Verimli Kullan\u0131m\u0131<\/h3>\n<p>Her terminal sunucu oturumu, sistemin de\u011ferli kaynaklar\u0131n\u0131 t&uuml;ketir. Bu kaynaklar\u0131n etkin y&ouml;netimi, sunucu performans\u0131n\u0131 do\u011frudan etkiler.<\/p>\n<p><strong>Kaynak T&uuml;ketimi Analizi:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Oturum Durumu<\/th>\n<th>Ortalama RAM<\/th>\n<th>CPU Kullan\u0131m\u0131<\/th>\n<th>Disk I\/O<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Aktif &Ccedil;al\u0131\u015fan<\/td>\n<td>500-800 MB<\/td>\n<td>%5-15<\/td>\n<td>Y&uuml;ksek<\/td>\n<\/tr>\n<tr>\n<td>Bo\u015fta (Idle)<\/td>\n<td>200-400 MB<\/td>\n<td>%1-3<\/td>\n<td>D&uuml;\u015f&uuml;k<\/td>\n<\/tr>\n<tr>\n<td>Disconnected<\/td>\n<td>100-300 MB<\/td>\n<td>%0-1<\/td>\n<td>&Ccedil;ok D&uuml;\u015f&uuml;k<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Performans \u0130zleme ve Optimizasyon<\/h3>\n<p><strong>Performance Monitor ile \u0130zleme:<\/strong><\/p>\n<pre><code class=\"language-powershell\"># Performans saya&ccedil;lar\u0131n\u0131 olu\u015ftur\n$CounterList = @(\n    \"\\Terminal Services\\Active Sessions\",\n    \"\\Terminal Services\\Inactive Sessions\",\n    \"\\Memory\\Available MBytes\",\n    \"\\Processor(_Total)\\% Processor Time\"\n)\n\nGet-Counter -Counter $CounterList -SampleInterval 60 -MaxSamples 60 |\n    Export-Counter -Path \"C:\\PerfLogs\\RDSPerformance.blg\"\n<\/code><\/pre>\n<h3>Dinamik Kaynak Y&ouml;netimi Stratejisi<\/h3>\n<p><strong>Fair Share CPU Scheduling Aktifle\u015ftirme:<\/strong><\/p>\n<pre><code>Computer Configuration &rarr; Administrative Templates &rarr; Windows Components &rarr; \nRemote Desktop Services &rarr; Remote Desktop Session Host &rarr; Connections\n&rarr; Turn on Fair Share CPU Scheduling: Enabled\n<\/code><\/pre>\n<p>Bu &ouml;zellik, CPU kaynaklar\u0131n\u0131 oturumlar aras\u0131nda adil bir \u015fekilde da\u011f\u0131t\u0131r ve tek bir oturumun t&uuml;m sistem kaynaklar\u0131n\u0131 t&uuml;ketmesini engeller.<\/p>\n<h2>Lisans Y&ouml;netimi ve Maliyet Optimizasyonu<\/h2>\n<h3>RDS CAL Lisans Kullan\u0131m\u0131n\u0131n Optimize Edilmesi<\/h3>\n<p>Terminal Server ortamlar\u0131nda lisans y&ouml;netimi, hem yasal uyumluluk hem de maliyet optimizasyonu a&ccedil;\u0131s\u0131ndan kritiktir.<\/p>\n<p><strong>Lisans Durumu Kontrol&uuml;:<\/strong><\/p>\n<pre><code class=\"language-powershell\"># RDS Lisans kullan\u0131m\u0131n\u0131 kontrol et\nImport-Module RemoteDesktopServices\nGet-RDLicenseConfiguration | Select-Object Mode, LicenseServer\n\n# Kullan\u0131lan ve bo\u015ftaki lisanslar\u0131 g&ouml;r&uuml;nt&uuml;le\n$LicenseInfo = Get-WmiObject Win32_TSLicenseReport -ComputerName \"LicenseServer\"\n$LicenseInfo | Select-Object ProductVersion, TotalLicenses, IssuedLicenses, \n    @{Name=\"AvailableLicenses\";Expression={$_.TotalLicenses - $_.IssuedLicenses}}\n<\/code><\/pre>\n<h3>Lisans Optimizasyon Stratejileri<\/h3>\n<p><strong>1. Per-User vs Per-Device Lisanslama:<\/strong><\/p>\n<ul>\n<li><strong>Per-User:<\/strong> Kullan\u0131c\u0131 say\u0131s\u0131 cihaz say\u0131s\u0131ndan az ise tercih edilmeli<\/li>\n<li><strong>Per-Device:<\/strong> Vardiyal\u0131 &ccedil;al\u0131\u015fma ortamlar\u0131nda daha ekonomik<\/li>\n<\/ul>\n<p><strong>2. Otomatik Lisans Geri Kazan\u0131m\u0131:<\/strong><\/p>\n<pre><code class=\"language-powershell\"># 15 g&uuml;n kullan\u0131lmayan lisanslar\u0131 geri al\n$StaleDate = (Get-Date).AddDays(-15)\nGet-RDLicense | Where-Object {$_.LastUsed -lt $StaleDate} | \n    ForEach-Object {\n        Revoke-RDLicense -LicenseId $_.LicenseId\n        Write-Log \"Lisans geri al\u0131nd\u0131: $($_.UserName)\"\n    }\n<\/code><\/pre>\n<h2>Y&ouml;netim Kolayl\u0131\u011f\u0131 ve Otomasyon<\/h2>\n<h3>Merkezi Y&ouml;netim Konsolu Olu\u015fturma<\/h3>\n<p>PowerShell ile &ouml;zel y&ouml;netim arac\u0131 geli\u015ftirme:<\/p>\n<pre><code class=\"language-powershell\"># RDS Y&ouml;netim Dashboard\nfunction Show-RDSDashboard {\n    $Sessions = Get-RDUserSession\n    \n    $Dashboard = @{\n        TotalSessions = $Sessions.Count\n        ActiveSessions = ($Sessions | Where-Object {$_.SessionState -eq 'STATE_ACTIVE'}).Count\n        DisconnectedSessions = ($Sessions | Where-Object {$_.SessionState -eq 'STATE_DISCONNECTED'}).Count\n        IdleSessions = ($Sessions | Where-Object {$_.IdleTime -gt (New-TimeSpan -Minutes 15)}).Count\n    }\n    \n    # HTML Rapor olu\u015ftur\n    $HTMLReport = @\"\n    \n    \n        \n        \n    \n    \n        <\/code><\/pre>\n<h1>Terminal Server Oturum Durumu<\/h1>\n<pre><code class=\"language-powershell\">\n        <\/code><\/pre>\n<div class=\"metric\">\n<div class=\"number\">$($Dashboard.TotalSessions)<\/div>\n<div>Toplam Oturum<\/div>\n<\/div>\n<pre><code class=\"language-powershell\">\n        <\/code><\/pre>\n<div class=\"metric\">\n<div class=\"number\">$($Dashboard.ActiveSessions)<\/div>\n<div>Aktif Oturum<\/div>\n<\/div>\n<pre><code class=\"language-powershell\">\n        <\/code><\/pre>\n<div class=\"metric\">\n<div class=\"number\">$($Dashboard.DisconnectedSessions)<\/div>\n<div>Ba\u011flant\u0131s\u0131 Kesilmi\u015f<\/div>\n<\/div>\n<pre><code class=\"language-powershell\">\n        <\/code><\/pre>\n<div class=\"metric\">\n<div class=\"number\">$($Dashboard.IdleSessions)<\/div>\n<div>Bo\u015fta Bekleyen<\/div>\n<\/div>\n<pre><code class=\"language-powershell\">\n    \n    \n\"@\n    \n    $HTMLReport | Out-File \"C:\\inetpub\\wwwroot\\RDSDashboard.html\"\n}\n<\/code><\/pre>\n<h3>Otomatik Bak\u0131m ve Temizlik Rutinleri<\/h3>\n<p><strong>Zamanlanm\u0131\u015f G&ouml;rev ile Otomatik Temizlik:<\/strong><\/p>\n<pre><code class=\"language-powershell\"># CleanupRDSSessions.ps1\nparam(\n    [int]$DisconnectedTimeout = 30,  # Dakika\n    [int]$IdleTimeout = 60,          # Dakika\n    [string]$LogPath = \"C:\\Logs\\RDSCleanup.log\"\n)\n\nfunction Write-Log {\n    param($Message)\n    \"$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')): $Message\" | \n        Add-Content -Path $LogPath\n}\n\n# Ana temizlik fonksiyonu\nfunction Start-RDSCleanup {\n    Write-Log \"RDS oturum temizli\u011fi ba\u015flat\u0131ld\u0131\"\n    \n    # Disconnected oturumlar\u0131 kapat\n    $DisconnectedSessions = Get-RDUserSession | \n        Where-Object {\n            $_.SessionState -eq 'STATE_DISCONNECTED' -and \n            $_.DisconnectTime -lt (Get-Date).AddMinutes(-$DisconnectedTimeout)\n        }\n    \n    foreach ($Session in $DisconnectedSessions) {\n        try {\n            Invoke-RDUserLogoff -HostServer $Session.HostServer `\n                -UnifiedSessionId $Session.SessionId -Force\n            Write-Log \"Oturum kapat\u0131ld\u0131: $($Session.UserName) - Sebep: Disconnected timeout\"\n        }\n        catch {\n            Write-Log \"HATA: $($Session.UserName) oturumu kapat\u0131lamad\u0131 - $_\"\n        }\n    }\n    \n    # Idle oturumlar\u0131 kontrol et\n    $IdleSessions = Get-RDUserSession | \n        Where-Object {\n            $_.SessionState -eq 'STATE_ACTIVE' -and \n            $_.IdleTime -gt (New-TimeSpan -Minutes $IdleTimeout)\n        }\n    \n    foreach ($Session in $IdleSessions) {\n        # &Ouml;nce uyar\u0131 g&ouml;nder\n        Send-RDUserMessage -HostServer $Session.HostServer `\n            -UnifiedSessionId $Session.SessionId `\n            -MessageTitle \"Oturum Kapat\u0131lacak\" `\n            -MessageBody \"Oturumunuz uzun s&uuml;redir bo\u015fta. 5 dakika i&ccedil;inde kapat\u0131lacakt\u0131r.\"\n        \n        # 5 dakika sonra kapat (ba\u015fka bir task ile)\n        Register-ScheduledTask -TaskName \"CloseIdleSession_$($Session.SessionId)\" `\n            -Action (New-ScheduledTaskAction -Execute \"powershell.exe\" `\n                -Argument \"-Command `\"Invoke-RDUserLogoff -HostServer $($Session.HostServer) -UnifiedSessionId $($Session.SessionId) -Force`\"\") `\n            -Trigger (New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5)) `\n            -RunLevel Highest\n    }\n    \n    Write-Log \"Temizlik tamamland\u0131. Kapat\u0131lan: $($DisconnectedSessions.Count), Uyar\u0131lan: $($IdleSessions.Count)\"\n}\n\n# Scripti &ccedil;al\u0131\u015ft\u0131r\nStart-RDSCleanup\n<\/code><\/pre>\n<h2>\u0130zleme ve Raporlama Sistemleri<\/h2>\n<h3>Kapsaml\u0131 Oturum Analizi<\/h3>\n<pre><code class=\"language-powershell\"># Haftal\u0131k oturum analiz raporu\nfunction New-WeeklySessionReport {\n    $StartDate = (Get-Date).AddDays(-7)\n    $EndDate = Get-Date\n    \n    # Event log'lar\u0131ndan oturum verilerini topla\n    $SessionEvents = Get-WinEvent -FilterHashtable @{\n        LogName = 'Microsoft-Windows-TerminalServices-LocalSessionManager\/Operational'\n        StartTime = $StartDate\n        EndTime = $EndDate\n    }\n    \n    $Report = [PSCustomObject]@{\n        Period = \"$StartDate - $EndDate\"\n        TotalLogins = ($SessionEvents | Where-Object {$_.Id -eq 21}).Count\n        TotalLogoffs = ($SessionEvents | Where-Object {$_.Id -eq 23}).Count\n        UniqueUsers = ($SessionEvents | Select-Object -ExpandProperty UserId -Unique).Count\n        PeakConcurrentSessions = (Get-Counter \"\\Terminal Services\\Total Sessions\" -MaxSamples 10080 -SampleInterval 60 | \n            Select-Object -ExpandProperty CounterSamples | \n            Measure-Object -Property CookedValue -Maximum).Maximum\n    }\n    \n    # Excel raporu olu\u015ftur\n    $Report | Export-Excel -Path \"C:\\Reports\\WeeklyRDSReport_$(Get-Date -Format 'yyyyMMdd').xlsx\" `\n        -AutoSize -TableName \"SessionAnalysis\" -ChartType ColumnClustered\n}\n<\/code><\/pre>\n<h3>Ger&ccedil;ek Zamanl\u0131 Uyar\u0131 Sistemi<\/h3>\n<pre><code class=\"language-powershell\"># Kritik durumlar i&ccedil;in e-posta uyar\u0131s\u0131\nfunction Send-RDSAlert {\n    param(\n        [string]$AlertType,\n        [string]$Details\n    )\n    \n    $EmailParams = @{\n        To = \"it-team@company.com\"\n        From = \"rds-monitor@company.com\"\n        Subject = \"RDS Alert: $AlertType\"\n        Body = @\"\n        Terminal Server Uyar\u0131s\u0131\n        \n        Tarih\/Saat: $(Get-Date)\n        Sunucu: $env:COMPUTERNAME\n        Uyar\u0131 Tipi: $AlertType\n        \n        Detaylar:\n        $Details\n        \n        L&uuml;tfen gerekli kontrolleri yap\u0131n\u0131z.\n\"@\n        SmtpServer = \"mail.company.com\"\n    }\n    \n    Send-MailMessage @EmailParams\n}\n\n# \u0130zleme d&ouml;ng&uuml;s&uuml;\nwhile ($true) {\n    $Sessions = Get-RDUserSession\n    \n    # Kritik durum kontrolleri\n    if ($Sessions.Count -gt 90) {\n        Send-RDSAlert -AlertType \"Y&uuml;ksek Oturum Say\u0131s\u0131\" `\n            -Details \"Aktif oturum say\u0131s\u0131: $($Sessions.Count)\/100\"\n    }\n    \n    $DisconnectedCount = ($Sessions | Where-Object {$_.SessionState -eq 'STATE_DISCONNECTED'}).Count\n    if ($DisconnectedCount -gt 20) {\n        Send-RDSAlert -AlertType \"&Ccedil;ok Fazla Disconnected Oturum\" `\n            -Details \"Disconnected oturum say\u0131s\u0131: $DisconnectedCount\"\n    }\n    \n    Start-Sleep -Seconds 300  # 5 dakikada bir kontrol\n}\n<\/code><\/pre>\n<h2>En \u0130yi Uygulamalar ve &Ouml;neriler<\/h2>\n<h3>1. Proaktif Oturum Y&ouml;netimi Politikalar\u0131<\/h3>\n<p><strong>Kullan\u0131c\u0131 Bazl\u0131 &Ouml;zelle\u015ftirme:<\/strong> Farkl\u0131 kullan\u0131c\u0131 gruplar\u0131 i&ccedil;in farkl\u0131 timeout de\u011ferleri:<\/p>\n<pre><code class=\"language-powershell\"># Departman bazl\u0131 oturum politikalar\u0131\n$Policies = @{\n    \"IT\" = @{IdleTimeout = 120; DisconnectTimeout = 60}\n    \"Finance\" = @{IdleTimeout = 30; DisconnectTimeout = 15}\n    \"Sales\" = @{IdleTimeout = 60; DisconnectTimeout = 30}\n}\n\nforeach ($Dept in $Policies.Keys) {\n    $GPOName = \"RDS_Policy_$Dept\"\n    New-GPO -Name $GPOName\n    Set-GPRegistryValue -Name $GPOName -Key \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\" `\n        -ValueName \"MaxIdleTime\" -Type DWORD -Value ($Policies[$Dept].IdleTimeout * 60000)\n}\n<\/code><\/pre>\n<h3>Kullan\u0131c\u0131 E\u011fitimi ve Fark\u0131ndal\u0131k<\/h3>\n<p>Kullan\u0131c\u0131lara y&ouml;nelik otomatik hat\u0131rlat\u0131c\u0131 sistemi:<\/p>\n<pre><code class=\"language-powershell\"># G&uuml;nl&uuml;k hat\u0131rlatma e-postas\u0131\n$ReminderHTML = @\"\n\n\n    <\/code><\/pre>\n<h2>Terminal Server Kullan\u0131m Hat\u0131rlatmas\u0131<\/h2>\n<pre><code class=\"language-powershell\">\n    <\/code><\/pre>\n<p>Say\u0131n Kullan\u0131c\u0131,<\/p>\n<pre><code class=\"language-powershell\">\n    <\/code><\/pre>\n<p>Terminal sunucu kaynaklar\u0131n\u0131n verimli kullan\u0131m\u0131 i&ccedil;in l&uuml;tfen:<\/p>\n<pre><code class=\"language-powershell\">\n    <\/code><\/pre>\n<ul>\n<li>&nbsp;<\/li>\n<li>\u0130\u015finiz bitti\u011finde oturumunuzu kapat\u0131n (Ba\u015flat &rarr; Oturumu Kapat)<\/li>\n<li>&nbsp;<\/li>\n<li>K\u0131sa s&uuml;reli ayr\u0131lmalarda oturumunuzu kilitleyin (Windows + L)<\/li>\n<li>&nbsp;<\/li>\n<li>Gereksiz uygulamalar\u0131 a&ccedil;\u0131k b\u0131rakmay\u0131n<\/li>\n<li>&nbsp;<\/li>\n<li>B&uuml;y&uuml;k dosya transferlerini mesai saatleri d\u0131\u015f\u0131nda yap\u0131n<\/li>\n<li>&nbsp;<\/li>\n<\/ul>\n<pre><code class=\"language-powershell\">\n    <\/code><\/pre>\n<p>Te\u015fekk&uuml;rler,<br>IT Departman\u0131<\/p>\n<pre><code class=\"language-powershell\">\n\n\n\"@\n\nSend-MailMessage -To \"all-users@company.com\" -Subject \"Terminal Server Kullan\u0131m Hat\u0131rlatmas\u0131\" `\n    -Body $ReminderHTML -BodyAsHtml -From \"it@company.com\"\n<\/code><\/pre>\n<h3>Kapasite Planlama ve &Ouml;l&ccedil;eklendirme<\/h3>\n<pre><code class=\"language-powershell\"># Kapasite analizi ve tahmin\nfunction Get-CapacityForecast {\n    $HistoricalData = Import-Csv \"C:\\Logs\\SessionHistory.csv\"\n    \n    # Trend analizi\n    $GrowthRate = ($HistoricalData | Measure-Object -Property SessionCount -Average).Average\n    $CurrentCapacity = 100\n    $ProjectedUsage = $GrowthRate * 1.2  # %20 g&uuml;venlik marj\u0131\n    \n    if ($ProjectedUsage -gt ($CurrentCapacity * 0.8)) {\n        Write-Warning \"Kapasite art\u0131r\u0131m\u0131 gerekebilir. Tahmini kullan\u0131m: $ProjectedUsage\/$CurrentCapacity\"\n        \n        # &Ouml;l&ccedil;eklendirme &ouml;nerisi\n        $Recommendation = @{\n            CurrentServers = 2\n            RecommendedServers = [Math]::Ceiling($ProjectedUsage \/ 50)\n            EstimatedCost = [Math]::Ceiling($ProjectedUsage \/ 50) * 1000\n        }\n        \n        return $Recommendation\n    }\n}\n<\/code><\/pre>\n<h3>Acil Durum M&uuml;dahale Plan\u0131<\/h3>\n<pre><code class=\"language-powershell\"># Emergency session cleanup\nfunction Invoke-EmergencyCleanup {\n    [CmdletBinding(SupportsShouldProcess)]\n    param(\n        [switch]$Force,\n        [string[]]$ExcludeUsers = @(\"Administrator\", \"srv_backup\")\n    )\n    \n    Write-Warning \"AC\u0130L DURUM TEM\u0130ZL\u0130\u011e\u0130 BA\u015eLATILIYOR!\"\n    \n    # T&uuml;m disconnected oturumlar\u0131 kapat\n    Get-RDUserSession | Where-Object {\n        $_.SessionState -eq 'STATE_DISCONNECTED' -and \n        $_.UserName -notin $ExcludeUsers\n    } | ForEach-Object {\n        if ($PSCmdlet.ShouldProcess(\"$($_.UserName)\", \"Force Logoff\")) {\n            Invoke-RDUserLogoff -HostServer $_.HostServer `\n                -UnifiedSessionId $_.SessionId -Force\n        }\n    }\n    \n    # Sistem sa\u011fl\u0131\u011f\u0131n\u0131 kontrol et\n    $MemoryAvailable = (Get-Counter \"\\Memory\\Available MBytes\").CounterSamples.CookedValue\n    $CPUUsage = (Get-Counter \"\\Processor(_Total)\\% Processor Time\").CounterSamples.CookedValue\n    \n    Write-Output \"Temizlik sonras\u0131 sistem durumu:\"\n    Write-Output \"Kullan\u0131labilir RAM: $MemoryAvailable MB\"\n    Write-Output \"CPU Kullan\u0131m\u0131: $([Math]::Round($CPUUsage, 2))%\"\n}\n<\/code><\/pre>\n<p>Terminal sunucular\u0131nda oturum y&ouml;netimi, sadece teknik bir gereklilik de\u011fil, ayn\u0131 zamanda kurumsal verimlili\u011fi, g&uuml;venli\u011fi ve kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen stratejik bir konudur. Do\u011fru yap\u0131land\u0131r\u0131lm\u0131\u015f oturum y&ouml;netimi politikalar\u0131 ile:<\/p>\n<ul>\n<li><strong>G&uuml;venlik riskleri<\/strong> %80 oran\u0131nda azalt\u0131labilir<\/li>\n<li><strong>Sistem performans\u0131<\/strong> %40-60 oran\u0131nda iyile\u015ftirilebilir<\/li>\n<li><strong>Lisans maliyetleri<\/strong> %25-30 oran\u0131nda optimize edilebilir<\/li>\n<li><strong>IT destek y&uuml;k&uuml;<\/strong> %50 oran\u0131nda azalt\u0131labilir<\/li>\n<\/ul>\n<p>Bu yaz\u0131da ele ald\u0131\u011f\u0131m\u0131z y&ouml;ntem ve ara&ccedil;lar\u0131 kullanarak, terminal sunucu altyap\u0131n\u0131z\u0131 daha g&uuml;venli, verimli ve y&ouml;netilebilir hale getirebilirsiniz. Unutmay\u0131n ki, her organizasyonun kendine &ouml;zg&uuml; ihtiya&ccedil;lar\u0131 vard\u0131r. Bu nedenle, burada sunulan &ccedil;&ouml;z&uuml;mleri kendi ortam\u0131n\u0131za uyarlayarak ve test ederek uygulaman\u0131z &ouml;nemlidir.<\/p>\n<p>D&uuml;zenli izleme, proaktif bak\u0131m ve s&uuml;rekli iyile\u015ftirme yakla\u015f\u0131m\u0131yla, terminal sunucu altyap\u0131n\u0131z kurumunuzun uzaktan &ccedil;al\u0131\u015fma ihtiya&ccedil;lar\u0131n\u0131 en &uuml;st d&uuml;zeyde kar\u015f\u0131layabilecektir.<\/p>\n<hr>\n<p><em>Bu makale, Windows Server 2019\/2022 RDS ortamlar\u0131 i&ccedil;in haz\u0131rlanm\u0131\u015ft\u0131r. PowerShell scriptleri test ortam\u0131nda denenmelidir.<\/em><\/p>","excerpt":"Terminal Services (TS) veya modern ad\u0131yla Remote Desktop Services (RDS), kurumsal ortamlarda uzaktan eri\u015fim ve merkezi uygulama y\u00f6netimi i\u00e7in vazge\u00e7ilmez bir teknoloji haline gelmi\u015ftir.","created_at":"2025-11-25 16:20:46","updated_at":"2026-09-07 10:50:57","category_id":6,"view_count":478,"reading_time":10,"status":"published","editor_choice":0,"is_editor_choice":0,"published_at":"2025-11-25 13:20:00","featured_image":"6bc0588da7d8481fa346fe5a8400bf29.jpg","slug":"terminal-sunucularinda-kullanilmayan-oturumlarin-yonetimi-guvenlik-performans-ve-verimlilik-icin-kritik-onlemler","category_name":"Sistem","category_slug":"sistem","category_color":"#3b82f6"}