FSLogix: Sanal Masaüstü Ortamlarında Profil Yönetimi

FSLogix: Sanal Masaüstü Ortamlarında Profil Yönetimi

FSLogix Nedir? Sanal Masaüstü (VDI) Performansını Devrimleştiren Teknoloji

Modern iş dünyasında, uzaktan çalışma ve sanal masaüstü altyapıları (VDI) artık bir lüks değil, bir zorunluluk haline geldi. Ancak geleneksel VDI çözümlerinde kullanıcı profilleri, oturum açma süreleri ve uygulama performansı konusunda sıkıntılar yaşanabiliyordu. İşte tam bu noktada **FSLogix** devreye giriyor.

Peki, nedir bu FSLogix ve neden özellikle Microsoft'un bulut tabanlı sanal masaüstü hizmeti Windows 365 (Cloud PC) ve Azure Virtual Desktop (AVD) için bu kadar kritik bir rol oynuyor? Gelin, bu güçlü teknolojiyi her yönüyle inceleyelim.

FSLogix'in Kısa Tarihçesi ve Microsoft'a Katılımı

FSLogix, başlangıçta bağımsız bir şirket olarak, VDI dünyasındaki en inatçı sorunlardan biri olan kullanıcı profili yönetimini çözmek için kuruldu. 2018 yılında Microsoft tarafından satın alınması, teknolojinin ne kadar değerli olduğunun bir göstergesiydi. Bu satın almanın ardından Microsoft, FSLogix'i **Azure Virtual Desktop** ve **Windows 365** müşterileri için **ücretsiz** olarak sunmaya başladı. Artık FSLogix, modern Microsoft bulut masaüstü ekosisteminin ayrılmaz ve standart bir parçası haline geldi.

FSLogix Tam Olarak Nedir?

**FSLogix**, sanal masaüstü ortamlarında kullanıcı deneyimini kökten iyileştiren bir **profil konteynerleme çözümüdür**. Temel amacı, kullanıcının profilini (masaüstü, belgeler, uygulama ayarları, geçici dosyalar vb.) uzak bir sunucuda barındırılan sanal bir sabit disk (.VHDX) dosyası içinde dinamik olarak taşımaktır.

