Microsoft Graph API ve PowerShell ile OneDrive’da Toplu Dosya Temizliği

Bir sistem yöneticisi olarak, şirket politikaları veya KVKK süreçleri gereği kullanıcıların depolama alanlarında temizlik yapmanız gerekebilir. Özellikle eski CV’ler veya kişisel belgeler gibi istenmeyen dosyaların temizlenmesi zaman alıcıdır. Bu rehberde, Microsoft Graph API kullanarak OneDrive toplu dosya silme işlemini nasıl otomatize edebileceğinizi anlatacağım.

Bu yöntem sayesinde, belirlediğiniz kriterlere uyan (örneğin isminde “Özgeçmiş” geçen) dosyaları tek tek aramak yerine, PowerShell scripti ile saniyeler içinde silebilirsiniz.

Neden OneDrive Toplu Dosya Silme Scripti Kullanmalısınız?

Manuel silme işlemleri yüzlerce kullanıcı için imkansızdır. OneDrive toplu dosya silme işlemi için hazırladığımız bu script şunları yapar:

  • Tüm alt klasörleri derinlemesine tarar.

  • Belirlenen dosya isimlerini (Regex ile) tespit eder.

  • Dosyaları otomatik olarak siler.

Ön Hazırlık: Azure AD Uygulama Ayarları

Bu scriptin çalışması için Azure üzerinde bir uygulama kaydı (App Registration) oluşturmalısınız. Detaylı bilgi için Microsoft’un resmi Graph API dokümantasyonuna göz atabilirsiniz.

(Buraya Azure Portal’dan “API Permissions” ekranının bir ekran görüntüsünü ekleyin. Görselin “Alt Metin / Alt Text” kısmına OneDrive toplu dosya silme izinleri yazın.)

Gerekli izinler: Files.ReadWrite.All

1. Kimlik Doğrulama ve Token Alma

İlk adımda API’ye erişim için yetki alıyoruz. Aşağıdaki scriptte Tenant ID, Client ID ve Client Secret alanlarını kendi bilgilerinizle doldurun.

# === Kimlik Bilgileri (Burayı Kendi Bilgilerinizle Doldurun) ===
$tenantId     = "YOUR_TENANT_ID_GUID"       # Azure Tenant ID
$clientId     = "YOUR_APP_CLIENT_ID"        # Application (Client) ID
$clientSecret = "YOUR_CLIENT_SECRET_VALUE"  # Client Secret

# === Token Al ===
$body = @{
    grant_type    = "client_credentials"
    scope         = "https://graph.microsoft.com/.default"
    client_id     = $clientId
    client_secret = $clientSecret
}

# Token isteği gönderiliyor
$tokenRequest = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Body $body
$token = $tokenRequest.access_token
$Headers = @{ Authorization = "Bearer $token" }

2. Hedef Kullanıcı Listesi

Hangi kullanıcıların taranacağını belirlediğimiz dizi. Gerçek senaryolarda bu listeyi bir CSV dosyasından da çekebilirsiniz (Import-Csv ile), ancak belirli kişiler için manuel liste aşağıdaki gibidir:

# === Taranacak Kullanıcı Listesi ===
$users = @(
    "ahmet.yilmaz@sirket.com",
    "ayse.demir@sirket.com",
    "mehmet.kaya@sirket.com"
)

3. Rekürsif (Özyinelemeli) Tarama Fonksiyonu

Scriptin kalbi burasıdır. OneDrive içindeki klasör yapısı iç içe geçmiş olabilir. Bu yüzden fonksiyonumuz:

  1. Bir klasöre girer.

  2. Eğer içeride başka bir klasör varsa, kendisini tekrar çağırır (Recursion).

  3. Eğer dosya varsa ismini kontrol eder.

  4. İsmi belirlediğimiz kritere (Regex: cv|ozgecmis|özgeçmiş) uyuyorsa dosyayı siler.

# === Tüm OneDrive'ı Tarayıp Silme Fonksiyonu ===
function Scan-And-DeleteFiles {
    param (
        [string]$driveId,
        [string]$folderId
    )

    # O anki klasörün içeriğini (çocuk öğeleri) getir
    $itemsUrl = "https://graph.microsoft.com/v1.0/drives/$driveId/items/$folderId/children"
    try {
        $items = Invoke-RestMethod -Headers $Headers -Uri $itemsUrl -Method Get
    } catch {
        Write-Host "Uyarı: Klasör içeriği okunamadı veya yetki yok -> $folderId" -ForegroundColor Yellow
        return
    }

    foreach ($item in $items.value) {
        if ($item.folder -ne $null) {
            # Öğe bir klasörse, fonksiyonu tekrar çağırarak içine gir (Derinlemesine tarama)
            Scan-And-DeleteFiles -driveId $driveId -folderId $item.id
        } else {
            # Öğe bir dosyaysa ismini Regex ile kontrol et
            # (?i) parametresi büyük/küçük harf duyarlılığını kaldırır.
            if ($item.name -match "(?i)cv|ozgecmis|özgeçmiş") {
                Write-Host "🗑️ BULUNDU VE SİLİNİYOR: $($item.name)" -ForegroundColor Red
                
                # Silme işlemi
                $deleteUrl = "https://graph.microsoft.com/v1.0/drives/$driveId/items/$($item.id)"
                Invoke-RestMethod -Method Delete -Headers $Headers -Uri $deleteUrl
            }
        }
    }
}

4. İşlemi Başlatma

Son olarak, belirlediğimiz kullanıcı listesi üzerinde döngü kurarak her kullanıcının “Drive ID”sini alıyor ve tarama fonksiyonunu kök (root) klasörden başlatıyoruz.

# === Kullanıcılar İçin İşlemi Başlat ===
foreach ($user in $users) {
    Write-Host "`n===== $user Hesabı Taranıyor =====" -ForegroundColor Cyan
    try {
        # Kullanıcının varsayılan Drive ID'sini al
        $drive = Invoke-RestMethod -Headers $Headers -Uri "https://graph.microsoft.com/v1.0/users/$user/drive"
        $driveId = $drive.id

        # OneDrive kök (root) klasör ID'sini al
        $root = Invoke-RestMethod -Headers $Headers -Uri "https://graph.microsoft.com/v1.0/drives/$driveId/root"
        
        # Taramayı başlat
        Scan-And-DeleteFiles -driveId $driveId -folderId $root.id

    } catch {
        Write-Host "🚫 $user için erişim hatası. Kullanıcı lisansı veya OneDrive kurulumu eksik olabilir." -ForegroundColor DarkGray
    }
}

Write-Host "`n✅ Tüm işlemler tamamlandı." -ForegroundColor Green

Bu adımları uyguladığınızda şirket genelinde temiz, güvenli ve düzenli bir dosya yapısına kavuşmuş olacaksınız. Daha fazla sistem yönetimi ipucu için blogumuzdaki diğer PowerShell yazılarına göz atmayı unutmayın.

Önemli Notlar

  • Regex Kullanımı: Kod içerisindeki -match "(?i)cv|ozgecmis|özgeçmiş" kısmı dosya isminde bu kelimelerden biri geçiyorsa (büyük küçük harf fark etmeksizin) eşleşme sağlar. Bunu ihtiyacınıza göre düzenleyebilirsiniz.

  • Silme İşlemi: Invoke-RestMethod -Method Delete komutu dosyayı kalıcı olarak veya Geri Dönüşüm Kutusu’na (Graph API ayarına göre) gönderir. Canlı ortamda çalıştırmadan önce mutlaka test kullanıcısında deneme yapınız.