我有一个使用 Invoke-RestMethod 的 Powershell 脚本,该脚本在 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")
答案1
让我印象深刻的一件事是,由于您使用的是 HTTPS,所以我确信您一定会收到证书错误,因为您的 URL 是一个 IP 地址。
您需要告诉 Powershell(实际上是 .NET 框架)忽略证书错误。否则它会在诸如 Invoke-WebRequest 之类的事情上出错。
尝试这个:
[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
这是一个自定义的证书验证回调,它始终返回 true,从而有效地忽略证书问题。
答案2
可能不是您问题的答案,但另一点是您不必自己构建基本的身份验证标头:
$secPw = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object PSCredential -ArgumentList $username,$secPw
Invoke-RestMethod -Uri $uri -Method Get -Credential $cred
如果您以交互方式提示输入凭据,它会特别有用,因为您只需使用Get-Credential
它即可完成。