Basit bir benzetme yapmak gerekirse: FSLogix, kullanıcıya özel her şeyi (kişiselleştirilmiş ofis düzeniniz, tarayıcı yer imleriniz, Outlook imzanız gibi) taşınabilir bir "bavul"a koyar. Hangi sanal bilgisayara (Cloud PC'ye) giderseniz gidin, bu bavul sizinle birlikte gelir ve her şey tanıdık geldiği gibi, anında hazır olur.

FSLogix Neden Bu Kadar Önemli? Geleneksel Yöntemlerle Farkı

FSLogix'in değerini anlamak için, çözdüğü problemlere bakmak gerekir:

1. **Oturum Açma Sürelerinde Müthiş İyileşme**
Geleneksel profil çözümlerinde (UPD - UE-V gibi), kullanıcı oturum açtığında tüm profil dosyaları ağ üzerinden yüklenir. Bu, özellikle büyük profillere sahip kullanıcılar için uzun dakikalar sürebilir. FSLogix'te ise profil bir VHDX dosyası olarak saklanır ve oturum açma sırasında bu dosya, kullanıcının sanal makinesine sanal bir disk olarak bağlanır. Veri transferi değil, bağlama işlemi olduğu için oturum açma süreleri **saniyeler** seviyesine iner.

2. **Performans ve Uyumluluk**
Bazı uygulamalar (özellikle Microsoft Office, OneDrive ve tarayıcılar) profil içinde sürekli okuma/yazma işlemi yapar. Geleneksel yöntemlerde bu, ağ gecikmesi ve yüküne neden olur, uygulamalar yavaşlar hatta çöker. FSLogix, profili yerel bir disk gibi bağladığı için uygulamalar, sanki fiziksel bir bilgisayarda çalışıyormuş gibi yüksek performansla çalışır. Bu, **Office 365** performansı için özellikle hayati öneme sahiptir.

3. **Profil Bütünlüğü ve Güvenilirlik**
Geleneksel yöntemlerde profil kilitlenmeleri ve bozulmaları sık yaşanırdı. FSLogix'in konteyner yapısı, profilin tutarlı ve sağlam kalmasını sağlar, veri kaybı riskini en aza indirir.

4. **Daha Kolay Yönetim**
BT yöneticileri için profil boyut sınırlaması, disk yönetimi ve yedekleme stratejileri oluşturmak çok daha kolay hale gelir.

FSLogix Bileşenleri Nelerdir?

FSLogix çözümü birkaç temel bileşenden oluşur:

*   **FSLogix Apps**: Ana uygulamadır. Profil konteynerlerini yönetir.
*   **FSLogix Cloud Cache**: Profilin birden fazla konumda (örneğin, iki farklı Azure Depolama Alanı) eşzamanlı olarak tutulmasını sağlar. Bu, yüksek kullanılabilirlik (High Availability) sunar; bir depolama alanı erişilemez olsa bile kullanıcı oturum açmaya devam edebilir.
*   **Office Container**: Özellikle Outlook verilerini (OST dosyası) ayrı bir konteynerde saklayarak performansı daha da artırmak ve profil boyutunu kontrol altında tutmak için kullanılır.
*   **Application Masking (Uygulama Maskeleme)**: Kullanıcılara veya gruplara göre hangi uygulamaların görüneceğini dinamik olarak yönetmeye yarar.

FSLogix Hangi Senaryolarda Kullanılır?

*   **Azure Virtual Desktop (AVD)**
*   **Windows 365 (Cloud PC)**
*   **VMware Horizon**
*   **Citrix Virtual Apps and Desktops**

Neden FSLogix Kullanmalısınız?

FSLogix, sanal masaüstü deneyimini "sorunlu" olmaktan çıkarıp "kusursuz" bir hale getiren bir teknolojidir. Kullanıcı memnuniyetini artırır, BT departmanının iş yükünü hafifletir ve bulut maliyetlerinin öngörülebilir olmasına yardımcı olur. Özellikle Microsoft ekosisteminde çalışıyorsanız ve AVD/Windows 365 kullanıyorsanız, FSLogix artık olmazsa olmaz, standart bir yapı taşıdır.

Kısacası, FSLogix, VDI dünyasında uzun süredir aranan "**kesintisiz, hızlı ve kişiselleştirilmiş kullanıcı deneyimi**"nin anahtarını sunuyor.

---

**Not:** Bu blog yazısı, FSLogix'in temel konseptlerini açıklamak için hazırlanmıştır. Ürün yapılandırması ve lisanslama detayları için her zaman resmi [Microsoft FSLogix dokümantasyonunu](https://docs.microsoft.com/en-us/fslogix/) kontrol etmeniz önerilir.

FSLogix Kurulum ve Yapılandırma Scripti


Tüm RDS sunucularında çalıştırın

Requires -RunAsAdministrator

1. FSLogix İndir (En son sürüm için Microsoft sitesinden manuel indirin)
https://aka.ms/fslogix_download

# Değişkenler - BUNLARI KENDİ ORTAMINIZA GÖRE DEĞİŞTİRİN


$FSLogixInstaller = "C:\Temp\FSLogixAppsSetup.exe"
$ProfileShare = "\\FileServer\FSLogixProfiles$"  # UNC path
$VHDLocation = $ProfileShare

# 2. FSLogix Kurulumu
Write-Host "FSLogix kuruluyor..." -ForegroundColor Green
if (Test-Path $FSLogixInstaller) {
    Start-Process -FilePath $FSLogixInstaller -ArgumentList "/install /quiet /norestart" -Wait
    Write-Host "FSLogix kuruldu!" -ForegroundColor Green
} else {
    Write-Host "HATA: FSLogix installer bulunamadı: $FSLogixInstaller" -ForegroundColor Red
    Write-Host "Lütfen https://aka.ms/fslogix_download adresinden indirin" -ForegroundColor Yellow
    exit
}

# 3. Registry Ayarları
Write-Host "Registry ayarları yapılıyor..." -ForegroundColor Green

$RegPath = "HKLM:\SOFTWARE\FSLogix\Profiles"

# Registry path oluştur
if (!(Test-Path $RegPath)) {
    New-Item -Path $RegPath -Force | Out-Null
}

# Temel Ayarlar
Set-ItemProperty -Path $RegPath -Name "Enabled" -Value 1 -Type DWord
Set-ItemProperty -Path $RegPath -Name "VHDLocations" -Value $VHDLocation -Type MultiString

# VHD Ayarları
Set-ItemProperty -Path $RegPath -Name "SizeInMBs" -Value 30000 -Type DWord  # 30GB
Set-ItemProperty -Path $RegPath -Name "IsDynamic" -Value 1 -Type DWord  # Dynamic VHD
Set-ItemProperty -Path $RegPath -Name "VolumeType" -Value "VHDX" -Type String

# Performans Optimizasyonları
Set-ItemProperty -Path $RegPath -Name "FlipFlopProfileDirectoryName" -Value 1 -Type DWord
Set-ItemProperty -Path $RegPath -Name "PreventLoginWithFailure" -Value 0 -Type DWord  # Profil yüklenemezse local profil kullan
Set-ItemProperty -Path $RegPath -Name "PreventLoginWithTempProfile" -Value 0 -Type DWord

# Eşzamanlı Oturum Ayarları
Set-ItemProperty -Path $RegPath -Name "ConcurrentUserSessions" -Value 1 -Type DWord  # Aynı kullanıcı birden fazla oturum açabilir

# Silme Politikası (Opsiyonel)
Set-ItemProperty -Path $RegPath -Name "DeleteLocalProfileWhenVHDShouldApply" -Value 1 -Type DWord

# Office 365 Container (Opsiyonel ama önerilen)
$OfficeRegPath = "HKLM:\SOFTWARE\Policies\FSLogix\ODFC"
if (!(Test-Path $OfficeRegPath)) {
    New-Item -Path $OfficeRegPath -Force | Out-Null
}

Set-ItemProperty -Path $OfficeRegPath -Name "Enabled" -Value 1 -Type DWord
Set-ItemProperty -Path $OfficeRegPath -Name "VHDLocations" -Value $VHDLocation -Type MultiString
Set-ItemProperty -Path $OfficeRegPath -Name "SizeInMBs" -Value 30000 -Type DWord
Set-ItemProperty -Path $OfficeRegPath -Name "IsDynamic" -Value 1 -Type DWord
Set-ItemProperty -Path $OfficeRegPath -Name "VolumeType" -Value "VHDX" -Type String

Write-Host "Registry ayarları tamamlandı!" -ForegroundColor Green

# 4. FSLogix Servisini Başlat
Write-Host "FSLogix servisleri başlatılıyor..." -ForegroundColor Green
Start-Service -Name "frxsvc" -ErrorAction SilentlyContinue
Start-Service -Name "frxdrv" -ErrorAction SilentlyContinue
Start-Service -Name "frxccds" -ErrorAction SilentlyContinue

Set-Service -Name "frxsvc" -StartupType Automatic
Set-Service -Name "frxdrv" -StartupType Automatic

# 5. Servisleri Kontrol Et
Write-Host "`nServis Durumları:" -ForegroundColor Cyan
Get-Service -Name "frx*" | Select-Object Name, Status, StartType | Format-Table

Write-Host "`nFSLogix kurulumu tamamlandı!" -ForegroundColor Green
Write-Host "Lütfen sunucuyu yeniden başlatın ve bir kullanıcı ile test edin." -ForegroundColor Yellow

FSLogix Profil Paylaşımı Yapılandırması


Dosya sunucusunda çalıştırın

Requires -RunAsAdministrator

# Değişkenler - BUNLARI DEĞİŞTİRİN
$SharePath = "D:\FSLogixProfiles"  # Local disk path
$ShareName = "FSLogixProfiles$"  # $ gizli paylaşım yapar
$DomainName = "DOMAIN"  # Domain adınız
$UsersGroup = "$DomainName\Domain Users"
$AdminsGroup = "$DomainName\Domain Admins"

# 1. Klasör Oluştur
Write-Host "Profil klasörü oluşturuluyor: $SharePath" -ForegroundColor Green
if (!(Test-Path $SharePath)) {
    New-Item -Path $SharePath -ItemType Directory -Force | Out-Null
}

# 2. SMB Paylaşımı Oluştur
Write-Host "SMB paylaşımı oluşturuluyor..." -ForegroundColor Green

# Mevcut paylaşımı kaldır (varsa)
if (Get-SmbShare -Name $ShareName -ErrorAction SilentlyContinue) {
    Remove-SmbShare -Name $ShareName -Force
}

# Yeni paylaşım oluştur
New-SmbShare -Name $ShareName `
    -Path $SharePath `
    -FullAccess $AdminsGroup `
    -ChangeAccess $UsersGroup `
    -Description "FSLogix Profile Containers"

# SMB 3.0 Ayarları
Set-SmbShare -Name $ShareName -EncryptData $true -Force

# 3. NTFS İzinleri
Write-Host "NTFS izinleri ayarlanıyor..." -ForegroundColor Green

# Mevcut izinleri temizle
$Acl = Get-Acl $SharePath
$Acl.SetAccessRuleProtection($true, $false)  # Inheritance'ı kapat

# Yeni izinler ekle
$AdminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    $AdminsGroup, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)

$UsersRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    $UsersGroup, "Modify", "ContainerInherit,ObjectInherit", "None", "Allow"
)

$SystemRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "SYSTEM", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)

# Creator Owner - Kullanıcılar kendi klasörlerinde tam yetki
$CreatorRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "CREATOR OWNER", "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow"
)

$Acl.SetAccessRule($AdminRule)
$Acl.SetAccessRule($UsersRule)
$Acl.SetAccessRule($SystemRule)
$Acl.AddAccessRule($CreatorRule)

Set-Acl -Path $SharePath -AclObject $Acl

# 4. Quota Ayarları (Opsiyonel)
Write-Host "Quota ayarları yapılıyor..." -ForegroundColor Green

# File Server Resource Manager gerekli
$FSRM = Get-WindowsFeature -Name FS-Resource-Manager
if (!$FSRM.Installed) {
    Write-Host "File Server Resource Manager kuruluyor..." -ForegroundColor Yellow
    Install-WindowsFeature -Name FS-Resource-Manager -IncludeManagementTools
}

# Her kullanıcı için 50GB quota
New-FSRMQuota -Path $SharePath -Template "50 GB Limit" -ErrorAction SilentlyContinue

# 5. Bilgilendirme
Write-Host "`n=== Yapılandırma Tamamlandı ===" -ForegroundColor Green
Write-Host "Paylaşım UNC Path: \\$env:COMPUTERNAME\$ShareName" -ForegroundColor Cyan
Write-Host "Local Path: $SharePath" -ForegroundColor Cyan

Write-Host "`nÖnemli Notlar:" -ForegroundColor Yellow
Write-Host "1. Bu UNC path'i RDS sunucularındaki FSLogix ayarlarına ekleyin"
Write-Host "2. RDS sunucularının bu paylaşıma erişebildiğinden emin olun"
Write-Host "3. Antivirus exclusion ekleyin: $SharePath\*.vhd* "
Write-Host "4. Backup planı yapın (VSS snapshot önerilir)"

# 6. Test
Write-Host "`nPaylaşım Testi:" -ForegroundColor Cyan
Get-SmbShare -Name $ShareName | Format-List
Get-SmbShareAccess -Name $ShareName | Format-Table

1. FSLogix ADMX Templates Kurulumu

Adımlar:

  1. FSLogix kurulum klasöründen ADMX dosyalarını kopyalayın:
    • C:\Program Files\FSLogix\Apps\ içindeki .admx ve .adml dosyaları
  2. Domain Controller'da PolicyDefinitions klasörüne kopyalayın:
 
 
   \\domain.com\SYSVOL\domain.com\Policies\PolicyDefinitions\
  • .admx dosyaları → root klasöre
  • .adml dosyaları → en-US\ alt klasörüne

2. GPO Oluşturma ve Yapılandırma

Yeni GPO Oluştur:

  1. Group Policy Management açın
  2. Domain veya RDS OU'suna sağ tık → Create a GPO in this domain
  3. İsim: FSLogix Profile Containers
  4. GPO'yu RDS sunucularına link edin

GPO Ayarları:

A. Temel FSLogix Ayarları

Konum: Computer Configuration → Policies → Administrative Templates → FSLogix → Profile Containers

