這幾天公司的 Office 365 授權要到期了,必須全員更換到 Microsoft 365 授權,由於現在人比較多,連在 Microsoft 365 admin center 想全選並批次套用變更都沒辦法,而且一個人一個人檢查現有授權也很麻煩,所以打算寫 PowerShell 來完成這個工作。
-
首先,我們要先取得已經購買的授權清單
(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 名稱!
-
列出特定一位使用者目前設定好的授權清單
$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 } } }
-
設定使用者授權
接著就是取得全公司所有帳號,去掉 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."
}
}
相關連結