Microsoft Graph API ile M365 Lisanslarını Toplu Değiştirme
31 Mayıs 2026 · 3 dk okuma
M365 yöneticilerinin sık karşılaştığı durumlardan biri: onlarca veya yüzlerce kullanıcının lisansını değiştirmek. Admin Center’dan tek tek yapmak hem zaman alır hem de hata riskini artırır. Microsoft Graph PowerShell ile bu işlemi birkaç satırda halledebilirsiniz.
Ön Koşullar
Microsoft Graph modülü yüklü ve bağlantı kurulmuş olmalı:
Install-Module Microsoft.Graph -Scope CurrentUser
Connect-MgGraph -Scopes "User.ReadWrite.All"
Adım 1 — Ortamdaki SKU’ları Görün
Hangi lisansın hangi SkuPartNumber ile eşleştiğini öğrenmek için:
Get-MgSubscribedSku | Select SkuPartNumber, SkuId, ConsumedUnits
Çıktıda SPE_E3 (Microsoft 365 E3), SPE_E5 (Microsoft 365 E5) gibi kodları göreceksiniz. Geçişi yapacağınız iki lisansın SkuId değerlerini not alın.
Yöntem 1 — Tek Pipeline ile Hızlı Geçiş
E3 lisansı olan tüm kullanıcıları bulup E5 ile değiştirmek için:
$e3 = (Get-MgSubscribedSku | Where-Object SkuPartNumber -eq "SPE_E3").SkuId
$e5 = (Get-MgSubscribedSku | Where-Object SkuPartNumber -eq "SPE_E5").SkuId
Get-MgUser -All -Filter "assignedLicenses/any(x:x/skuId eq $e3)" |
ForEach-Object {
Set-MgUserLicense -UserId $_.Id -AddLicenses @{SkuId=$e5} -RemoveLicenses @($e3)
}
Bu yöntem küçük ortamlar için idealdir. Set-MgUserLicense aynı anda eski lisansı kaldırıp yenisini ekler — ara kalmaz, hizmet kesintisi olmaz.
Yöntem 2 — Hata Yönetimli Versiyon (Log ile)
Büyük ortamlarda veya production geçişlerinde her kullanıcı için sonucu kaydetmek kritik:
$oldSku = Get-MgSubscribedSku -All | Where-Object { $_.SkuPartNumber -eq "ESKI_LISANS" }
$newSku = Get-MgSubscribedSku -All | Where-Object { $_.SkuPartNumber -eq "YENI_LISANS" }
$users = Get-MgUser -All -Filter "assignedLicenses/any(x:x/skuId eq $($oldSku.SkuId))"
Write-Host "Toplam $($users.Count) kullanıcı bulundu. İşlem başlıyor..." -ForegroundColor Yellow
foreach ($user in $users) {
try {
Write-Host "Lisans değiştiriliyor: $($user.UserPrincipalName)"
Set-MgUserLicense -UserId $user.Id `
-AddLicenses @{SkuId = $newSku.SkuId} `
-RemoveLicenses @($oldSku.SkuId)
Write-Host "OK -> $($user.UserPrincipalName)" -ForegroundColor Green
Add-Content -Path "$env:USERPROFILE\Documents\LicenseLog.txt" `
-Value "$($user.UserPrincipalName) - SUCCESS"
}
catch {
Write-Host "HATA -> $($user.UserPrincipalName): $($_.Exception.Message)" -ForegroundColor Red
Add-Content -Path "$env:USERPROFILE\Documents\LicenseLog.txt" `
-Value "$($user.UserPrincipalName) - $($_.Exception.Message)"
}
}
Write-Host "TAMAMLANDI" -ForegroundColor Cyan
SkuPartNumber değerlerini kendi ortamınıza göre değiştirin. Log dosyası Documents\LicenseLog.txt konumuna yazılır; işlem sonrası kimin başarılı/başarısız olduğunu buradan takip edebilirsiniz.
Yöntem 3 — Belirli Kullanıcılardan Lisans Kaldırma
Bazen belirli bir grubu bir .txt dosyasından okuyup sadece o kullanıcıların lisansını kaldırmanız gerekebilir:
$sku = Get-MgSubscribedSku -All | Where-Object { $_.SkuPartNumber -eq "KALDIRILACAK_LISANS" }
# Her satırda bir UPN olan liste
$users = Get-Content "$env:USERPROFILE\Documents\users.txt"
Write-Host "Toplam $($users.Count) kullanıcı. İşlem başlıyor..." -ForegroundColor Yellow
foreach ($u in $users) {
try {
Set-MgUserLicense -UserId $u `
-AddLicenses @() `
-RemoveLicenses @($sku.SkuId)
Write-Host "OK -> $u" -ForegroundColor Green
Add-Content -Path "$env:USERPROFILE\Documents\LicenseLog.txt" -Value "$u - SUCCESS"
}
catch {
Write-Host "HATA -> $u : $($_.Exception.Message)" -ForegroundColor Red
Add-Content -Path "$env:USERPROFILE\Documents\LicenseLog.txt" -Value "$u - $($_.Exception.Message)"
}
}
Write-Host "TAMAMLANDI" -ForegroundColor Cyan
users.txt dosyasında her satıra bir UPN yazmanız yeterli:
ahmet.yilmaz@sirket.com
ayse.kaya@sirket.com
mehmet.demir@sirket.com
Dikkat Edilmesi Gerekenler
Lisans sayısı yeterliliği — Yeni lisanslarda yeterli koltuk olduğundan emin olun. ConsumedUnits ile PrepaidUnits değerlerini karşılaştırın.
Servis planı çakışmaları — Bazı geçişlerde iki lisansta çakışan servis planları hata verebilir. Bu durumda önce eski lisansı kaldırıp kısa bir süre sonra yeniyi ekleyebilirsiniz.
Test ortamı — Production’a uygulamadan önce birkaç test kullanıcısı üzerinde deneyin.
İzinler — User.ReadWrite.All kapsamı gerekiyor. Servis hesabı kullanıyorsanız uygulama izinleri ile de çalışabilirsiniz.
Bu üç yöntemden birini seçmek için ihtiyacınıza bakın: hız mı, hata yönetimi mi, yoksa belirli bir liste mi? Tüm senaryolar için temel mantık aynı — Set-MgUserLicense ile aynı anda AddLicenses ve RemoveLicenses.