Ayar Değer Açıklama
Enabled Enabled FSLogix'i aktif et
VHD Location \\FileServer\FSLogixProfiles$ Profil paylaşımı
Size in MBs 30000 30GB boyut
Is Dynamic Enabled Dynamic VHD (alan tasarrufu)
Volume Type VHDX Modern format
Prevent login with failure Disabled Hata durumunda local profil kullan
Prevent login with temp profile Disabled Temp profil izin ver
Delete local profile Enabled VHD yüklendiğinde local profili sil

B. Office 365 Container (Opsiyonel)

Konum: Computer Configuration → Policies → Administrative Templates → FSLogix → ODFC Containers

Ayar Değer Açıklama
Enabled Enabled Office Container aktif
VHD Location \\FileServer\FSLogixProfiles$ Aynı paylaşım
Size in MBs 30000 30GB
Is Dynamic Enabled Dynamic VHD
Include Office Activation Enabled Office lisansını sakla

C. Gelişmiş Ayarlar

Ayar Değer Açıklama
Flip Flop Profile Directory Name Enabled SID yerine Username kullan
Concurrent User Sessions Enabled Aynı kullanıcı birden fazla session
Profile Type 0 Normal profile (0=Normal, 1=Try for read-write, 2=Read-only)
Locked Retry Count 3 VHD kilitliyse deneme sayısı
Locked Retry Interval 15 Denemeler arası bekleme (saniye)

3. Folder Redirection Ayarları (Opsiyonel)

Konum: User Configuration → Policies → Windows Settings → Folder Redirection

Önerilen Yönlendirmeler:

  • Desktop\\FileServer\Redirected$\%USERNAME%\Desktop
  • Documents\\FileServer\Redirected$\%USERNAME%\Documents
  • Downloads\\FileServer\Redirected$\%USERNAME%\Downloads

Not: FSLogix kullanıyorsanız folder redirection'a genelde gerek yok!

4. Disk Cleanup Ayarları

Konum: Computer Configuration → Preferences → Control Panel Settings → Scheduled Tasks

Task Oluştur:

 
 
xml
Task Name: FSLogix-Cleanup-Old-Profiles
Trigger: Daily at 2:00 AM
Action: PowerShell Script
Script: Remove-Item "\\FileServer\FSLogixProfiles$\*" -Recurse -Force 
        -Include @('*.vhd','*.vhdx') 
        | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-90)}

5. Antivirus Exclusions

Konum: Computer Configuration → Policies → Administrative Templates → Windows Defender

Exclusions Ekle:

  • \\FileServer\FSLogixProfiles$\*.vhd
  • \\FileServer\FSLogixProfiles$\*.vhdx
  • C:\Program Files\FSLogix\Apps\*

6. GPO Uygulama ve Test

GPO'yu Uygula:

 
 
powershell
gpupdate /force

Test Et:

  1. Bir kullanıcı ile RDS'e login ol
  2. Kontrol Et:
 
 
powershell
   # FSLogix log'larını kontrol et
   Get-Content "C:\ProgramData\FSLogix\Logs\Profile\*.log" -Tail 50
   
   # Profile container kontrol
   Test-Path "\\FileServer\FSLogixProfiles$\$env:USERNAME*"

7. Troubleshooting

Log Konumları:

  • Profile Logs: C:\ProgramData\FSLogix\Logs\Profile\
  • ODFC Logs: C:\ProgramData\FSLogix\Logs\ODFC\

Yaygın Sorunlar:

1. VHD oluşturulmuyor:

  • SMB paylaşım izinlerini kontrol et
  • NTFS izinlerini kontrol et
  • Firewall'u kontrol et (SMB port 445)

2. Profile yüklenmiyor:

  • PreventLoginWithFailure = Disabled olmalı
  • Event Viewer → Applications and Services Logs → FSLogix

3. Yavaş login:

  • VHDX kullanın (VHD değil)
  • Dynamic VHD kullanın
  • SMB 3.0 kullanın
  • Network hızını kontrol edin

8. Monitoring

PowerShell ile Monitor:

 
 
powershell
# Aktif FSLogix profilleri listele
Get-ChildItem "\\FileServer\FSLogixProfiles$" -Directory | 
Select-Object Name, 
@{N='Size(GB)';E={[math]::Round((Get-ChildItem $_.FullName -Recurse | 
Measure-Object -Property Length -Sum).Sum / 1GB, 2)}}, 
LastWriteTime | Sort-Object LastWriteTime -Descending

Önemli Notlar:

  1. ✅ FSLogix her kullanıcı için VHD/VHDX disk image oluşturur
  2. ✅ Profil bir disk gibi mount edilir, performans yüksektir
  3. ✅ OneDrive, Teams, Outlook cache sorunsuz çalışır
  4. ✅ Aynı kullanıcı birden fazla sunucuya login olabilir
  5. ⚠️ Network kesintisinde profil corrupted olabilir (SMB 3.0 kullanın)
  6. ⚠️ Backup stratejisi mutlaka yapın (VSS snapshot)
  7. ⚠️ İlk login uzun sürebilir (profil oluşturulurken)

Başarı Kriterleri:

  • ✅ Kullanıcı login süresi < 30 saniye
  • ✅ Profile container başarıyla mount oluyor
  • ✅ Kullanıcı logout sonrası VHD dismount oluyor
  • ✅ Farklı sunucularda aynı profil kullanılıyor
  • ✅ OneDrive/Teams sorunsuz çalışıyor

 

# FSLogix Monitoring ve Bakım Script
# Scheduled Task ile günlük çalıştırın

#Requires -RunAsAdministrator

