pwsh/dev/functions/resolveObjectIds.ps1 (156 lines of code) (raw):
function ResolveObjectIds {
[CmdletBinding()]Param(
[object]
$objectIds,
[switch]
$showActivity
)
$arrayObjectIdsToCheck = @()
$arrayObjectIdsToCheck = foreach ($objectToCheckIfAlreadyResolved in $objectIds) {
if (-not $htPrincipals.($objectToCheckIfAlreadyResolved)) {
$objectToCheckIfAlreadyResolved
}
else {
#Write-Host "$objectToCheckIfAlreadyResolved already resolved"
}
}
if ($arrayObjectIdsToCheck.Count -gt 0) {
$counterBatch = [PSCustomObject] @{ Value = 0 }
$batchSize = 1000
$ObjectBatch = $arrayObjectIdsToCheck | Group-Object -Property { [math]::Floor($counterBatch.Value++ / $batchSize) }
$ObjectBatchCount = ($ObjectBatch | Measure-Object).Count
$batchCnt = 0
foreach ($batch in $ObjectBatch) {
$batchCnt++
$objectsToProcess = '"{0}"' -f ($batch.Group.where({ testGuid $_ }) -join '","')
$currentTask = " Resolving ObjectIds - Batch #$batchCnt/$($ObjectBatchCount) ($(($batch.Group).Count))"
if ($showActivity) {
Write-Host $currentTask
}
$uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/beta/directoryObjects/getByIds"
$method = 'POST'
$body = @"
{
"ids":[$($objectsToProcess)]
}
"@
$resolveObjectIds = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -body $body -currentTask $currentTask
foreach ($identity in $resolveObjectIds) {
if (-not $htPrincipals.($identity.id)) {
$arrayIdentityObject = [System.Collections.ArrayList]@()
if ($identity.'@odata.type' -eq '#microsoft.graph.user') {
if ($identity.userType -eq 'Guest') {
$script:htUserTypesGuest.($identity.id) = @{
userType = 'Guest'
}
}
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'User'
userType = $identity.userType
id = $identity.id
displayName = $identity.displayName
signInName = $identity.userPrincipalName
})
}
if ($identity.'@odata.type' -eq '#microsoft.graph.group') {
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'Group'
id = $identity.id
displayName = $identity.displayName
})
}
if ($identity.'@odata.type' -eq '#microsoft.graph.servicePrincipal') {
if ($identity.servicePrincipalType -eq 'Application') {
if ($identity.appOwnerOrganizationId -eq $azAPICallConf['checkContext'].Tenant.Id) {
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'ServicePrincipal'
spTypeConcatinated = 'SP APP INT'
servicePrincipalType = $identity.servicePrincipalType
id = $identity.id
appid = $identity.appId
displayName = $identity.displayName
appOwnerOrganizationId = $identity.appOwnerOrganizationId
alternativeNames = $identity.alternativeNames
})
}
else {
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'ServicePrincipal'
spTypeConcatinated = 'SP APP EXT'
servicePrincipalType = $identity.servicePrincipalType
id = $identity.id
appid = $identity.appId
displayName = $identity.displayName
appOwnerOrganizationId = $identity.appOwnerOrganizationId
alternativeNames = $identity.alternativeNames
})
}
}
elseif ($identity.servicePrincipalType -eq 'ManagedIdentity') {
$miType = 'unknown'
if ($identity.alternativeNames) {
foreach ($altName in $identity.alternativeNames) {
if ($altName -like 'isExplicit=*') {
$splitAltName = $altName.split('=')
if ($splitAltName[1] -eq 'true') {
$miType = 'Usr'
}
if ($splitAltName[1] -eq 'false') {
$miType = 'Sys'
}
}
}
}
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'ServicePrincipal'
spTypeConcatinated = "SP MI $miType"
servicePrincipalType = $identity.servicePrincipalType
id = $identity.id
appid = $identity.appId
displayName = $identity.displayName
appOwnerOrganizationId = $identity.appOwnerOrganizationId
alternativeNames = $identity.alternativeNames
})
}
else {
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'servicePrincipal'
spTypeConcatinated = "SP $($identity.servicePrincipalType)"
servicePrincipalType = $identity.servicePrincipalType
id = $identity.id
appid = $identity.appId
displayName = $identity.displayName
appOwnerOrganizationId = $identity.appOwnerOrganizationId
alternativeNames = $identity.alternativeNames
})
}
if (-not $htServicePrincipals.($identity.id)) {
#$script:htServicePrincipals.($identity.id) = @{}
$script:htServicePrincipals.($identity.id) = $arrayIdentityObject
}
}
if (-not $htPrincipals.($identity.id)) {
$script:htPrincipals.($identity.id) = $arrayIdentityObject
}
}
}
if ($batch.Group.Count -ne $resolveObjectIds.Count) {
foreach ($objectId in $batch.Group) {
if ($resolveObjectIds.id -notcontains $objectId) {
if (-not $htPrincipals.($objectId)) {
$arrayIdentityObject = [System.Collections.ArrayList]@()
$null = $arrayIdentityObject.Add([PSCustomObject]@{
type = 'Unknown'
id = $objectId
})
$script:htPrincipals.($objectId) = $arrayIdentityObject
}
else {
#Write-Host "$($objectId) was already collected"
}
}
}
}
}
}
}