Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece um exemplo de código que demonstra como lidar com erros e implementar a lógica de repetição ao fazer solicitações para a API do Microsoft Graph usando o Invoke-RestMethod
cmdlet no PowerShell.
Pré-requisitos
- Um registro de aplicativo do Azure com um segredo do cliente
- A
user.read.all
permissão para Microsoft.Graph para o aplicativo do Azure. Para obter mais informações, consulte Listar usuários.
Exemplo de código
Para demonstrar a lógica de repetição, este exemplo tenta consultar os signInActivity
dados de usuários convidados. Ao executar esse código, você pode esperar receber um erro "403".
-
Get-AccessTokenCC Essa função solicita um token de acesso da ID do Microsoft Entra (antigo Azure Active Directory). O token será usado para autenticar solicitações de API para o Microsoft Graph. Você precisa fornecer valores para as
$clientSecret
variáveis ,$clientId
e$tenantId
do seu aplicativo de registro do Azure. - Get-GraphQueryOutput ($Uri) Essa função faz uma solicitação à API do Microsoft Graph para recuperar dados. Ele também lida com paginação. A função repete a solicitação se um erro "403" for gerado.
Function Get-AccessTokenCC
{
$clientSecret = ''
$clientId = ''
$tenantId = ''
# Construct URI
$uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
# Construct Body
$body = @{
client_id = $clientId
client_secret = $clientSecret
scope = 'https://graph.microsoft.com/.default'
grant_type = 'client_credentials'
}
# Get OAuth 2.0 Token
$tokenRequest = Invoke-WebRequest -Method Post -Uri $uri -ContentType 'application/x-www-form-urlencoded' -Body $body -UseBasicParsing
# Access Token
$token = ($tokenRequest.Content | ConvertFrom-Json).access_token
#$token = "Junk" #uncomment this line to cause a 401 error -- you can set that status in the error handler to test the pause and retry
#Write-Host "access_token = $token"
return $token
}
Function Get-GraphQueryOutput ($Uri)
{
write-host "uri = $Uri"
write-host "token = $token"
$retryCount = 0
$maxRetries = 3
$pauseDuration = 2
$allRecords = @()
while ($Uri -ne $null){
Write-Host $Uri
try {
# todo: verify that the bearer token is still good -- hasn't expired yet -- if it has, then get a new token before making the request
$result=Invoke-RestMethod -Method Get -Uri $Uri -ContentType 'application/json' -Headers @{Authorization = "Bearer $token"}
Write-Host $result
if($query.'@odata.nextLink'){
# set the url to get the next page of records. For more information about paging, see https://docs.microsoft.com/graph/paging
$Uri = $query.'@odata.nextLink'
} else {
$Uri = $null
}
} catch {
Write-Host "StatusCode: " $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
if($_.ErrorDetails.Message){
Write-Host "Inner Error: $_.ErrorDetails.Message"
}
# check for a specific error so that we can retry the request otherwise, set the url to null so that we fall out of the loop
if($_.Exception.Response.StatusCode.value__ -eq 403 ){
# just ignore, leave the url the same to retry but pause first
if($retryCount -ge $maxRetries){
# not going to retry again
$Uri = $null
Write-Host 'Not going to retry...'
} else {
$retryCount += 1
Write-Host "Retry attempt $retryCount after a $pauseDuration second pause..."
Start-Sleep -Seconds $pauseDuration
}
} else {
# not going to retry -- set the url to null to fall back out of the while loop
$Uri = $null
}
}
}
$output = $allRecords | ConvertTo-Json
if ($result.PSObject.Properties.Name -contains "value") {
return $result.value
} else {
return $result
}
}
# Graph API URIs
$uri = 'https://graph.microsoft.com/v1.0/users?$filter=userType eq ''Guest''&$select=displayName,UserprincipalName,userType,identities,signInActivity'
# Pull Data
$token = Get-AccessTokenCC
Get-GraphQueryOutput -Uri $uri|out-file c:\\temp\\output.json
Capturando um cabeçalho específico
Para cenários avançados, como capturar valores de cabeçalho específicos, como Retry-After
durante a limitação de respostas (HTTP 429), use:
$retryAfterValue = $_.Exception.Response.Headers["Retry-After"]
Para lidar com o erro "429 - muitas solicitações", consulte Diretrizes de limitação do Microsoft Graph.
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.