# Değişkenler
$ProfileShare = "\\FileServer\FSLogixProfiles$"
$ReportPath = "C:\Reports\FSLogix"
$LogRetentionDays = 30
$OldProfileDays = 90
$EmailTo = "admin@domain.com"
$EmailFrom = "fslogix@domain.com"
$SMTPServer = "smtp.domain.com"
$SendEmail = $false  # Email göndermek için $true yapın

# Report klasörü oluştur
if (!(Test-Path $ReportPath)) {
    New-Item -Path $ReportPath -ItemType Directory -Force | Out-Null
}

$ReportFile = Join-Path $ReportPath "FSLogix-Report-$(Get-Date -Format 'yyyy-MM-dd').html"

# HTML Report başlat
$HTML = @"



    
    


    

FSLogix Monitoring Report


    

Tarih: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')


"@

# 1. FSLogix Servis Durumu
Write-Host "FSLogix servisleri kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

1. FSLogix Servis Durumu

"

$Services = Get-Service -Name "frx*" -ErrorAction SilentlyContinue
foreach ($Service in $Services) {
    $StatusClass = if ($Service.Status -eq "Running") { "success" } else { "error" }
    $HTML += ""
}
$HTML += "
Servis Durum Startup Type
$($Service.Name) $($Service.Status) $($Service.StartType)
"

# 2. Profil Paylaşım Kontrolü
Write-Host "Profil paylaşımı kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

2. Profil Paylaşım Erişimi

"

if (Test-Path $ProfileShare) {
    $HTML += "

✓ Paylaşım erişilebilir: $ProfileShare

"
    
    # Toplam profil sayısı ve boyutu
    $Profiles = Get-ChildItem -Path $ProfileShare -Directory -ErrorAction SilentlyContinue
    $TotalProfiles = $Profiles.Count
    
    $TotalSize = 0
    $ProfileDetails = @()
    
    foreach ($Profile in $Profiles) {
        $VHDs = Get-ChildItem -Path $Profile.FullName -Filter "*.vhd*" -ErrorAction SilentlyContinue
        foreach ($VHD in $VHDs) {
            $SizeGB = [math]::Round($VHD.Length / 1GB, 2)
            $TotalSize += $SizeGB
            $DaysOld = (New-TimeSpan -Start $VHD.LastWriteTime -End (Get-Date)).Days
            
            $ProfileDetails += [PSCustomObject]@{
                Username = $Profile.Name
                VHDFile = $VHD.Name
                SizeGB = $SizeGB
                LastAccess = $VHD.LastWriteTime
                DaysOld = $DaysOld
            }
        }
    }
    
    $HTML += "
" $HTML += "Toplam Profil Sayısı: $TotalProfiles
" $HTML += "Toplam Boyut: $([math]::Round($TotalSize, 2)) GB
" $HTML += "Ortalama Profil Boyutu: $([math]::Round($TotalSize / $TotalProfiles, 2)) GB" $HTML += "
"
    
} else {
    $HTML += "

✗ Paylaşım erişilemiyor: $ProfileShare

"
}

# 3. En Büyük Profiller (Top 10)
Write-Host "En büyük profiller listeleniyor..." -ForegroundColor Cyan
$HTML += "

3. En Büyük Profiller (Top 10)

"

$TopProfiles = $ProfileDetails | Sort-Object SizeGB -Descending | Select-Object -First 10
foreach ($Profile in $TopProfiles) {
    $SizeClass = if ($Profile.SizeGB -gt 40) { "error" } elseif ($Profile.SizeGB -gt 30) { "warning" } else { "" }
    $HTML += ""
}
$HTML += "
Kullanıcı VHD Dosyası Boyut (GB) Son Erişim
$($Profile.Username) $($Profile.VHDFile) $($Profile.SizeGB) $($Profile.LastAccess.ToString('dd.MM.yyyy HH:mm'))
"

# 4. Kullanılmayan Profiller (90+ gün)
Write-Host "Kullanılmayan profiller kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

4. Kullanılmayan Profiller ($OldProfileDays+ gün)

"

$OldProfiles = $ProfileDetails | Where-Object { $_.DaysOld -gt $OldProfileDays } | Sort-Object DaysOld -Descending
if ($OldProfiles.Count -gt 0) {
    foreach ($Profile in $OldProfiles) {
        $HTML += ""
    }
    
    $OldProfileSize = ($OldProfiles | Measure-Object -Property SizeGB -Sum).Sum
    $HTML += "
Kullanıcı VHD Dosyası Boyut (GB) Gün Son Erişim
$($Profile.Username) $($Profile.VHDFile) $($Profile.SizeGB) $($Profile.DaysOld) $($Profile.LastAccess.ToString('dd.MM.yyyy'))
 

⚠ $($OldProfiles.Count) kullanılmayan profil tespit edildi. Toplam: $([math]::Round($OldProfileSize, 2)) GB alan kazanılabilir.

"
} else {
    $HTML += "

✓ Kullanılmayan profil yok.

"
}

# 5. Disk Alanı Kontrolü
Write-Host "Disk alanı kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

5. Disk Alanı Durumu

"

