PowerShell ile Teams ve Sharepointte Toplu Dosya Silme

Bir önceki yazımızda kullanıcıların kişisel OneDrive alanlarında nasıl temizlik yapacağımızı incelemiştik. Ancak şirketlerde veri birikmesi sadece kişisel alanlarda olmaz; Microsoft Teams ekiplerinin ortak dosya alanları da zamanla dijital bir çöplüğe dönüşebilir.

Özellikle İnsan Kaynakları (İK) gibi departmanların kullandığı Teams kanallarında, adaylardan gelen “CV” veya “Özgeçmiş” dosyaları “General” klasörü altında unutulabiliyor. Bu durum KVKK ve GDPR açısından ciddi bir risk oluşturur.

Bu rehberde, Microsoft Graph API kullanarak belirli bir Teams ekibinin “General” klasörünü tarayan ve ismi CV, Özgeçmiş olan dosyaları nokta atışı tespit edip silen bir PowerShell scripti hazırlayacağız.

Neden Klasik Silme Yerine Bu Script?

Standart dosya silme işlemlerinden farklı olarak bu script Regex (Düzenli İfade) kullanır. Yani sadece dosya adında “CV” geçen her şeyi silmez; kelimenin bütünlüğüne bakar.

  • Örnek: Ahmet_Yilmaz_CV.pdf -> SİLİNİR.

  • Örnek: Project_CV_Analizi.xlsx -> SİLİNİR.

  • Örnek: Takvim.xlsx (İçinde ‘cv’ harfleri yan yana olsa bile kelime bütünlüğü yoksa) -> SİLİNMEZ.

Hazırlık Aşaması

Scriptin çalışması için Azure AD üzerinde bir App Registration oluşturup Files.ReadWrite.All ve Sites.ReadWrite.All izinlerini vermeniz gerekmektedir.

1. Kimlik Doğrulama

İlk olarak Azure AD üzerinden aldığımız bilgilerle Graph API’ye bağlanıyoruz.

# === Kimlik Bilgileri ===
$tenantId     = "YOUR_TENANT_ID_GUID"
$clientId     = "YOUR_APP_CLIENT_ID"
$clientSecret = "YOUR_CLIENT_SECRET_VALUE"

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

$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 Ekip ve Klasöre Erişim

Microsoft Teams’de her dosya aslında arka planda bir SharePoint sitesinde tutulur. Bu yüzden önce Ekip adına göre Site ID’sini, sonra Drive ID’sini ve son olarak “General” klasörünü buluyoruz.

# === Hedef Ekip ===
# Teams'deki ekibin tam adını buraya yazın (Örn: InsanKaynaklari)
$teamName = "InsanKaynaklari"   

# 1. Site ID'yi bul
$siteInfo = Invoke-RestMethod -Headers $Headers -Uri "https://graph.microsoft.com/v1.0/sites/root:/sites/$teamName"
$siteId = $siteInfo.id

# 2. Belge Kitaplığı (Drive) ID'sini bul
$driveInfo = Invoke-RestMethod -Headers $Headers -Uri "https://graph.microsoft.com/v1.0/sites/$siteId/drive"
$driveId = $driveInfo.id

# 3. "General" klasörünün içeriğini listele
$generalFolder = Invoke-RestMethod -Headers $Headers -Uri "https://graph.microsoft.com/v1.0/drives/$driveId/root:/General:/children"

3. Akıllı Tarama ve Silme Döngüsü

İşte Teams toplu dosya silme işleminin en kritik noktası. Aşağıdaki döngü, dosya isimlerini özel karakterlere (boşluk, alt çizgi, nokta vb.) göre ayırır ve sadece tam eşleşme sağlayan dosyaları siler.

# Ayırıcı karakterler (Boşluk, tire, nokta, parantez vb.)
$sep = "[\s_\-\(\)\[\]\.]"

Write-Host "--- $teamName Ekibi Taranıyor ---"

foreach ($file in $generalFolder.value) {
    # Regex Kontrolü: Dosya adının başında, sonunda veya ayırıcılar arasında "cv" veya "özgeçmiş" var mı?
    if ($file.name -match "(?i)(^|$sep)(cv|özgeçmiş|ozgecmis)($sep|$)") {
        
        Write-Host "🗑️ SİLİNİYOR: $($file.name)" -ForegroundColor Red
        
        # Silme İsteği
        $deleteUrl = "https://graph.microsoft.com/v1.0/drives/$driveId/items/$($file.id)"
        Invoke-RestMethod -Method Delete -Headers $Headers -Uri $deleteUrl
    
    } else {
        Write-Host "✅ Güvenli: $($file.name)" -ForegroundColor Green
    }
}

Write-Host "`nİşlem Tamamlandı."

Özet

Bu script sayesinde, özellikle İnsan Kaynakları gibi hassas veri barındıran ekiplerin “General” klasörlerini düzenli olarak tarayabilir ve KVKK uyumluluğunu otomatize edebilirsiniz. Bu işlemi Windows Görev Zamanlayıcı’ya bağlayarak haftalık periyotlarla çalışmasını sağlayabilirsiniz.


Dikkat Edilmesi Gereken Küçük Bir Detay

Scriptteki $teamName değişkeni, SharePoint site URL’sindeki isimle eşleşmelidir. Eğer Teams ekibinizin adı “İK Ekibi” ise, URL genellikle .../sites/IKEkibi şeklinde olur. Scriptte URL’deki takma adı (alias) kullanmaya özen gösterin.