M365 Solutions Hub Logo M365
SOLUTIONS HUB
Microsoft Graph API ile M365 Lisanslarını Toplu Değiştirme
#microsoft #powershell #microsoft-graph

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.

İzinlerUser.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.

Mustafa Emre Soner

Yazar

Mustafa Emre Soner

MW & Security Manager

LinkedIn'de takip et