# Profil sunucusunun disk durumu
$Server = $ProfileShare.Split('\')[2]
$Disks = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $Server -Filter "DriveType=3" -ErrorAction SilentlyContinue

foreach ($Disk in $Disks) {
    $FreePercent = [math]::Round(($Disk.FreeSpace / $Disk.Size) * 100, 2)
    $FreeGB = [math]::Round($Disk.FreeSpace / 1GB, 2)
    $UsedGB = [math]::Round(($Disk.Size - $Disk.FreeSpace) / 1GB, 2)
    $TotalGB = [math]::Round($Disk.Size / 1GB, 2)
    
    $SpaceClass = if ($FreePercent -lt 10) { "error" } elseif ($FreePercent -lt 20) { "warning" } else { "success" }
    
    $HTML += ""
}
$HTML += "
Sunucu Disk Toplam (GB) Kullanılan (GB) Boş (GB) Boş %
$Server $($Disk.DeviceID) $TotalGB $UsedGB $FreeGB $FreePercent%
"

# 6. FSLogix Event Log Hataları (Son 24 saat)
Write-Host "Event log hataları kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

6. FSLogix Event Log Hataları (Son 24 Saat)

"

$StartTime = (Get-Date).AddHours(-24)
$FSLogixErrors = Get-WinEvent -FilterHashtable @{
    LogName = 'Microsoft-FSLogix-Apps/Operational'
    Level = 2,3  # Error ve Warning
    StartTime = $StartTime
} -ErrorAction SilentlyContinue | Select-Object -First 20

if ($FSLogixErrors) {
    $HTML += ""
    foreach ($Error in $FSLogixErrors) {
        $LevelClass = if ($Error.LevelDisplayName -eq "Error") { "error" } else { "warning" }
        $HTML += ""
    }
    $HTML += "
Zaman Level Event ID Mesaj
$($Error.TimeCreated.ToString('dd.MM.yyyy HH:mm')) $($Error.LevelDisplayName) $($Error.Id) $($Error.Message.Substring(0, [Math]::Min(100, $Error.Message.Length)))...
"
} else {
    $HTML += "

✓ Son 24 saatte hata kaydı yok.

"
}

# 7. Aktif FSLogix Oturumları
Write-Host "Aktif oturumlar kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

7. Aktif FSLogix Oturumları

"

# RDS sunucularını listele (ortamınıza göre değiştirin)
$RDSServers = @("RDS-Server1", "RDS-Server2")  # Değiştirin!
$ActiveSessions = @()

foreach ($Server in $RDSServers) {
    try {
        $Sessions = qwinsta /server:$Server 2>$null | Where-Object { $_ -match "Active" }
        foreach ($Session in $Sessions) {
            if ($Session -match '\s+(\w+)\s+(\w+)\s+(\d+)\s+Active') {
                $ActiveSessions += [PSCustomObject]@{
                    Server = $Server
                    Username = $matches[1]
                    Session = $matches[2]
                    ID = $matches[3]
                }
            }
        }
    } catch {
        Write-Host "Uyarı: $Server'a bağlanılamadı" -ForegroundColor Yellow
    }
}

if ($ActiveSessions.Count -gt 0) {
    $HTML += ""
    foreach ($Session in $ActiveSessions) {
        $HTML += ""
    }
    $HTML += "
Sunucu Kullanıcı Session ID
$($Session.Server) $($Session.Username) $($Session.Session) $($Session.ID)
"
    $HTML += "

Toplam Aktif Oturum: $($ActiveSessions.Count)

"
} else {
    $HTML += "

Şu anda aktif oturum yok.

"
}

# 8. Otomatik Temizlik (Opsiyonel)
Write-Host "Eski profiller temizleniyor..." -ForegroundColor Cyan
$HTML += "

8. Otomatik Temizlik

"

$CleanupEnabled = $false  # Otomatik temizlik için $true yapın
$DeletedProfiles = @()

if ($CleanupEnabled -and $OldProfiles.Count -gt 0) {
    foreach ($Profile in $OldProfiles) {
        try {
            $VHDPath = Join-Path -Path $ProfileShare -ChildPath "$($Profile.Username)\$($Profile.VHDFile)"
            if (Test-Path $VHDPath) {
                Remove-Item -Path $VHDPath -Force -ErrorAction Stop
                $DeletedProfiles += $Profile
                Write-Host "Silindi: $VHDPath" -ForegroundColor Green
            }
        } catch {
            Write-Host "Hata: $VHDPath silinemedi - $_" -ForegroundColor Red
        }
    }
    
    if ($DeletedProfiles.Count -gt 0) {
        $FreedSpace = ($DeletedProfiles | Measure-Object -Property SizeGB -Sum).Sum
        $HTML += "

✓ $($DeletedProfiles.Count) eski profil silindi. $([math]::Round($FreedSpace, 2)) GB alan kazanıldı.

"
    }
} else {
    $HTML += "

Otomatik temizlik devre dışı. Aktif etmek için script'te \$CleanupEnabled = \$true yapın.

"
}

# 9. Registry Ayarları Kontrolü
Write-Host "Registry ayarları kontrol ediliyor..." -ForegroundColor Cyan
$HTML += "

9. FSLogix Registry Ayarları

"

$RegPath = "HKLM:\SOFTWARE\FSLogix\Profiles"
$ExpectedSettings = @{
    "Enabled" = 1
    "VHDLocations" = $ProfileShare
    "IsDynamic" = 1
    "VolumeType" = "VHDX"
}

foreach ($Setting in $ExpectedSettings.GetEnumerator()) {
    try {
        $ActualValue = (Get-ItemProperty -Path $RegPath -Name $Setting.Key -ErrorAction Stop).$($Setting.Key)
        
        if ($Setting.Key -eq "VHDLocations") {
            $Match = $ActualValue -contains $Setting.Value
        } else {
            $Match = $ActualValue -eq $Setting.Value
        }
        
        $StatusClass = if ($Match) { "success" } else { "warning" }
        $Status = if ($Match) { "✓ OK" } else { "⚠ Farklı" }
        
        $HTML += ""
    } catch {
        $HTML += ""
    }
}
$HTML += "
Ayar Değer Durum
$($Setting.Key) $ActualValue $Status
$($Setting.Key) - ✗ Ayar bulunamadı
"

# 10. Öneriler
$HTML += "

10. Öneriler ve Uyarılar

 
  • " if ($OldProfiles.Count -gt 10) { $HTML += "
  • ⚠ $($OldProfiles.Count) kullanılmayan profil var. Temizlik önerilir.
  • " } $LargeProfiles = $ProfileDetails | Where-Object { $_.SizeGB -gt 40 } if ($LargeProfiles.Count -gt 0) { $HTML += "
  • ⚠ $($LargeProfiles.Count) profil 40GB'dan büyük. Kullanıcılarla iletişime geçin.
  • " } if ($FSLogixErrors.Count -gt 10) { $HTML += "
  • ✗ Son 24 saatte $($FSLogixErrors.Count) hata kaydı var. Log'ları inceleyin.
  • " } $LowDiskSpace = $Disks | Where-Object { (($_.FreeSpace / $_.Size) * 100) -lt 20 } if ($LowDiskSpace) { $HTML += "
  • ✗ Disk alanı kritik seviyede! Acilen alan açın.
  • " } $StoppedServices = $Services | Where-Object { $_.Status -ne "Running" } if ($StoppedServices) { $HTML += "
  • ✗ FSLogix servisleri çalışmıyor! Hemen kontrol edin.
  • " } if ($OldProfiles.Count -eq 0 -and !$FSLogixErrors -and !$LowDiskSpace -and !$StoppedServices) { $HTML += "
  • ✓ Tüm sistemler normal çalışıyor.
  • " } $HTML += "
"

# HTML Sonlandır
$HTML += @"
    


    

Bu rapor otomatik olarak oluşturulmuştur.
Script: FSLogix-Monitoring.ps1
Sunucu: $env:COMPUTERNAME
Oluşturma: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')




"@

# Raporu kaydet
$HTML | Out-File -FilePath $ReportFile -Encoding UTF8
Write-Host "`nRapor oluşturuldu: $ReportFile" -ForegroundColor Green

# Tarayıcıda aç
Start-Process $ReportFile

# Email gönder (opsiyonel)
if ($SendEmail) {
    try {
        $Subject = "FSLogix Monitoring Report - $(Get-Date -Format 'dd.MM.yyyy')"
        
        Send-MailMessage -To $EmailTo -From $EmailFrom -Subject $Subject -Body $HTML -BodyAsHtml -SmtpServer $SMTPServer -Encoding UTF8
        
        Write-Host "Email gönderildi: $EmailTo" -ForegroundColor Green
    } catch {
        Write-Host "Email gönderilemedi: $_" -ForegroundColor Red
    }
}

# Eski raporları temizle
Write-Host "Eski raporlar temizleniyor..." -ForegroundColor Cyan
Get-ChildItem -Path $ReportPath -Filter "*.html" | 
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$LogRetentionDays) } | 
    Remove-Item -Force

