The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

批次更換 Microsoft 365 授權的 PowerShell 腳本範例

這幾天公司的 Office 365 授權要到期了,必須全員更換到 Microsoft 365 授權,由於現在人比較多,連在 Microsoft 365 admin center全選批次套用變更都沒辦法,而且一個人一個人檢查現有授權也很麻煩,所以打算寫 PowerShell 來完成這個工作。

  1. 首先,我們要先取得已經購買的授權清單

    (Get-AzureADSubscribedSku).SkuPartNumber
    

    這裡會列出許多 SKU 的 Part Number (零件編號),簡單來說這就是微軟公司內部的產品名稱,PowerShell 必須使用這組名稱才能做設定。

    STREAM
    EMSPREMIUM
    DEVELOPERPACK
    POWERAPPS_INDIVIDUAL_USER
    POWER_BI_PRO
    AAD_BASIC
    WINDOWS_STORE
    ENTERPRISEPACK
    FLOW_FREE
    CCIBOTS_PRIVPREV_VIRAL
    POWERAPPS_VIRAL
    POWER_BI_STANDARD
    EMS
    SPE_E3
    RIGHTSMANAGEMENT_ADHOC
    

    這裡 ENTERPRISEPACK 就是 Office 365 E3 授權的 SKU 名稱,而 SPE_E3 就是 Microsoft 365 E3 的 SKU 名稱!

  2. 列出特定一位使用者目前設定好的授權清單

    $userUPN="username@miniasp.com"
    $userList = Get-AzureADUser -ObjectID $userUPN | Select -ExpandProperty AssignedLicenses | Select SkuID
    $userList | ForEach { $sku=$_.SkuId ; $licensePlanList | ForEach { If ( $sku -eq $_.ObjectId.substring($_.ObjectId.length - 36, 36) ) { Write-Host $_.SkuPartNumber } } }
    
  3. 設定使用者授權

    接著就是取得全公司所有帳號,去掉 Guest 訪客帳號,經過一連串比對就可以決定該要怎樣調整使用者授權,最後我用 Set-MsolUserLicense 更新使用者的授權設定。

    $AADName = 'miniasp'
    
    $users = Get-AzureADUser | Where-Object { $_.UserType -ne 'Guest' } | Select-Object UserPrincipalName
    
    foreach ($user in $users)
    {
        $userUPN = $user.UserPrincipalName
    
        Write-Host "############################# $userUPN #############################"
    
        $is_old_license=$false
        $is_new_license=$false
    
        $userList = Get-AzureADUser -ObjectID $userUPN | Select -ExpandProperty AssignedLicenses | Select SkuID
        $userList | ForEach {
            $sku=$_.SkuId
            $licensePlanList | ForEach {
                If ( $sku -eq $_.ObjectId.substring($_.ObjectId.length - 36, 36) ) {
                    If ( $_.SkuPartNumber -eq 'ENTERPRISEPACK' ) { $is_old_license = $true; Write-Host "Old License:" $_.SkuPartNumber }
                    If ( $_.SkuPartNumber -eq 'SPE_E3' )         { $is_new_license = $true; Write-Host "New License:" $_.SkuPartNumber }
                }
            }
        }
    
        if ( $is_old_license -and $is_new_license ) {
            # 兩個授權都有,只要刪除舊的授權
            Write-Host "The 'ENTERPRISEPACK' license should be removed."
            Set-MsolUserLicense -UserPrincipalName $userUPN -RemoveLicenses '${$AADName}:ENTERPRISEPACK'
        }
        elseif ( $is_old_license -and (-not $is_new_license)) {
            # 只有舊的授權,就置換成新的授權
            Write-Host "The 'ENTERPRISEPACK' license should be replaced with 'SPE_E3' license."
            Set-MsolUserLicense -UserPrincipalName $userUPN -AddLicenses '${$AADName}:SPE_E3' -RemoveLicenses '${$AADName}:ENTERPRISEPACK'
        }
        elseif ( (-not $is_old_license) -and ($is_new_license)) {
            # 只有新的授權,就代表設定正確!
            Write-Host "The new License 'SPE_E3' is applied correctly."
        }
        elseif ( (-not $is_old_license) -and (-not $is_new_license)) {
            # 兩個授權都沒有,基本上就不特別設定
            Write-Host "No License is available on this user."
        }
    }
    

相關連結