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)
[+] 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.