Write-Host "`n=== İşlem Tamamlandı ===" -ForegroundColor Green

 

FSLogix Kurulum ve Yapılandırma Checklist

Ön Hazırlık

1. Dosya Sunucusu Hazırlığı

  • Dosya sunucusunda yeterli disk alanı var (kullanıcı başına 30-50GB hesaplayın)
  • SMB 3.0 aktif (Windows Server 2012 R2 ve üzeri)
  • Antivirus exclusion eklenecek
  • Backup planı hazır

2. Network Kontrolü

  • RDS sunucuları ile dosya sunucusu arasında düşük latency (<5ms)
  • Network bant genişliği yeterli (kullanıcı başına minimum 10Mbps)
  • SMB Direct aktif (iSER/RDMA varsa)
  • Firewall SMB portuna (445) izin veriyor

3. Active Directory

  • FSLogix için GPO oluşturulacak OU hazır
  • Kullanıcı grupları tanımlı
  • Test kullanıcı hesabı hazır

Kurulum Adımları

Adım 1: FSLogix İndirme

Adım 2: Dosya Sunucusu Yapılandırması

Dosya Sunucusunda Çalıştırın:

 
 
powershell
# Script: fslogix_fileserver.ps1
# Paylaşım oluştur
$SharePath = "D:\FSLogixProfiles"
$ShareName = "FSLogixProfiles$"
New-Item -Path $SharePath -ItemType Directory -Force
New-SmbShare -Name $ShareName -Path $SharePath -FullAccess "Domain Admins" -ChangeAccess "Domain Users"
  • Paylaşım oluşturuldu: \\FileServer\FSLogixProfiles$
  • NTFS izinleri ayarlandı
  • SMB izinleri ayarlandı
  • Test: Test-Path \\FileServer\FSLogixProfiles$ = True

Adım 3: FSLogix Kurulumu (TÜM RDS Sunucularında)

Her RDS Sunucusunda Çalıştırın:

 
 
powershell
# Script: fslogix_install.ps1
Start-Process -FilePath "C:\Temp\FSLogixAppsSetup.exe" -ArgumentList "/install /quiet /norestart" -Wait
  • RDS-Server1: FSLogix kuruldu
  • RDS-Server2: FSLogix kuruldu
  • RDS-Server3: FSLogix kuruldu (varsa)
  • Tüm sunucularda servisler çalışıyor: Get-Service frx*

Adım 4: Registry Yapılandırması

Her RDS Sunucusunda Çalıştırın:

 
 
powershell
# Script: fslogix_install.ps1 (Registry bölümü)

Veya Group Policy ile yapılandırın (önerilen)

  • Enabled = 1
  • VHDLocations = \\FileServer\FSLogixProfiles$
  • SizeInMBs = 30000
  • IsDynamic = 1
  • VolumeType = VHDX

