Microsoft 365 İnaktif Kullanıcı Raporu Nasıl Alınır?

Microsoft Graph

Modern işletmelerde Microsoft 365 (eski adıyla Office 365) kullanımı giderek yaygınlaşmaktadır. Bu bulut tabanlı hizmet, lisans maliyetleri ile birlikte gelmektedir. Bu nedenle, aktif olarak kullanılmayan hesapların tespit edilmesi ve gerekli aksiyonların alınması, işletmeler için hem mali hem de güvenlik açısından büyük önem taşımaktadır. Bu yazıda, Microsoft 365 ortamınızdaki inaktif kullanıcıları nasıl tespit edeceğinizi, rapor oluşturacağınızı ve bu raporları nasıl analiz edip kullanacağınızı detaylıca ele alacağız.

İnaktif Kullanıcı Raporunun Önemi

Maliyet Optimizasyonu

Microsoft 365 lisansları, kullanıcı başına aylık veya yıllık olarak faturalandırılır. İnaktif kullanıcılara ait lisansların tespiti ve yeniden tahsisi veya iptali, işletmenizin gereksiz maliyetlerden kurtulmasını sağlar. Orta ölçekli bir işletmede bile, bu tasarruf yıllık binlerce TL’ye ulaşabilir.

Güvenlik Riskleri

Aktif olarak kullanılmayan hesaplar, işletmenizin güvenlik zafiyetine neden olabilir. İşten ayrılmış ancak hesabı kapatılmamış eski çalışanlar veya uzun süredir kullanılmayan hesaplar, siber saldırılar için potansiyel bir giriş noktası oluşturur. Bu hesapların düzenli olarak tespit edilip gerekli aksiyonların alınması, güvenlik riski yönetiminin önemli bir parçasıdır.

Veri Yönetimi ve Uyumluluk

KVKK (Kişisel Verilerin Korunması Kanunu) ve GDPR (Genel Veri Koruma Yönetmeliği) gibi düzenlemeler, kişisel verilerin gereksiz yere saklanmamasını gerektirir. Artık organizasyonunuzda bulunmayan kişilere ait verilerin yönetimi, bu düzenlemelere uyum sağlamak açısından kritiktir.

İnaktif Kullanıcı Raporu Oluşturma Yöntemleri

1. PowerShell ile Detaylı İnaktif Kullanıcı Raporu Oluşturma

PowerShell, Microsoft 365 yönetimi için en güçlü araçlardan biridir. Aşağıda, detaylı bir inaktif kullanıcı raporu oluşturmak için kullanabileceğiniz adımları ve komut dosyalarını bulacaksınız.

Ön Gereksinimler

  • Windows PowerShell 5.1 veya daha yeni sürüm
  • Exchange Online PowerShell modülü
  • Microsoft Graph PowerShell modülü
  • Global Yönetici veya Exchange Yöneticisi yetkileri

PowerShell Modüllerinin Kurulumu

# 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

Exchange Online’a Bağlanma

# Modern kimlik doğrulama ile Exchange Online'a bağlanın
Connect-ExchangeOnline -UserPrincipalName admin@sirketiniz.com

Microsoft Graph’e Bağlanma

# Microsoft Graph'e bağlanın ve gerekli izinleri alın
Connect-MgGraph -Scopes "User.Read.All", "AuditLog.Read.All"

Gelişmiş İnaktif Kullanıcı Raporu Oluşturma

# Parametreleri tanımlama
param(
    [Parameter(Mandatory=$false)]
    [int]$InactiveDays = 90, # Varsayılan olarak 90 gün

    [Parameter(Mandatory=$false)]
    [string]$OutputPath = "C:\Raporlar\InaktifKullanicilar_$(Get-Date -Format 'yyyyMMdd').csv",

    [Parameter(Mandatory=$false)]
    [switch]$IncludeSharedMailboxes = $false,

    [Parameter(Mandatory=$false)]
    [switch]$IncludeResourceMailboxes = $false
)

