M365 Solutions Hub Logo M365
SOLUTIONS HUB
Teams Toplantı Kayıtlarının Süre Sonunu Graph API ile Kaldırma
#microsoft #microsoft-teams #powershell #microsoft-graph

Teams Toplantı Kayıtlarının Süre Sonunu Graph API ile Kaldırma

8 Haziran 2026 · 4 dk okuma

Helpdesk’te benzer biletler birikmeye başladı. “Toplantı kaydım silindi.” “Kayıt süre sonu dolmuş.” “Geçen ayki eğitim videosuna ulaşamıyorum.” Farklı kullanıcılar, aynı sorun.

Teams toplantı kayıtları 2021’den itibaren Microsoft Stream yerine OneDrive’a kaydediliyor. Bu geçişle birlikte Microsoft, yeni mp4 dosyalarına otomatik bir süre sonu atıyor; varsayılan 60 gün. Kullanıcılar dolmadan önce bildirim alıyor, uzatmazlarsa kayıt gidiyor.

Ne Denedim

Teams Admin Center’daki “Kayıt süresi dolumu” ayarına baktım önce. Yalnızca yeni kayıtları etkiliyor, mevcut dosyalara geriye dönük bir şey yapmıyor. SharePoint Admin Center’da DriveItem düzeyinde süre sonu yönetimi yok. Elle OneDrive’a girip “Süre sonunu kaldır” seçmek de mümkün, ancak 50 kayıt için 50 ayrı tıklama demek.

Microsoft Graph API’de expirationDateTime özelliğini $null olarak güncellemek sorunu çözüyor. Aşağıda üç senaryo için script var.

Ön Koşullar

Install-Module Microsoft.Graph -Scope CurrentUser
Connect-MgGraph -Scopes "Files.ReadWrite.All","Sites.ReadWrite.All","User.Read.All"

Yöntem 1 — Tek Kullanıcı

Belirli bir kullanıcının OneDrive’ındaki tüm mp4 dosyalarının süre sonunu kaldırmak için:

$User = "kullanici@sirket.com"
$Drive = Get-MgUserDrive -UserId $User
$Items = Get-MgDriveItem -DriveId $Drive.Id -All

$Recordings = $Items | Where-Object { $_.Name -like "*.mp4" }

foreach ($rec in $Recordings) {
    Update-MgDriveItem -DriveId $Drive.Id -ItemId $rec.Id -AdditionalProperties @{
        expirationDateTime = $null
    }
    Write-Host "[+] Süre sonu kaldırıldı: $($rec.Name)" -ForegroundColor Green
}

Write-Host "`nTamamlandı. $($Recordings.Count) kayıt güncellendi." -ForegroundColor Cyan

expirationDateTime = $null süre sonunu tamamen kaldırır, dosya süresiz kalır.

Yöntem 2 — Tüm Organizasyon (Toplu)

Kiracıdaki tüm etkin kullanıcıların kayıtlarını tek seferde güncellemek için:

Connect-MgGraph -Scopes "Files.ReadWrite.All","Sites.ReadWrite.All","User.Read.All"

$users        = Get-MgUser -All -Filter "accountEnabled eq true"
$totalUpdated = 0
$totalErrors  = 0
$logFile      = "$env:USERPROFILE\Documents\TeamsRecordingReset_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"

Write-Host "[*] $($users.Count) kullanıcı taranıyor..." -ForegroundColor Cyan

foreach ($user in $users) {
    try {
        $drive = Get-MgUserDrive -UserId $user.Id -ErrorAction Stop
        $items = Get-MgDriveItem -DriveId $drive.Id -All -ErrorAction Stop

        $recordings = $items | Where-Object {
            $_.Name -like "*.mp4" -and
            $_.AdditionalProperties.ContainsKey("expirationDateTime")
        }

        foreach ($rec in $recordings) {
            Update-MgDriveItem -DriveId $drive.Id -ItemId $rec.Id -AdditionalProperties @{
                expirationDateTime = $null
            }
            Write-Host "    [+] $($user.UserPrincipalName)$($rec.Name)" -ForegroundColor Green
            Add-Content $logFile "$($user.UserPrincipalName) | $($rec.Name) | SUCCESS"
            $totalUpdated++
        }
    }
    catch {
        Write-Host "    [!] $($user.UserPrincipalName): $($_.Exception.Message)" -ForegroundColor Yellow
        Add-Content $logFile "$($user.UserPrincipalName) | ERROR | $($_.Exception.Message)"
        $totalErrors++
    }
}

