Итак, я просто ищу кого-нибудь, кто поможет мне пересечь финишную черту с вопросом.
Я использую API Graph для запроса лицензий, назначенных пользователям из Microsoft Entra.
Пока что я могу запросить одного пользователя и отобразить назначенные лицензии, но мне хотелось бы вывести информацию в PSCustomObject, и здесь я теряюсь.
Этот фрагмент кода запрашивает каталог и возвращает всех пользователей.
$GetUsersUrl = "https://graph.microsoft.com/beta/users"
$Data = Invoke-RestMethod -Uri $GetUsersUrl -Headers $Headers -Method Get
$Result = ($Data | select-object Value).Value
$Users = $Result | select DisplayName,UserPrincipalName,Id
Затем я проверяю userPrincipalName, соответствующее строке, и извлекаю оттуда назначенные лицензии.
$UPN = ($Users | where {$_.userPrincipalName -like "UPN@domain*"})
$lic = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/$($UPN.id)/licenseDetails" -Headers $Headers -Method Get
$skuPartNumber = $((($lic | select-object Value).Value).skuPartNumber)
Теперь я просто хочу взять полученный результат и сохранить его в PSCustomObject вместе с информацией в переменной $UPN.
В идеале я хотел бы использовать цикл foreach, чтобы сделать это для каждого пользователя, но я еще не совсем готов (я также открыт для помощи и предложений по этому поводу). Любая помощь приветствуется.
Что-то очень важное, что вам не хватает, это обработка пейджинга , без механизма рекурсивного цикла (do / while
в примере ниже) вы можете в конечном итоге потерять информацию. Предполагая, что вы хотите объединить выходные данные LicenseDetails с выходными данными пользователя, вы можете это сделать следующим образом:
$uri = 'https://graph.microsoft.com/v1.0/users?$select=displayName, userPrincipalName, id'
$result = do {
$Data = Invoke-RestMethod -Method Get -Uri $uri -Headers $Headers
$uri = $Data.'@odata.nextLink'
foreach ($user in $Data.value) {
$licenseUri = 'https://graph.microsoft.com/v1.0/users/{0}/licenseDetails' -f $user.id
$allSkuPartNumbers = do {
$lic = Invoke-RestMethod -Method Get -Uri $licenseUri -Headers $Headers
$licenseUri = $lic.'@odata.nextLink'
if ($lic) {
$lic.value.skuPartNumber
}
}
while ($licenseUri)
[pscustomobject]@{
displayName = $user.displayName
userPrincipalName = $user.userPrincipalName
id = $user.id
# `$allSkuPartNumbers` will likely be an array,
# might need `-join` here if exporting to CSV
skuPartNumber = $allSkuPartNumbers
}
}
}
while ($uri)
# do stuff with `$result`..
$result
Вау, это просто потрясающе. Это работает именно так, как я хочу.
@thekevinkalis, моя вина, у меня была опечатка во внутреннем цикле
-Uri $uri
, должно было быть-Uri $licenseUri
. Обновил свой ответ.