Вопрос или проблема
Я работаю над скриптом для очистки устаревших устройств из арендатора Azure AD. Я также использую GraphAPI для получения информации об устройстве через GET запрос, который работает нормально. Но когда я пытаюсь использовать PATCH/POST запрос для обновления статуса устройства, он не работает как ожидалось и выдает сообщение об ошибке 400. Я пробовал модифицировать тело запроса и также получал ошибки 404 и 403. Может кто-то помочь с функцией ниже?
$AzureToken = Get-MsalToken -TenantId $azureTenantId -ClientId $azureAplicationId -ClientSecret $azurePassword
$authheader = @{
"Authorization" = "Bearer $($AzureToken.AccessToken)"
"Content-type" = "application/json"
}
$ssoPatchUri = 'https://graph.microsoft.com/v1.0/devices/#############’
$body = @{ "extensionAttributes"= @{
"extensionAttribute6"= "$((Get-Date).ToFileTimeUtc())"
}
"accountEnabled"= $false
}
Invoke-RestMethod -Headers $authheader -Uri $ssoPatchUri -Method PATCH -Body ($body| ConvertTo-Json -Depth 5)
Сообщение об ошибке:
Invoke-RestMethod : Удаленный сервер вернул ошибку: (404) Не найден.
На строке:1 символ:1
- Invoke-RestMethod -Headers $authheader -Uri $ssoPatchUri -Method PATC …
-
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
# Убедитесь, что у вас установлен модуль MSAL.PS для Get-MsalToken
Import-Module MSAL.PS
# Получите токен доступа для Microsoft Graph
$AzureToken = Get-MsalToken -TenantId $azureTenantId -ClientId $azureAplicationId -ClientSecret $azurePassword -Scopes "https://graph.microsoft.com/.default"
# Установите заголовки с токеном доступа
$authheader = @{
"Authorization" = "Bearer $($AzureToken.AccessToken)"
"Content-type" = "application/json"
}
# Замените '#############' на фактический идентификатор устройства
$ssoPatchUri = "https://graph.microsoft.com/v1.0/devices/{deviceId}"
# Сформируйте тело для PATCH запроса
$body = @{
"extensionAttributes" = @{
"extensionAttribute6" = "$((Get-Date).ToFileTimeUtc())"
}
"accountEnabled" = $false
}
try {
# Конвертируйте тело в JSON и отправьте PATCH запрос
$response = Invoke-RestMethod -Headers $authheader -Uri $ssoPatchUri -Method PATCH -Body ($body | ConvertTo-Json -Depth 5)
Write-Output "Устройство успешно обновлено: $response"
} catch {
# Обработка ошибок
$errorMessage = $_.Exception.Message
$statusCode = $_.Exception.Response.StatusCode.value__
Write-Output "Не удалось обновить устройство. Статус Код: $statusCode"
Write-Output "Сообщение об ошибке: $errorMessage"
# Для подробной информации об ошибке
$streamReader = [System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream())
$errorDetail = $streamReader.ReadToEnd()
Write-Output "Подробная Ошибка: $errorDetail"
}
Ответ или решение
Проблема, с которой вы столкнулись при использовании метода PATCH через Invoke-RestMethod, связана с ошибкой (400) Bad Request. Давайте подробно рассмотрим возможные причины этой ошибки и предложим решения.
Потенциальные причины ошибок
1. Неправильный URI
Убедитесь, что URL-адрес, указанный в $ssoPatchUri
, корректен. Замените #############
на фактический идентификатор устройства. Например:
$ssoPatchUri = 'https://graph.microsoft.com/v1.0/devices/ВАШ_ID_УСТРОЙСТВА'
2. Неправильное тело запроса
Ошибка 400 может быть вызвана невалидной структурой или данными в теле запроса. Убедитесь, что все поля в теле запроса соответствуют требованиям Microsoft Graph API. Вот пример:
$body = @{
"accountEnabled" = $false
"extensionAttributes" = @{
"extensionAttribute6" = "$(Get-Date).ToFileTimeUtc()"
}
}
Убедитесь в правильности JSON-структуры и глубины преобразования:
$bodyJson = $body | ConvertTo-Json -Depth 2
3. Права доступа
403 Forbidden в предыдущих ошибках может указывать на недостаточные права доступа. Убедитесь, что ваш токен имеет все необходимые разрешения (scopes). Например:
-Scopes "Directory.AccessAsUser.All"
Убедитесь, что ваше приложение в Azure Active Directory настроено с правильными разрешениями и эти разрешения были согласованы администратором.
4. Истечение срока действия токена
Проверьте, что токен актуален и не истек. Попробуйте запросить новый токен перед выполнением PATCH-запроса.
$AzureToken = Get-MsalToken -TenantId $azureTenantId -ClientId $azureAplicationId -ClientSecret $azurePassword -Scopes "https://graph.microsoft.com/.default"
Обработка ошибок
Добавьте улучшенную обработку ошибок в ваш скрипт. Это поможет точнее понять, в чем проблема.
Пример расширенной обработки ошибок:
try {
$bodyJson = $body | ConvertTo-Json -Depth 2
$response = Invoke-RestMethod -Headers $authheader -Uri $ssoPatchUri -Method PATCH -Body $bodyJson
Write-Output "Устройство успешно обновлено: $response"
} catch {
$errorMessage = $_.Exception.Message
Write-Output "Ошибка при обновлении устройства. Сообщение: $errorMessage"
if ($_.Exception.Response -ne $null) {
$statusCode = $_.Exception.Response.StatusCode.value__
$streamReader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
$errorDetail = $streamReader.ReadToEnd()
Write-Output "Код статуса: $statusCode"
Write-Output "Подробная ошибка: $errorDetail"
}
}
Используя данный подход и рекомендации, вы сможете диагностировать и устранить проблему, связанную с 400 Bad Request при выполнении PATCH-запроса в вашем PowerShell-скрипте для управления устройствами в Azure AD через Graph API.