# Fonksiyonları tanımlama
function Write-Log {
    param (
        [string]$Message,
        [string]$LogLevel = "INFO"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Write-Host "[$timestamp] [$LogLevel] $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 = [math]::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 = [math]::Round((New-TimeSpan -Start $mailbox.WhenCreated -End (Get-Date)).TotalDays, 0)
    }
    elseif ($stats.LastLogonTime -lt $inactiveDate) {
        $isInactive = $true
        $inactiveDaysCount = [math]::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 = [PSCustomObject]@{
            '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
}

 

Bu PowerShell betiği:

  • Belirtilen gün sayısına göre inaktif kullanıcıları tespit eder (varsayılan: 90 gün)
  • Kullanıcıların son oturum açma tarihlerini, posta kutusu boyutlarını ve öğe sayılarını rapor eder
  • Kullanıcılara atanmış lisansları gösterir
  • Son kullanıcı aktivitesini Azure AD oturum açma kayıtlarından alır
  • İnaktif gün sayısına göre sıralanmış CSV raporu oluşturur
  • İlerleme çubuğu ile işlem durumunu gösterir
  • Detaylı log bilgisi sağlar

Raporun Çalıştırılması

Betiği farklı parametrelerle çalıştırmak için:

# 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"

2. Microsoft 365 Admin Center ile Rapor Alma

PowerShell kullanmak istemeyenler için Microsoft 365 Admin Center aracılığıyla da inaktif kullanıcı raporu oluşturulabilir. Bu yöntem daha sınırlı bilgi sağlasa da, teknik bilgisi daha az olan yöneticiler için kullanımı daha kolaydır.

Adım 1: Microsoft 365 Admin Center’a Giriş

  1. Web tarayıcınızdan https://admin.microsoft.com adresine gidin
  2. Yönetici hesabınızla oturum açın

Adım 2: Raporlar Bölümüne Erişim

  1. Sol menüden “Raporlar” seçeneğine tıklayın
  2. “Kullanım” sekmesini seçin

Adım 3: Kullanıcı Etkinlik Raporunu Görüntüleme

  1. “Microsoft 365 Kullanıcı Etkinlik” raporunu seçin
  2. Sağ üst köşeden rapor için zaman aralığını seçin (son 7 gün, 30 gün, 90 gün veya 180 gün)
  3. “Aktif kullanıcılar” sütununu inceleyerek inaktif kullanıcıları belirleyin

Adım 4: Raporu Dışa Aktarma

  1. Sağ üst köşedeki “Dışa aktar” düğmesine tıklayın
  2. Excel formatında raporu indirin

Rapor Analizi ve Aksiyon Planı

İnaktif kullanıcı raporunuzu oluşturduktan sonra, bu veriler üzerinde yapacağınız analiz ve alacağınız aksiyonlar önemlidir. İşte izlemeniz gereken adımlar:

1. Kullanıcı Kategorilerinin Belirlenmesi

İnaktif kullanıcıları şu kategorilere ayırın:

  • Geçici İnaktif Kullanıcılar: İzin, rapor, doğum izni gibi nedenlerle geçici olarak sistemden uzak olan kullanıcılar
  • İşten Ayrılmış Kullanıcılar: Organizasyondan ayrılmış ancak hesapları kapatılmamış kullanıcılar
  • Düşük Kullanımlı Kullanıcılar: Microsoft 365 hizmetlerini nadiren kullanan çalışanlar
  • Test/Servis Hesapları: Sistem testleri veya otomasyonlar için oluşturulmuş hesaplar

2. Departman Yöneticileri ile Doğrulama

Rapordaki inaktif kullanıcıları ilgili departman yöneticileri ile paylaşarak doğrulayın. Bu adım, gereksiz hesap kapatmalarını önler.

3. Lisans Optimizasyon Stratejisi

İnaktif kullanıcılar için şu stratejilerden birini uygulayın:

  • Lisans Kaldırma: İşten ayrılmış kullanıcıların lisanslarını tamamen kaldırın
  • Lisans Downgrade: Nadiren kullanılan hesaplar için daha düşük seviyeli lisanslara geçiş yapın
  • Hesap Yeniden Tahsisi: Kullanılmayan lisansları yeni çalışanlara veya ihtiyacı olan kullanıcılara yeniden tahsis edin

4. Hesap Yönetimi Politikası

İnaktif kullanıcılar için kurumsal bir politika oluşturun:

  • Geçici Devre Dışı Bırakma: 60 gün inaktif olan hesaplar geçici olarak devre dışı bırakılır
  • Lisans Kaldırma: 90 gün inaktif olan hesapların lisansları kaldırılır
  • Hesap Silme/Arşivleme: 180 gün inaktif olan hesaplar, veriler arşivlendikten sonra silinir

İnaktif Kullanıcı Tespiti için En İyi Uygulamalar

Düzenli Raporlama Takvimi

İnaktif kullanıcı raporlarını düzenli olarak (haftalık, aylık veya üç aylık) oluşturun ve gözden geçirin. Bu düzenlilik, potansiyel sorunların erken tespit edilmesini sağlar.

Otomatik Raporlama

PowerShell betiklerini Windows Görev Zamanlayıcısı ile otomatik olarak çalıştırarak düzenli raporlar oluşturun ve belirli e-posta adreslerine gönderin.

# 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"

Çok Faktörlü İnaktiflik Değerlendirmesi

Sadece son oturum açma tarihine göre değil, aynı zamanda:

  • E-posta kullanım istatistikleri
  • Teams toplantı katılımları
  • SharePoint/OneDrive dosya erişimleri
  • Microsoft 365 uygulamalarının kullanım oranları

gibi çeşitli faktörleri değerlendirerek daha kapsamlı bir inaktiflik analizi yapın.

Microsoft 365 İnaktif Kullanıcı Yönetimi için Ek Kaynaklar

Microsoft Lisans Maliyeti Hesaplayıcı

Microsoft 365 lisans maliyetlerinizi hesaplamak ve optimizasyon fırsatlarını belirlemek için Microsoft’un resmi Lisans Maliyeti Hesaplayıcısı‘nı kullanabilirsiniz.

PowerShell Betik Deposu

Microsoft 365 yönetimi için daha fazla PowerShell betiğine Microsoft 365 DSC GitHub deposundan erişebilirsiniz.

Microsoft 365 Güvenlik Portalı

İnaktif hesapları güvenlik perspektifinden değerlendirmek için Microsoft 365 Güvenlik Portalı‘nı ziyaret edin.

Microsoft 365 ortamınızdaki inaktif kullanıcıların düzenli olarak tespit edilmesi, raporlanması ve yönetilmesi, işletmenizin bulut maliyetlerini optimize etmesine, güvenlik risklerini azaltmasına ve kaynaklarını daha verimli kullanmasına olanak tanır. Bu yazıda paylaşılan PowerShell betikleri ve yöntemler, Microsoft 365 yöneticilerine kapsamlı bir inaktif kullanıcı yönetimi stratejisi oluşturmaları için gerekli araçları sağlamaktadır.

İnaktif kullanıcı raporunuzu oluşturduktan sonra, mutlaka bir aksiyon planı geliştirin ve bu planı düzenli olarak uygulayın. Bu sayede, Microsoft 365 yatırımınızdan maksimum değeri elde edebilir ve organizasyonunuzun dijital varlıklarını güvende tutabilirsiniz.