Microsoft Teams Önbelleğini Temizleme
Microsoft Teams, iş dünyasında ve eğitim kurumlarında en çok tercih edilen...
 
        # Exchange Online PowerShell modülünü yükleyin Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber # Microsoft Graph PowerShell modülünü yükleyin Install-Module -Name Microsoft.Graph -Force -AllowClobber # Modern kimlik doğrulama ile Exchange Online'a bağlanın Connect-ExchangeOnline -UserPrincipalName admin@sirketiniz.com # Microsoft Graph'e bağlanın ve gerekli izinleri alın Connect-MgGraph -Scopes "User.Read.All", "AuditLog.Read.All" # Parametreleri tanımlama param( $InactiveDays = 90, # Varsayılan olarak 90 gün $OutputPath = "C:\Raporlar\InaktifKullanicilar_$(Get-Date -Format 'yyyyMMdd').csv", $IncludeSharedMailboxes = $false, $IncludeResourceMailboxes = $false ) # Fonksiyonları tanımlama function Write-Log { param ( $Message, $LogLevel = "INFO" ) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" Write-Host " $Message" } # Başlangıç mesajı Write-Log "Microsoft 365 İnaktif Kullanıcı Raporu oluşturuluyor..." Write-Log "İnaktif gün sayısı: $InactiveDays" # Klasörü oluştur (eğer yoksa) $outputFolder = Split-Path -Path $OutputPath -Parent if (-not (Test-Path -Path $outputFolder)) { New-Item -ItemType Directory -Path $outputFolder -Force | Out-Null Write-Log "$outputFolder klasörü oluşturuldu" "INFO" } # İnaktif tarihi hesapla $inactiveDate = (Get-Date).AddDays(-$InactiveDays) Write-Log "İnaktif tarih eşiği: $inactiveDate" "INFO" # Tüm posta kutularını al Write-Log "Posta kutuları alınıyor..." "INFO" $mailboxFilter = "RecipientTypeDetails -eq 'UserMailbox'" if ($IncludeSharedMailboxes) { $mailboxFilter += " -or RecipientTypeDetails -eq 'SharedMailbox'" } if ($IncludeResourceMailboxes) { $mailboxFilter += " -or RecipientTypeDetails -eq 'RoomMailbox' -or RecipientTypeDetails -eq 'EquipmentMailbox'" } $mailboxes = Get-EXOMailbox -ResultSize Unlimited -Filter $mailboxFilter -Properties DisplayName, UserPrincipalName, RecipientTypeDetails, WhenCreated, WhenChanged Write-Log "$($mailboxes.Count) posta kutusu bulundu" "INFO" # Sonuçları saklamak için bir koleksiyon oluştur $results = @() # İlerleme sayacı $progressCounter = 0 $totalMailboxes = $mailboxes.Count foreach ($mailbox in $mailboxes) { # İlerleme çubuğunu güncelle $progressCounter++ $progressPercentage = ::Round(($progressCounter / $totalMailboxes) * 100, 2) Write-Progress -Activity "İnaktif Kullanıcılar Taranıyor" -Status "$progressCounter / $totalMailboxes ($progressPercentage%)" -PercentComplete $progressPercentage # Her posta kutusu için son oturum açma tarihini al $stats = $null try { $stats = Get-EXOMailboxStatistics -Identity $mailbox.UserPrincipalName -ErrorAction Stop | Select-Object DisplayName, LastLogonTime, ItemCount, TotalItemSize } catch { Write-Log "Hata: $($mailbox.UserPrincipalName) için istatistik alınamadı: $($_.Exception.Message)" "ERROR" continue } # Son oturum açma tarihi kontrolü $isInactive = $false $inactiveDaysCount = 0 if ($null -eq $stats.LastLogonTime) { $isInactive = $true $inactiveDaysCount = ::Round((New-TimeSpan -Start $mailbox.WhenCreated -End (Get-Date)).TotalDays, 0) } elseif ($stats.LastLogonTime -lt $inactiveDate) { $isInactive = $true $inactiveDaysCount = ::Round((New-TimeSpan -Start $stats.LastLogonTime -End (Get-Date)).TotalDays, 0) } # İnaktif ise sonuçlara ekle if ($isInactive) { # Lisans bilgilerini al $licenses = "Bulunamadı" try { $user = Get-MgUser -UserId $mailbox.UserPrincipalName -Property AssignedLicenses -ErrorAction Stop if ($user.AssignedLicenses.Count -gt 0) { $licenseDetails = @() foreach ($license in $user.AssignedLicenses) { $licenseSkuId = $license.SkuId # Lisans SKU ID'lerini daha okunabilir isimlerle eşleştir switch ($licenseSkuId) { "c5928f49-12ba-48f7-ada3-0d743a3601d5" { $licenseName = "Microsoft 365 E5" } "06ebc4ee-1bb5-4d50-a87d-2e37e3ec5f57" { $licenseName = "Microsoft 365 E3" } "a403ebcc-fae0-4ca2-8c8c-7a907fd6c235" { $licenseName = "Microsoft 365 Business Standard" } "f245ecc8-75af-4f8e-b61f-27d8114de5f3" { $licenseName = "Microsoft 365 Business Basic" } "3b555118-da6a-4418-894f-7df1e2096870" { $licenseName = "Microsoft 365 Business Premium" } default { $licenseName = $licenseSkuId } } $licenseDetails += $licenseName } $licenses = $licenseDetails -join ", " } else { $licenses = "Lisans Yok" } } catch { Write-Log "Hata: $($mailbox.UserPrincipalName) için lisans bilgisi alınamadı: $($_.Exception.Message)" "ERROR" } # Son kullanıcı aktivitesini al $lastUserActivity = "Aktivite Bulunamadı" try { $activityLogs = Get-MgAuditLogSignIn -Filter "userPrincipalName eq '$($mailbox.UserPrincipalName)'" -Top 1 -ErrorAction Stop if ($activityLogs) { $lastUserActivity = $activityLogs.CreatedDateTime } } catch { Write-Log "Hata: $($mailbox.UserPrincipalName) için aktivite kaydı alınamadı: $($_.Exception.Message)" "ERROR" } # Sonuç nesnesini oluştur $result = @{ 'Görünen Ad' = $mailbox.DisplayName 'E-posta Adresi' = $mailbox.UserPrincipalName 'Hesap Türü' = $mailbox.RecipientTypeDetails 'Oluşturulma Tarihi' = $mailbox.WhenCreated 'Son Değiştirilme Tarihi' = $mailbox.WhenChanged 'Son Oturum Açma' = $stats.LastLogonTime 'İnaktif Gün Sayısı' = $inactiveDaysCount 'Öğe Sayısı' = $stats.ItemCount 'Posta Kutusu Boyutu' = $stats.TotalItemSize 'Lisanslar' = $licenses 'Son Aktivite' = $lastUserActivity } $results += $result } } # İlerleme çubuğunu temizle Write-Progress -Activity "İnaktif Kullanıcılar Taranıyor" -Completed # Sonuçları sırala $sortedResults = $results | Sort-Object -Property 'İnaktif Gün Sayısı' -Descending # Sonuçları CSV olarak dışa aktar if ($sortedResults.Count -gt 0) { $sortedResults | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8 Write-Log "$($sortedResults.Count) inaktif kullanıcı bulundu ve rapor oluşturuldu: $OutputPath" "INFO" } else { Write-Log "İnaktif kullanıcı bulunamadı" "INFO" } # Özet bilgi Write-Log "Rapor tamamlandı" "INFO" Write-Log "Toplam tarama yapılan posta kutusu: $totalMailboxes" "INFO" Write-Log "Bulunan inaktif posta kutusu: $($sortedResults.Count)" "INFO" Write-Log "İnaktiflik eşiği: $InactiveDays gün" "INFO" # Özet raporu göster if ($sortedResults.Count -gt 0) { Write-Host "" Write-Host "En Uzun İnaktif Olan 5 Kullanıcı:" -ForegroundColor Yellow $sortedResults | Select-Object 'Görünen Ad', 'E-posta Adresi', 'İnaktif Gün Sayısı', 'Lisanslar' | Format-Table -AutoSize | Out-String | Write-Host } # Varsayılan ayarlarla çalıştırma (90 gün inaktif) .\InaktifKullaniciRaporu.ps1 # Özel inaktif gün sayısı belirterek çalıştırma .\InaktifKullaniciRaporu.ps1 -InactiveDays 45 # Paylaşımlı posta kutularını dahil ederek çalıştırma .\InaktifKullaniciRaporu.ps1 -IncludeSharedMailboxes # Özel çıktı yolu belirterek çalıştırma .\InaktifKullaniciRaporu.ps1 -OutputPath "D:\Raporlar\InaktifKullanicilar.csv" # Görev Zamanlayıcısı için örnek komut $action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File 'C:\Scripts\InaktifKullaniciRaporu.ps1'" $trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 8am Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "Microsoft 365 İnaktif Kullanıcı Raporu" -Description "Her Pazartesi sabah 8'de Microsoft 365 inaktif kullanıcı raporu oluşturur"