Public/Functions/Licensing/Get-TeamsUserLicenseServicePlan.ps1
# Module: TeamsFunctions # Function: Licensing # Author: David Eberhardt # Updated: 01-APR-2020 # Status: Live function Get-TeamsUserLicenseServicePlan { <# .SYNOPSIS Returns License information (ServicePlans) for an Object in AzureAD .DESCRIPTION Returns an Object containing all Teams related ServicePlans (for Licenses assigned) for a specific Object .PARAMETER Identity The Identity/UPN/sign-in address for the user entered in the format <name>@<domain>. Aliases include: "UPN","UserPrincipalName","Username" .PARAMETER DisplayAll Displays all ServicePlans, not only relevant Teams Service Plans Also displays AllLicenses and AllServicePlans object for further processing .EXAMPLE Get-TeamsUserLicenseServicePlan [-Identity] John@domain.com Displays all licenses assigned to User John@domain.com .EXAMPLE Get-TeamsUserLicenseServicePlan -Identity John@domain.com,Jane@domain.com Displays all licenses assigned to Users John@domain.com and Jane@domain.com .EXAMPLE Import-Csv User.csv | Get-TeamsUserLicenseServicePlan Displays all licenses assigned to Users from User.csv, Column Identity. The input file must have a single column heading of "Identity" with properly formatted UPNs. .NOTES Requires a connection to Azure Active Directory .COMPONENT Teams Migration and Enablement. License Assignment .ROLE Licensing .FUNCTIONALITY Returns a list of Licenses assigned to a specific User depending on input .LINK https://github.com/DEberhardt/TeamsFunctions/tree/master/docs/ .LINK Get-TeamsTenantLicense .LINK Get-TeamsUserLicense .LINK Get-TeamsUserLicenseServicePlan .LINK Set-TeamsUserLicense .LINK Test-TeamsUserLicense .LINK Get-AzureAdUserLicense .LINK Get-AzureAdUserLicenseServicePlan .LINK Get-AzureAdLicense .LINK Get-AzureAdLicenseServicePlan #> [CmdletBinding()] [OutputType([PSCustomObject])] param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, HelpMessage = 'Enter the UPN or login name of the user account, typically <user>@<domain>.')] [Alias('UserPrincipalName', 'Username', 'UPN')] [string[]]$Identity, [Parameter(HelpMessage = 'Displays all ServicePlans, not only Teams relevant ones')] [switch]$DisplayAll ) #param begin { Show-FunctionStatus -Level Live Write-Verbose -Message "[BEGIN ] $($MyInvocation.MyCommand)" Write-Verbose -Message "Need help? Online: $global:TeamsFunctionsHelpURLBase$($MyInvocation.MyCommand)`.md" # Asserting AzureAD Connection if (-not (Assert-AzureADConnection)) { break } # Setting Preference Variables according to Upstream settings if (-not $PSBoundParameters.ContainsKey('Verbose')) { $VerbosePreference = $PSCmdlet.SessionState.PSVariable.GetValue('VerbosePreference') } if (-not $PSBoundParameters.ContainsKey('Confirm')) { $ConfirmPreference = $PSCmdlet.SessionState.PSVariable.GetValue('ConfirmPreference') } if (-not $PSBoundParameters.ContainsKey('WhatIf')) { $WhatIfPreference = $PSCmdlet.SessionState.PSVariable.GetValue('WhatIfPreference') } if (-not $PSBoundParameters.ContainsKey('Debug')) { $DebugPreference = $PSCmdlet.SessionState.PSVariable.GetValue('DebugPreference') } else { $DebugPreference = 'Continue' } if ( $PSBoundParameters.ContainsKey('InformationAction')) { $InformationPreference = $PSCmdlet.SessionState.PSVariable.GetValue('InformationAction') } else { $InformationPreference = 'Continue' } # preparing Output Field Separator $OFS = ', ' # do not remove - Automatic variable, used to separate elements! # Loading License Array if (-not $global:TeamsFunctionsMSAzureAdLicenseServicePlans) { $global:TeamsFunctionsMSAzureAdLicenseServicePlans = Get-AzureAdLicenseServicePlan -WarningAction SilentlyContinue } $AllServicePlans = $null $AllServicePlans = $global:TeamsFunctionsMSAzureAdLicenseServicePlans if ($PSBoundParameters.ContainsKey('DisplayAll')) { $previousFEL = $global:FormatEnumerationLimit $global:FormatEnumerationLimit = -1 } } #begin process { Write-Verbose -Message "[PROCESS] $($MyInvocation.MyCommand)" foreach ($User in $Identity) { try { $UserObject = Get-AzureADUser -ObjectId "$User" -WarningAction SilentlyContinue -ErrorAction STOP $UserLicenseDetail = Get-AzureADUserLicenseDetail -ObjectId "$User" -WarningAction SilentlyContinue -ErrorAction STOP } catch { #Write-Error -Message "Error ocurred for User '$User': $($_.Exception.Message)" -Category InvalidResult throw $_ continue } [string]$DisplayName = $UserObject.DisplayName # Querying Service Plans $assignedServicePlans = $UserLicenseDetail.ServicePlans | Sort-Object ServicePlanName [System.Collections.ArrayList]$UserServicePlans = @() foreach ($ServicePlan in $assignedServicePlans) { $Lic = $null $Lic = $AllServicePlans | Where-Object ServicePlanName -EQ $ServicePlan.ServicePlanName if (($null -ne $Lic -and $Lic.RelevantForTeams) -or $PSBoundParameters.ContainsKey('DisplayAll')) { if ($PSBoundParameters.ContainsKey('Debug') -or $DebugPreference -eq 'Continue') { "Function: $($MyInvocation.MyCommand.Name): License:", ($Lic | Format-Table -AutoSize | Out-String).Trim() | Write-Debug } if ($PSBoundParameters.ContainsKey('Debug') -or $DebugPreference -eq 'Continue') { "Function: $($MyInvocation.MyCommand.Name): ServicePlan:", ($ServicePlan | Format-Table -AutoSize | Out-String).Trim() | Write-Debug } $LicObj = [PSCustomObject][ordered]@{ ProductName = if ($Lic.ProductName) { $Lic.ProductName } else { $ServicePlan.ServicePlanName } ServicePlanName = $ServicePlan.ServicePlanName ProvisioningStatus = $ServicePlan.ProvisioningStatus RelevantForTeams = $Lic.RelevantForTeams } [void]$UserServicePlans.Add($LicObj) } } $UserServicePlansSorted = $UserServicePlans | Sort-Object ProductName, ProvisioningStatus, ServicePlanName Write-Information "'$User' - Service Plans for User '$DisplayName':" Write-Output $UserServicePlansSorted } } #process end { if ($PSBoundParameters.ContainsKey('DisplayAll')) { $global:FormatEnumerationLimit = $previousFEL } Write-Verbose -Message "[END ] $($MyInvocation.MyCommand)" } #end } #Get-TeamsUserLicenseServicePlan |