web-dev-qa-db-ja.com

PS 4.0でInvoke-Restmethodがスクリプトを壊す

Powershell 3.0で動作するInvoke-RestMethodを使用するPowershellスクリプトがありました。しかし、Powershell 3のバグを修正するためにPowershell 4.0にアップグレードしました。そうしたところ、スクリプトが機能しなくなったようです。

$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")

6
Brett G

私の目を引くのは、HTTPSを使用しているため、URLがIPアドレスであるため、証明書エラーが発生するはずだということです。

証明書エラーを無視するようにPowershell(実際には.NETフレームワーク)に指示する必要があります。それ以外の場合は、Invoke-WebRequestなどの処理を行います。

これを試して:

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

これは、常にtrueを返すカスタム証明書検証コールバックであり、証明書の問題を効果的に無視します。

9
Ryan Ries

おそらくあなたの問題に対する答えではありませんが、もう1つのポイントは、基本認証ヘッダーを自分で作成する必要がないことです。

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

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

Get-Credentialそしてそれで終わります。

1
briantist