Write-Host "`n[*] Tamamlandı: $totalUpdated kayıt güncellendi, $totalErrors hata." -ForegroundColor Cyan
Write-Host "Log: $logFile" -ForegroundColor DarkGray

Büyük kiracılarda bu işlem uzun sürebilir. Log dosyası her satırı anlık yazıyor, ayrı bir terminal penceresiyle takip edebilirsiniz.

Yöntem 3 — Belirli Kullanıcı Listesinden

Belirli bir departmanın veya elle belirlediğiniz kullanıcıların kayıtlarını güncellemek için:

Connect-MgGraph -Scopes "Files.ReadWrite.All","Sites.ReadWrite.All"

$userList     = Get-Content "$env:USERPROFILE\Documents\users.txt"
$totalUpdated = 0

foreach ($upn in $userList) {
    try {
        $drive      = Get-MgUserDrive -UserId $upn -ErrorAction Stop
        $items      = Get-MgDriveItem -DriveId $drive.Id -All -ErrorAction Stop
        $recordings = $items | Where-Object { $_.Name -like "*.mp4" }

        foreach ($rec in $recordings) {
            Update-MgDriveItem -DriveId $drive.Id -ItemId $rec.Id -AdditionalProperties @{
                expirationDateTime = $null
            }
            Write-Host "[+] $upn$($rec.Name)" -ForegroundColor Green
            $totalUpdated++
        }
    }
    catch {
        Write-Host "[!] $upn : $($_.Exception.Message)" -ForegroundColor Red
    }
}

Write-Host "`nTamamlandı. $totalUpdated kayıt güncellendi." -ForegroundColor Cyan

users.txt formatı (her satırda bir UPN):

ahmet.yilmaz@sirket.com
ayse.kaya@sirket.com
mehmet.demir@sirket.com

Script Çıktısı (Yöntem 2 Örneği)

[*] 147 kullanıcı taranıyor...

[+] ahmet.yilmaz@sirket.com → Proje Toplantısı - 2026-03-14.mp4 [+] ahmet.yilmaz@sirket.com → Sprint Review - 2026-04-01.mp4 [+] ayse.kaya@sirket.com → Eğitim Kaydı - Onboarding.mp4 [!] mehmet.demir@sirket.com: Resource ‘drive’ does not exist or one of its queried reference-property names is not found. [+] fatma.celik@sirket.com → Yönetim Kurulu - 2026-05-10.mp4

[*] Tamamlandı: 38 kayıt güncellendi, 3 hata. Log: C:\Users\mesoner\Documents\TeamsRecordingReset_20260614_091532.log

[!] ile işaretlenen satırlar genellikle OneDrive’ı hiç açılmamış veya lisanssız hesaplardır. Script bu durumları atlayarak devam eder.

Dikkat Edilmesi Gerekenler

Mp4 filtresi geniş kapsamlı

Script .mp4 uzantılı her dosyayı hedefliyor. Teams kayıtları her zaman mp4 formatında, ama kullanıcının OneDrive’ında başka mp4 dosyaları da olabilir. Yöntem 2’deki filtreye $_.Name -like "*Recording*" koşulunu eklerseniz yalnızca Teams’in oluşturduğu dosyalara dokunursunuz; Teams, kayıt adlarını bu kalıpla oluşturuyor.

Script mevcut kayıtları düzeltiyor, yenilerini değil

Bu scripti çalıştırdıktan sonra oluşturulan kayıtlar yine otomatik süre sonu alacak. Kalıcı çözüm için Teams Admin Center’da Toplantı Politikaları altındaki “Kayıt süresi dolumu” ayarını “Süresi dolmasın” olarak değiştirin.

Uygulama izinleriyle de çalışır

Files.ReadWrite.All ve Sites.ReadWrite.All yetkilerini Delegated yerine Application Permission olarak atarsanız kullanıcı oturum açmadan servis hesabıyla çalıştırabilirsiniz.

OneDrive’ı olmayan hesaplar hata verir

Get-MgUserDrive lisanssız veya hiç giriş yapmamış hesaplarda hata döndürür. Yöntem 2 bunu yakalar ve loglar, işlemi durdurmaz.

Mustafa Emre Soner

Yazar

Mustafa Emre Soner

MW & Security Manager

LinkedIn'de takip et