Sunucular Üzerinde Disconnected Durumdaki Oturumların SCCM ile Yönetilmesi ve Loglanması

Merhabalar,

Bu yazımda System Center Configuration Manager ile Terminal ve Sunucularımız üzerinde Disconnected olarak bulunan kullanıcı hesaplarının log off edilmesini otomatik olarak nasıl yapacağımıza değiniyor olacağım.

Bilindiği üzere Terminal sunucularımıza ve diğer sunucularımıza RDP yaparak erişen kullanıcılarımız alışkanlıklarından dolayı veya unutmalarından dolayı Log Off diyerek oturumlarını kapatmak yerine X yaparak Disconnect duruma düşüyorlar ki böylede oturumu kapattıklarını düşünüyorlar. Tabiki teknik tabanlı kişiler bunun doğru bir yol olmadığını gayet iyi biliyorlar.

Disconnect durumunda bulunan oturumlar arka planda çalıştırdıkları uygulamalar kapanmadığından sunucu kaynakları kullanmaya devam ederek bazı durumlarda performans sorunlarına bile sebebiyet verebiliyor. Veyahut Terminal sunucular bu durum lisans kontrolü işleminden dolayı erişim problemlerine sebebiyet verebiliyor.

Disconnect durumda bulunan kullanıcı oturumlarını yönetebilmenin farklı çözümleri bulunabiliyor. Bir çözümde System Center Configuration Manager ile gerçekleştiriyor olacağız.

Sunucu üzerine baktığımızda Disconnected olarak duran hesaplar olduğunu ve hala kaynak tüketimine devam ettiğini görebiliyoruz. Biz bu oturumların kapatılmasını ve kayıt altına alınmasını sağlıyor olacağız.

Bunun için SCCM 1706 veriyonu ile gelen Run Script özelliğini kullanıyor olacağız. Bu script’ de gerçekleşen operasyonu biraz aktarıyor olayım. Öncelikle script’ in dağıtımını gerçekleştirdiğimiz sunucu üzerinde Disconnected durumda bulunan kullanıcı oturumlarını algılayarak bir log dosyası oluşturacak ve oturumu kapatılan hesapları kayıt altına alacaktır.

disconnectedusers

#
# Uzak Masaustu Baglantisi Kesilmis Oturumlarin Temizlenmesi
# 
function Ensure-LogFilePath([string]$LogFilePath)
{
 if (!(Test-Path -Path $LogFilePath)) {New-Item $LogFilePath -ItemType directory >> $null}
}
 
function Write-Log([string]$message)
{
   Out-File -InputObject $message -FilePath $LogFile -Append
}
 
function Get-Sessions
{
   $queryResults = query session
   $starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
   foreach ($result in $queryResults)
   {
      try
      {
         if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME")
         {
            $starters.UserName = $result.indexof("USERNAME");
            $starters.ID = $result.indexof("ID");
            $starters.State = $result.indexof("STATE");
            $starters.Type = $result.indexof("TYPE");
            $starters.Device = $result.indexof("DEVICE");
            continue;
         }
 
         New-Object psobject -Property @{
            "SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
            "Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
            "ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
            "State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
            "Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
            "Device" = $result.Substring($starters.Device).trim()
         }
      } 
      catch 
      {
         $e = $_;
         Write-Log "HATA: " + $e.PSMessageDetails
      }
   }
}
 
Ensure-LogFilePath($ENV:LOCALAPPDATA + "\BaglantiKesikOturumlar")
$LogFile = $ENV:LOCALAPPDATA + "\BaglantiKesikOturumlar\" + "oturumlar_" + $([DateTime]::Now.ToString('yyyyMMdd')) + ".log"
 
[string]$IncludeStates = '^(Disc)$'
Write-Log -Message "Temizlenen Baglanti Kesik Oturumlar"
Write-Log -Message "============================="
$DisconnectedSessions = Get-Sessions | ? {$_.State -match $IncludeStates -and $_.UserName -ne ""} | Select ID, UserName
Write-Log -Message "Oturumu Kapatılan Oturumlar"
Write-Log -Message "-------------------"
foreach ($session in $DisconnectedSessions)
{
   logoff $session.ID
   Write-Log -Message $session.Username
}
Write-Log -Message " "
Write-Log -Message "Tamamlandi"

Hazırladığımız PowerShell script’ imizi SCCM Yönetim Konsolumuz içerisinde Software Library > Scripts’ e gelerek Create Script diyerek ekliyoruz.

Oluşturmuz olduğumuz PowerShell script’ imizi dağıtabilmek için Onaylamamız gerekmektedir. Bunun için yukarıda bulunan menüden Approve/Deny butonuna basarak onaylıyoruz.

Artık oluştumuş olduğumuz script’ imizi dağıtıyoruz. İlgili sunucu veya sunucu collection’ larımız üzerine sağ tıklayarak Run Script diyoruz ve ilgili script’ imizi dağıtmış oluyoruz.

Script dağıtımının sonunda Monitoring adımında script’ in çalışmasına yönelik bir çıktı sunmaktadır. Burada başarılı veya başarısız olan istekleri görebilirsiniz. Close diyerek bu sihirbazı kapatıyoruz.

Sunucumuz üzerine baktığımızda Disconnected olan oturumların Log Off edildiğini, oturumu kapatılan kullanıcıların oluşturulan bir log dosyasına yazıldığını görebilirsiniz.

System Center Configuration Manager ile Disconnected durumda bulunan kullanıcı oturumlarının başarılı bir şekilde kapatılmasını gerçekleştirebilirsiniz.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Twitter Auto Publish Powered By : XYZScripts.com