Invoke-RestMethod : Удаленный сервер вернул ошибку: (400) Неверный запрос для PATCH-запроса.

Вопрос или проблема

Я работаю над скриптом для очистки устаревших устройств из арендатора 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.

Оцените материал
Добавить комментарий

Капча загружается...