Příklady PowerShellu a Microsoft Graphu pro licencování na základě skupin v Microsoft Entra ID
Úplné funkce licencování založené na skupinách v Microsoft Entra ID, součást Microsoft Entra, je k dispozici prostřednictvím webu Azure Portal a v současné době existují některé užitečné úlohy, které je možné provést pomocí existujících rutin PROSTŘEDÍ MSOnline PowerShell a Microsoft Graphu. Tento dokument obsahuje příklady toho, co je možné.
Poznámka:
Než začnete spouštět rutiny, ujistěte se, že se nejprve připojíte k vaší organizaci spuštěním rutiny Connect-MsolService
.
Upozorňující
Tento kód je k dispozici jako příklad pro demonstrační účely. Pokud ho chcete použít ve svém prostředí, zvažte jeho testování nejprve v malém měřítku nebo v samostatné testovací organizaci. Možná budete muset kód upravit tak, aby vyhovoval konkrétním potřebám vašeho prostředí.
Přiřazení licencí skupině
Pomocí následující ukázky přiřaďte licence ke skupině pomocí Microsoft Graphu:
POST https://graph.microsoft.com/v1.0/groups/1ad75eeb-7e5a-4367-a493-9214d90d54d0/assignLicense
Content-type: application/json
{
"addLicenses": [
{
"disabledPlans": [ "11b0131d-43c8-4bbb-b2c8-e80f9a50834a" ],
"skuId": "c7df2760-2c81-4ef7-b578-5b5392b571df"
},
{
"disabledPlans": [ "a571ebcc-fqe0-4ca2-8c8c-7a284fd6c235" ],
"skuId": "sb05e124f-c7cc-45a0-a6aa-8cf78c946968"
}
],
"removeLicenses": []
}
Výstup:
HTTP/1.1 202 Accepted
Content-type: application/json
location: https://graph.microsoft.com/v2/d056d009-17b3-4106-8173-cd3978ada898/directoryObjects/1ad75eeb-7e5a-4367-a493-9214d90d54d0/Microsoft.DirectoryServices.Group
{
"id": "1ad75eeb-7e5a-4367-a493-9214d90d54d0",
"deletedDateTime": null,
"classification": null,
"createdDateTime": "2018-04-18T22:05:03Z",
"securityEnabled": true,
}
Zobrazení licencí na produkty přiřazených ke skupině
Rutinu Get-MsolGroup je možné použít k načtení objektu skupiny a kontrole vlastnosti Licenses : obsahuje seznam všech licencí produktů, které jsou aktuálně přiřazené ke skupině.
Poznámka:
Moduly Azure AD a MSOnline PowerShell jsou od 30. března 2024 zastaralé. Další informace najdete v aktualizaci vyřazení. Po tomto datu je podpora těchto modulů omezená na pomoc s migrací na sadu Microsoft Graph PowerShell SDK a opravy zabezpečení. Zastaralé moduly budou dál fungovat až do 30. března 2025.
Doporučujeme migrovat na Microsoft Graph PowerShell , abyste mohli pracovat s Microsoft Entra ID (dříve Azure AD). Běžné dotazy k migraci najdete v nejčastějších dotazech k migraci. Poznámka: Verze 1.0.x msOnline mohou dojít k přerušení po 30. červnu 2024.
(Get-MsolGroup -ObjectId 99c4216a-56de-42c4-a4ac-e411cd8c7c41).Licenses
| Select SkuPartNumber
Výstup:
SkuPartNumber
-------------
ENTERPRISEPREMIUM
EMSPREMIUM
Poznámka:
Zde přeladěná data jsou omezená na informace o produktech (SKU). Pokud chcete vygenerovat seznam zakázaných plánů služeb v licenci, podívejte se na příklady Microsoft Graph PowerShellu pro licencování skupin.
Pomocí následující ukázky získáte stejná data z Microsoft Graphu.
GET https://graph.microsoft.com/v1.0/groups/99c4216a-56de-42c4-a4ac-e411cd8c7c41?$select=assignedLicenses
Výstup:
HTTP/1.1 200 OK
{
"value": [
{
"assignedLicenses": [
{
"accountId":"f1b45b40-57df-41f7-9596-7f2313883635",
"skuId":"c7df2760-2c81-4ef7-b578-5b5392b571df",
"disabledPlans":[]
},
{
"accountId":"f1b45b40-57df-41f7-9596-7f2313883635",
"skuId":" b05e124f-c7cc-45a0-a6aa-8cf78c946968",
"disabledPlans":[]
},
],
}
]
}
Získání všech skupin s licencemi
Všechny skupiny s libovolnou licencí přiřazenou spuštěním následujícího příkazu najdete:
Get-MsolGroup -All | Where {$_.Licenses}
Další podrobnosti o tom, které produkty jsou přiřazeny:
Get-MsolGroup -All | Where {$_.Licenses} | Select `
ObjectId, `
DisplayName, `
@{Name="Licenses";Expression={$_.Licenses | Select -ExpandProperty SkuPartNumber}}
Výstup:
ObjectId DisplayName Licenses
-------- ----------- --------
7023a314-6148-4d7b-b33f-6c775572879a EMS E5 – Licensed users EMSPREMIUM
cf41f428-3b45-490b-b69f-a349c8a4c38e PowerBi - Licensed users POWER_BI_STANDARD
962f7189-59d9-4a29-983f-556ae56f19a5 O365 E3 - Licensed users ENTERPRISEPACK
c2652d63-9161-439b-b74e-fcd8228a7074 EMSandOffice {ENTERPRISEPREMIUM,EMSPREMIUM}
Získání statistik pro skupiny s licencemi
Můžete hlásit základní statistiky pro skupiny s licencemi. V následujícím příkladu skript uvádí celkový počet uživatelů, počet uživatelů s licencemi, které jsou už přiřazené skupinou, a počet uživatelů, pro které skupina licence nemohla přiřadit.
#get all groups with licenses
Get-MsolGroup -All | Where {$_.Licenses} | Foreach {
$groupId = $_.ObjectId;
$groupName = $_.DisplayName;
$groupLicenses = $_.Licenses | Select -ExpandProperty SkuPartNumber
$totalCount = 0;
$licenseAssignedCount = 0;
$licenseErrorCount = 0;
Get-MsolGroupMember -All -GroupObjectId $groupId |
#get full info about each user in the group
Get-MsolUser -ObjectId {$_.ObjectId} | Foreach {
$user = $_;
$totalCount++
#check if any licenses are assigned via this group
if($user.Licenses | ? {$_.GroupsAssigningLicense -ieq $groupId })
{
$licenseAssignedCount++
}
#check if user has any licenses that failed to be assigned from this group
if ($user.IndirectLicenseErrors | ? {$_.ReferencedObjectId -ieq $groupId })
{
$licenseErrorCount++
}
}
#aggregate results for this group
New-Object Object |
Add-Member -NotePropertyName GroupName -NotePropertyValue $groupName -PassThru |
Add-Member -NotePropertyName GroupId -NotePropertyValue $groupId -PassThru |
Add-Member -NotePropertyName GroupLicenses -NotePropertyValue $groupLicenses -PassThru |
Add-Member -NotePropertyName TotalUserCount -NotePropertyValue $totalCount -PassThru |
Add-Member -NotePropertyName LicensedUserCount -NotePropertyValue $licenseAssignedCount -PassThru |
Add-Member -NotePropertyName LicenseErrorCount -NotePropertyValue $licenseErrorCount -PassThru
} | Format-Table
Výstup:
GroupName GroupId GroupLicenses TotalUserCount LicensedUserCount LicenseErrorCount
--------- ------- ------------- -------------- ----------------- -----------------
Dynamics Licen... 9160c903-9f91-4597-8f79-22b6c47eafbf AAD_PREMIUM_P2 0 0 0
O365 E5 - base... 055dcca3-fb75-4398-a1b8-f8c6f4c24e65 ENTERPRISEPREMIUM 2 2 0
O365 E5 - extr... 6b14a1fe-c3a9-4786-9ee4-3a2bb54dcb8e ENTERPRISEPREMIUM 3 3 0
EMS E5 - all s... 7023a314-6148-4d7b-b33f-6c775572879a EMSPREMIUM 2 2 0
PowerBi - Lice... cf41f428-3b45-490b-b69f-a349c8a4c38e POWER_BI_STANDARD 2 2 0
O365 E3 - all ... 962f7189-59d9-4a29-983f-556ae56f19a5 ENTERPRISEPACK 2 2 0
O365 E5 - EXO 102fb8f4-bbe7-462b-83ff-2145e7cdd6ed ENTERPRISEPREMIUM 1 1 0
Access to Offi... 11151866-5419-4d93-9141-0603bbf78b42 STANDARDPACK 4 3 1
Získání všech skupin s chybami licencí
Pokud chcete najít skupiny, které obsahují některé uživatele, pro které se nedají přiřadit licence:
Get-MsolGroup -All -HasLicenseErrorsOnly $true
Výstup:
ObjectId DisplayName GroupType Description
-------- ----------- --------- -----------
11151866-5419-4d93-9141-0603bbf78b42 Access to Office 365 E1 Security Users who should have E1 licenses
Pomocí následujícího příkazu získáte stejná data z Microsoft Graphu.
GET https://graph.microsoft.com/v1.0/groups?$filter=hasMembersWithLicenseErrors+eq+true
Výstup:
HTTP/1.1 200 OK
{
"value":[
{
"odata.type": "Microsoft.DirectoryServices.Group",
"objectType": "Group",
"id": "11151866-5419-4d93-9141-0603bbf78b42",
... # other group properties.
},
{
"odata.type": "Microsoft.DirectoryServices.Group",
"objectType": "Group",
"id": "c57cdc98-0dcd-4f90-a82f-c911b288bab9",
...
},
... # other groups with license errors.
]
"odata.nextLink":"https://graph.microsoft.com/v1.0/ groups?$filter=hasMembersWithLicenseErrors+eq+true&$skipToken=<encodedPageToken>"
}
Získání všech uživatelů s chybami licence ve skupině
Vzhledem k tomu, že skupina obsahuje některé chyby související s licencí, můžete nyní zobrazit seznam všech uživatelů, kterých se tyto chyby týkají. Uživatel může mít také chyby z jiných skupin. V tomto příkladu však omezíme výsledky pouze na chyby relevantní pro danou skupinu tím, že zkontrolujeme vlastnost ReferencedObjectId každé položky IndirectLicenseError pro uživatele.
#a sample group with errors
$groupId = '11151866-5419-4d93-9141-0603bbf78b42'
#get all user members of the group
Get-MsolGroupMember -All -GroupObjectId $groupId |
#get full information about user objects
Get-MsolUser -ObjectId {$_.ObjectId} |
#filter out users without license errors and users with license errors from other groups
Where {$_.IndirectLicenseErrors -and $_.IndirectLicenseErrors.ReferencedObjectId -eq $groupId} |
#display id, name and error detail. Note: we are filtering out license errors from other groups
Select ObjectId, `
DisplayName, `
@{Name="LicenseError";Expression={$_.IndirectLicenseErrors | Where {$_.ReferencedObjectId -eq $groupId} | Select -ExpandProperty Error}}
Výstup:
ObjectId DisplayName License Error
-------- ----------- ------------
6d325baf-22b7-46fa-a2fc-a2500613ca15 Catherine Gibson MutuallyExclusiveViolation
Pomocí následujícího příkazu získáte stejná data z Microsoft Graphu:
GET https://graph.microsoft.com/v1.0/groups/11151866-5419-4d93-9141-0603bbf78b42/membersWithLicenseErrors
Výstup:
HTTP/1.1 200 OK
{
"value":[
{
"odata.type": "Microsoft.DirectoryServices.User",
"objectType": "User",
"id": "6d325baf-22b7-46fa-a2fc-a2500613ca15",
... # other user properties.
},
... # other users.
],
"odata.nextLink":"https://graph.microsoft.com/v1.0/groups/11151866-5419-4d93-9141-0603bbf78b42/membersWithLicenseErrors?$skipToken=<encodedPageToken>"
}
Získání všech uživatelů s chybami licencí v celé organizaci
Následující skript lze použít k získání všech uživatelů, kteří mají chyby licencí z jedné nebo více skupin. Skript vytiskne jeden řádek na uživatele a chybu licence, což vám umožní jasně identifikovat zdroj každé chyby.
Poznámka:
Tento skript vytvoří výčet všech uživatelů v organizaci, což nemusí být pro velké organizace optimální.
Get-MsolUser -All | Where {$_.IndirectLicenseErrors } | % {
$user = $_;
$user.IndirectLicenseErrors | % {
New-Object Object |
Add-Member -NotePropertyName UserName -NotePropertyValue $user.DisplayName -PassThru |
Add-Member -NotePropertyName UserId -NotePropertyValue $user.ObjectId -PassThru |
Add-Member -NotePropertyName GroupId -NotePropertyValue $_.ReferencedObjectId -PassThru |
Add-Member -NotePropertyName LicenseError -NotePropertyValue $_.Error -PassThru
}
}
Výstup:
UserName UserId GroupId LicenseError
-------- ------ ------- ------------
Anna Bergman 0d0fd16d-872d-4e87-b0fb-83c610db12bc 7946137d-b00d-4336-975e-b1b81b0666d0 MutuallyExclusiveViolation
Catherine Gibson 6d325baf-22b7-46fa-a2fc-a2500613ca15 f2503e79-0edc-4253-8bed-3e158366466b CountViolation
Catherine Gibson 6d325baf-22b7-46fa-a2fc-a2500613ca15 11151866-5419-4d93-9141-0603bbf78b42 MutuallyExclusiveViolation
Drew Fogarty f2af28fc-db0b-4909-873d-ddd2ab1fd58c 1ebd5028-6092-41d0-9668-129a3c471332 MutuallyExclusiveViolation
Tady je další verze skriptu, která hledá pouze prostřednictvím skupin obsahujících chyby licencí. Může být optimalizovanější pro scénáře, ve kterých očekáváte, že máte několik skupin s problémy.
$groupIds = Get-MsolGroup -All -HasLicenseErrorsOnly $true
foreach ($groupId in $groupIds) {
Get-MsolGroupMember -All -GroupObjectId $groupId.ObjectID |
Get-MsolUser -ObjectId {$_.ObjectId} |
Where {$_.IndirectLicenseErrors -and $_.IndirectLicenseErrors.ReferencedObjectId -eq $groupId.ObjectID} |
Select DisplayName, `
ObjectId, `
@{Name="LicenseError";Expression={$_.IndirectLicenseErrors | Where {$_.ReferencedObjectId -eq $groupId.ObjectID} | Select -ExpandProperty Error}}
}
Kontrola, jestli je uživatelská licence přiřazená přímo nebo zděděná ze skupiny
U objektu uživatele je možné zkontrolovat, jestli je konkrétní licence produktu přiřazená ze skupiny nebo jestli je přiřazená přímo.
Následující dvě ukázkové funkce se dají použít k analýze typu přiřazení pro jednotlivého uživatele:
#Returns TRUE if the user has the license assigned directly
function UserHasLicenseAssignedDirectly
{
Param([Microsoft.Online.Administration.User]$user, [string]$skuId)
foreach($license in $user.Licenses)
{
#we look for the specific license SKU in all licenses assigned to the user
if ($license.AccountSkuId -ieq $skuId)
{
#GroupsAssigningLicense contains a collection of IDs of objects assigning the license
#This could be a group object or a user object (contrary to what the name suggests)
#If the collection is empty, this means the license is assigned directly - this is the case for users who have never been licensed via groups in the past
if ($license.GroupsAssigningLicense.Count -eq 0)
{
return $true
}
#If the collection contains the ID of the user object, this means the license is assigned directly
#Note: the license may also be assigned through one or more groups in addition to being assigned directly
foreach ($assignmentSource in $license.GroupsAssigningLicense)
{
if ($assignmentSource -ieq $user.ObjectId)
{
return $true
}
}
return $false
}
}
return $false
}
#Returns TRUE if the user is inheriting the license from a group
function UserHasLicenseAssignedFromGroup
{
Param([Microsoft.Online.Administration.User]$user, [string]$skuId)
foreach($license in $user.Licenses)
{
#we look for the specific license SKU in all licenses assigned to the user
if ($license.AccountSkuId -ieq $skuId)
{
#GroupsAssigningLicense contains a collection of IDs of objects assigning the license
#This could be a group object or a user object (contrary to what the name suggests)
foreach ($assignmentSource in $license.GroupsAssigningLicense)
{
#If the collection contains at least one ID not matching the user ID this means that the license is inherited from a group.
#Note: the license may also be assigned directly in addition to being inherited
if ($assignmentSource -ine $user.ObjectId)
{
return $true
}
}
return $false
}
}
return $false
}
Tento skript spustí tyto funkce pro každého uživatele v organizaci pomocí ID skladové položky jako vstupu – v tomto příkladu nás zajímá licence pro Enterprise Mobility + Security, která je v naší organizaci reprezentovaná ID contoso:EMS:
#the license SKU we are interested in. use Get-MsolAccountSku to see a list of all identifiers in your organization
$skuId = "contoso:EMS"
#find all users that have the SKU license assigned
Get-MsolUser -All | where {$_.isLicensed -eq $true -and $_.Licenses.AccountSKUID -eq $skuId} | select `
ObjectId, `
@{Name="SkuId";Expression={$skuId}}, `
@{Name="AssignedDirectly";Expression={(UserHasLicenseAssignedDirectly $_ $skuId)}}, `
@{Name="AssignedFromGroup";Expression={(UserHasLicenseAssignedFromGroup $_ $skuId)}}
Výstup:
ObjectId SkuId AssignedDirectly AssignedFromGroup
-------- ----- ---------------- -----------------
157870f6-e050-4b3c-ad5e-0f0a377c8f4d contoso:EMS True False
1f3174e2-ee9d-49e9-b917-e8d84650f895 contoso:EMS False True
240622ac-b9b8-4d50-94e2-dad19a3bf4b5 contoso:EMS True True
Graph nemá jednoduchý způsob, jak zobrazit výsledek, ale můžete ho vidět z tohoto rozhraní API:
GET https://graph.microsoft.com/v1.0/users/e61ff361-5baf-41f0-b2fd-380a6a5e406a?$select=licenseAssignmentStates
Výstup:
HTTP/1.1 200 OK
{
"value":[
{
"odata.type": "Microsoft.DirectoryServices.User",
"objectType": "User",
"id": "e61ff361-5baf-41f0-b2fd-380a6a5e406a",
"licenseAssignmentState":[
{
"skuId": "157870f6-e050-4b3c-ad5e-0f0a377c8f4d",
"disabledPlans":[],
"assignedByGroup": null, # assigned directly.
"state": "Active",
"error": "None"
},
{
"skuId": "1f3174e2-ee9d-49e9-b917-e8d84650f895",
"disabledPlans":[],
"assignedByGroup": "e61ff361-5baf-41f0-b2fd-380a6a5e406a", # assigned by this group.
"state": "Active",
"error": "None"
},
{
"skuId": "240622ac-b9b8-4d50-94e2-dad19a3bf4b5",
"disabledPlans":[
"e61ff361-5baf-41f0-b2fd-380a6a5e406a"
],
"assignedByGroup": "e61ff361-5baf-41f0-b2fd-380a6a5e406a",
"state": "Active",
"error": "None"
},
{
"skuId": "240622ac-b9b8-4d50-94e2-dad19a3bf4b5",
"disabledPlans":[],
"assignedByGroup": null, # It is the same license as the previous one. It means the license is assigned directly once and inherited from group as well.
"state": " Active ",
"error": " None"
}
],
...
}
],
}
Odebrání přímýchlicencích
Účelem tohoto skriptu je odebrat nepotřebné přímé licence uživatelům, kteří už dědí stejnou licenci ze skupiny; Například jako součást přechodu na licencování na základě skupin.
Poznámka:
Je důležité nejprve ověřit, že přímé licence, které se mají odebrat, neumožňují více funkcí služby než zděděné licence. Jinak odebrání přímé licence může zakázat přístup ke službám a datům pro uživatele. V současné době není možné zkontrolovat přes PowerShell, které služby jsou povolené prostřednictvím zděděných licencí a přímo. Ve skriptu určíme minimální úroveň služeb, které víme, že se dědí ze skupin, a zkontrolujeme, jestli uživatelé neočekávaně nepřijdou o přístup ke službám.
#BEGIN: Helper functions used by the script
#Returns TRUE if the user has the license assigned directly
function UserHasLicenseAssignedDirectly
{
Param([Microsoft.Online.Administration.User]$user, [string]$skuId)
$license = GetUserLicense $user $skuId
if ($license -ne $null)
{
#GroupsAssigningLicense contains a collection of IDs of objects assigning the license
#This could be a group object or a user object (contrary to what the name suggests)
#If the collection is empty, this means the license is assigned directly - this is the case for users who have never been licensed via groups in the past
if ($license.GroupsAssigningLicense.Count -eq 0)
{
return $true
}
#If the collection contains the ID of the user object, this means the license is assigned directly
#Note: the license may also be assigned through one or more groups in addition to being assigned directly
foreach ($assignmentSource in $license.GroupsAssigningLicense)
{
if ($assignmentSource -ieq $user.ObjectId)
{
return $true
}
}
return $false
}
return $false
}
#Returns TRUE if the user is inheriting the license from a specific group
function UserHasLicenseAssignedFromThisGroup
{
Param([Microsoft.Online.Administration.User]$user, [string]$skuId, [Guid]$groupId)
$license = GetUserLicense $user $skuId
if ($license -ne $null)
{
#GroupsAssigningLicense contains a collection of IDs of objects assigning the license
#This could be a group object or a user object (contrary to what the name suggests)
foreach ($assignmentSource in $license.GroupsAssigningLicense)
{
#If the collection contains at least one ID not matching the user ID this means that the license is inherited from a group.
#Note: the license may also be assigned directly in addition to being inherited
if ($assignmentSource -ieq $groupId)
{
return $true
}
}
return $false
}
return $false
}
#Returns the license object corresponding to the skuId. Returns NULL if not found
function GetUserLicense
{
Param([Microsoft.Online.Administration.User]$user, [string]$skuId, [Guid]$groupId)
#we look for the specific license SKU in all licenses assigned to the user
foreach($license in $user.Licenses)
{
if ($license.AccountSkuId -ieq $skuId)
{
return $license
}
}
return $null
}
#produces a list of disabled service plan names for a set of plans we want to leave enabled
function GetDisabledPlansForSKU
{
Param([string]$skuId, [string[]]$enabledPlans)
$allPlans = Get-MsolAccountSku | where {$_.AccountSkuId -ieq $skuId} | Select -ExpandProperty ServiceStatus | Where {$_.ProvisioningStatus -ine "PendingActivation" -and $_.ServicePlan.TargetClass -ieq "User"} | Select -ExpandProperty ServicePlan | Select -ExpandProperty ServiceName
$disabledPlans = $allPlans | Where {$enabledPlans -inotcontains $_}
return $disabledPlans
}
function GetUnexpectedEnabledPlansForUser
{
Param([Microsoft.Online.Administration.User]$user, [string]$skuId, [string[]]$expectedDisabledPlans)
$license = GetUserLicense $user $skuId
$extraPlans = @();
if($license -ne $null)
{
$userDisabledPlans = $license.ServiceStatus | where {$_.ProvisioningStatus -ieq "Disabled"} | Select -ExpandProperty ServicePlan | Select -ExpandProperty ServiceName
$extraPlans = $expectedDisabledPlans | where {$userDisabledPlans -notcontains $_}
}
return $extraPlans
}
#END: helper functions
#BEGIN: executing the script
#the group to be processed
$groupId = "48ca647b-7e4d-41e5-aa66-40cab1e19101"
#license to be removed - Office 365 E3
$skuId = "contoso:ENTERPRISEPACK"
#minimum set of service plans we know are inherited from groups - we want to make sure that there aren't any users who have more services enabled
#which could mean that they may lose access after we remove direct licenses
$servicePlansFromGroups = ("EXCHANGE_S_ENTERPRISE", "SHAREPOINTENTERPRISE", "OFFICESUBSCRIPTION")
$expectedDisabledPlans = GetDisabledPlansForSKU $skuId $servicePlansFromGroups
#process all members in the group and get full info about each user in the group looping through group members.
Get-MsolGroupMember -All -GroupObjectId $groupId | Get-MsolUser -ObjectId {$_.ObjectId} | Foreach {
$user = $_;
$operationResult = "";
#check if Direct license exists on the user
if (UserHasLicenseAssignedDirectly $user $skuId)
{
#check if the license is assigned from this group, as expected
if (UserHasLicenseAssignedFromThisGroup $user $skuId $groupId)
{
#check if there are any extra plans we didn't expect - we are being extra careful not to remove unexpected services
$extraPlans = GetUnexpectedEnabledPlansForUser $user $skuId $expectedDisabledPlans
if ($extraPlans.Count -gt 0)
{
$operationResult = "User has extra plans that may be lost - license removal was skipped. Extra plans: $extraPlans"
}
else
{
#remove the direct license from user
Set-MsolUserLicense -ObjectId $user.ObjectId -RemoveLicenses $skuId
$operationResult = "Removed direct license from user."
}
}
else
{
$operationResult = "User does not inherit this license from this group. License removal was skipped."
}
}
else
{
$operationResult = "User has no direct license to remove. Skipping."
}
#format output
New-Object Object |
Add-Member -NotePropertyName UserId -NotePropertyValue $user.ObjectId -PassThru |
Add-Member -NotePropertyName OperationResult -NotePropertyValue $operationResult -PassThru
} | Format-Table
#END: executing the script
Výstup:
UserId OperationResult
------ ---------------
7c7f860f-700a-462a-826c-f50633931362 Removed direct license from user.
0ddacdd5-0364-477d-9e4b-07eb6cdbc8ea User has extra plans that may be lost - license removal was skipped. Extra plans: SHAREPOINTWAC
aadbe4da-c4b5-4d84-800a-9400f31d7371 User has no direct license to remove. Skipping.
Poznámka:
Než spustíte výše uvedený skript, aktualizujte hodnoty proměnných $skuId
a $groupId
které jsou cílem odebrání přímých licencí podle vašeho testovacího prostředí.
Další kroky
Další informace o sadě funkcí pro správu licencí prostřednictvím skupin najdete v následujících článcích:
- Co je licencování založené na skupinách v Microsoft Entra ID?
- Přiřazení licencí ke skupině v Microsoft Entra ID
- Identifikace a řešení problémů s licencemi pro skupinu v ID Microsoft Entra
- Jak migrovat jednotlivé licencované uživatele na licencování na základě skupin v Microsoft Entra ID
- Jak migrovat uživatele mezi licencemi na produkty pomocí licencování na základě skupin v Microsoft Entra ID
- Další scénáře licencování založené na skupinách Microsoft Entra
- Příklady PowerShellu pro licencování na základě skupin v Microsoft Entra ID