Назад | Перейти на главную страницу

Invoke-Restmethod прерывает скрипт в PS 4.0

У меня был сценарий Powershell, который использовал Invoke-RestMethod, который работал в PowerShell 3.0. Однако я обновился до PowerShell 4.0, чтобы исправить ошибку в PowerShell 3. Когда я это сделал, похоже, что мой скрипт перестал работать.

$username = "Administrator" $password = "PASSWORD" $uri = "https://10.0.0.18/vmrest/users" $dictionary = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f$username,$password))) $dictionary.Add("Authorization",$base64AuthInfo) Invoke-RestMethod -Uri $uri -Method GET -Headers $dictionary -Verbose

Когда я включаю переключатель подробностей, он дает мне такой ответ

VERBOSE: GET https://192.168.1.18/vmrest/users with 0-byte payload VERBOSE: received -1-byte response of content type

Я также пробовал указать запрашиваемый тип контента, но без кубиков $dictionary.Add("Accept","application/json") $dictionary.Add("Connection", "keep_alive")

Одна вещь, которая меня бросает в глаза, заключается в том, что, поскольку вы используете HTTPS, я уверен, что вы должны получать ошибки сертификата, поскольку ваш URL-адрес является IP-адресом.

Вам нужно указать Powershell (на самом деле, .NET framework) игнорировать ошибки сертификата. В противном случае он откажется от таких вещей, как Invoke-WebRequest.

Попробуй это:

[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Это специальный обратный вызов для проверки сертификата, который всегда возвращает истину, тем самым эффективно игнорируя проблемы с сертификатом.

Вероятно, это не ответ на вашу проблему, но еще один момент заключается в том, что вам не нужно самостоятельно создавать базовые заголовки аутентификации:

$secPw = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object PSCredential -ArgumentList $username,$secPw

Invoke-RestMethod -Uri $uri -Method Get -Credential $cred

Это особенно полезно, если вы интерактивно запрашиваете учетные данные, потому что вы можете просто использовать Get-Credential и покончить с этим.