Adım 5: Sunucu Yeniden Başlatma

  • RDS-Server1 yeniden başlatıldı
  • RDS-Server2 yeniden başlatıldı
  • RDS-Server3 yeniden başlatıldı (varsa)
  • Servisler otomatik başladı

Adım 6: İlk Test

Test kullanıcısı ile login olun:

  • Login başarılı
  • Login süresi makul (<60 saniye ilk sefer)
  • Profil oluşturuldu: \\FileServer\FSLogixProfiles$\username_SID
  • VHD dosyası var: Profile_username.vhdx
  • Event Viewer'da hata yok

Kontrol Komutları:

 
 
powershell
# Log kontrol
Get-Content "C:\ProgramData\FSLogix\Logs\Profile\*.log" -Tail 50

# VHD kontrol
Get-ChildItem "\\FileServer\FSLogixProfiles$" -Recurse -Filter "*.vhdx"

# Event log
Get-WinEvent -LogName 'Microsoft-FSLogix-Apps/Operational' -MaxEvents 20

Adım 7: Farklı Sunucuda Test

Aynı kullanıcı ile farklı RDS sunucusuna login olun:

  • Login başarılı
  • Aynı profil kullanıldı
  • Kullanıcı ayarları korundu
  • Desktop/Documents aynı

Optimizasyon

Performans İyileştirmeleri

  • Concurrent user sessions aktif (aynı kullanıcı birden fazla session)
  • Dynamic VHD kullanılıyor (disk tasarrufu)
  • FlipFlop enabled (SID yerine username)
  • Office Container ayrı yapılandırıldı (opsiyonel)

Antivirus Exclusions

Tüm RDS ve Dosya Sunucularında:

  • \\FileServer\FSLogixProfiles$\*.vhd*
  • C:\Program Files\FSLogix\Apps\*
  • C:\ProgramData\FSLogix\*

Monitoring Kurulumu

  • Monitoring script kuruldu
  • Scheduled Task oluşturuldu (günlük)
  • Email bildirimi yapılandırıldı (opsiyonel)
  • İlk rapor başarıyla oluşturuldu

Üretim Geçişi

Pilot Test (1 Hafta)

  • 5-10 pilot kullanıcı seçildi
  • Pilot kullanıcılar bilgilendirildi
  • İlk hafta günlük monitoring
  • Kullanıcı feedback'i toplandı
  • Sorunlar çözüldü

Toplu Geçiş

  • Tüm kullanıcılar bilgilendirildi
  • Geçiş zamanı planlandı (hafta sonu önerilir)
  • Eski profil temizlik planı hazır
  • Rollback planı hazır
  • İlk 3 gün yoğun destek hazır

Bakım ve İzleme

Günlük Kontroller

  • Monitoring raporu kontrol ediliyor
  • Servis durumları OK
  • Disk alanı yeterli
  • Event log'da kritik hata yok

Haftalık Kontroller

  • Büyük profiller incelendi (>40GB)
  • Eski profiller listelendi (>90 gün)
  • Performans raporları incelendi
  • Kullanıcı şikayetleri değerlendirildi

Aylık Bakım

  • Eski profiller temizlendi (onay ile)
  • Disk alanı planlaması yapıldı
  • FSLogix güncellemesi kontrol edildi
  • Backup test edildi

Sorun Giderme Kontrol Listesi

Profil Oluşturmuyor

  • SMB paylaşım izinleri kontrol et
  • NTFS izinleri kontrol et
  • Network bağlantısı kontrol et
  • Firewall kuralları kontrol et
  • Event Viewer kontrol et
  • FSLogix log dosyaları kontrol et

Yavaş Login

  • Network latency kontrol et (<5ms olmalı)
  • VHD boyutu kontrol et (<40GB olmalı)
  • Dynamic VHD kullanılıyor mu?
  • Antivirus exclusion var mı?
  • Dosya sunucusu disk I/O kontrol et
  • SMB 3.0 kullanılıyor mu?

Profil Bozulması

  • Son event log kayıtları
  • Network kesintisi var mıydı?
  • VHD dosyası hasarlı mı? (chkdsk)
  • Antivirus sildi mi?
  • Kullanıcı anormal logout yaptı mı?

Backup'tan Geri Yükleme

  • Kullanıcı logout
  • Mevcut VHD'yi yedekle
  • Backup'tan VHD geri yükle
  • İzinleri kontrol et
  • Kullanıcı login test et

Başarı Kriterleri

Teknik Başarı

✅ Login süresi <30 saniye
✅ Profil mount başarı oranı >99%
✅ Farklı sunucularda roaming çalışıyor
✅ Disk kullanımı planlandığı gibi
✅ Günde <5 hata event'i

Kullanıcı Memnuniyeti

✅ Login hızından şikayet yok
✅ Dosya kaybı yok
✅ Ayarlar korunuyor
✅ OneDrive/Teams sorunsuz
✅ Kullanıcılar farkında değil (en iyisi!)


Yardımcı Kaynaklar

Microsoft Dokümantasyonu

Log Konumları

  • RDS: C:\ProgramData\FSLogix\Logs\Profile\
  • Event Viewer: Applications and Services Logs → FSLogix

Destek

 

Önceki Yazı Hayaletin Çırağı
Hayaletin Çırağı

Hayaletin Çırağı "Hayaletin Çırağı" (The Spook's Apprentice/The Last App...

Sonraki Yazı Terminal Server (Uzak Masaüstü Sunucusu) Kullanıcı Politikaları
Terminal Server (Uzak Masaüstü Sunucusu) Kullanıcı Politikaları

Microsoft RDS Security Best Practices: Güvenli Uzak Masaüstü Hizmetleri Gerek...