PowerShell-V5 Invoke-Webrequest 添加 2 个标头授权标头和接受接受标头

2024-05-24

我正在尝试创建一个脚本,该脚本将使用 powershell 和 invoke-webrequest 自动升级 NSX,以利用 NSX Manager 的 API 调用。我已经完成了脚本,但脚本的某些部分我需要检查并匹配响应中的某些数据。事实上,NSX API 响应 90% 都是 xml 格式,但有时也可以是 json 格式。 如果响应采用 json 格式,我的匹配将无法工作,而且脚本的某些部分也将无法工作,因为它需要 xml,并且无法将 json 转换为 xml。

据我了解,从 powershell v4 开始,您可以添加接受标头,但问题是我已经在使用一个标头进行授权。

是否可以在 powershell 中的 invoke-webrequest 中添加多个标头,如果可以,会怎样。

以下是我拥有的脚本的一部分,它将检查已部署的 NSX 的当前版本。因此它将匹配响应中显示版本的值。

#Variables to be used within the script.
[CmdletBinding()]
$NSXUsername = "admin"
$NSXPassword = "VMware1!"
$uriP = "https://HQ-NSX-01a.nsx.gss"


# Start time.
$startclock = (Get-Date)
Write-Host -BackgroundColor:Black -ForegroundColor:Green "Hello"
Write-Host -BackgroundColor:Black -ForegroundColor:Green "This script will help you to automate a full NSX environment deployment"
Write-Host -BackgroundColor:Black -ForegroundColor:Green "FULL NSX Tier Deployment for Single-VC is starting, This Deployment proccess will take an average of 60 min
========================================================================================
                                 "




# Create NSX authorization string and store in $head and used in API Calls
# $nsxcreds = New-Object System.Management.Automation.PSCredential $NSXUsername,$NSXPassword
$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($NSXUsername + ":" + $NSXPassword))
$head = @{"Authorization"="Basic $auth"}

# Allow untrusted SSL certs else will error out
    add-type @"
        using System.Net;
        using System.Security.Cryptography.X509Certificates;
        public class TrustAllCertsPolicy : ICertificatePolicy {
            public bool CheckValidationResult(
                ServicePoint srvPoint, X509Certificate certificate,
                WebRequest request, int certificateProblem) {
                return true;
            }
        }
"@
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy


################
#Start of Script
################

###########################################
# Checking the current deployed NSX Version
###########################################

    Write-Host -BackgroundColor:Black -ForegroundColor:Green "      Checking the current deployed version of the NSX
                             "


    $r = Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers $head -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60
    $nsxbn = ([xml]$r.Content).globalInfo.versionInfo.buildNumber

    if ($nsxbn -match "2691049") {$nsxcv = "6.1.4"}
    elseif ($nsxbn -match "3102213") {$nsxcv = "6.1.5"}
    elseif ($nsxbn -match "3615148") {$nsxcv = "6.1.6"}
    elseif ($nsxbn -match "3949567") {$nsxcv = "6.1.7"}
    elseif ($nsxbn -match "2986609") {$nsxcv = "6.2.0"}
    elseif ($nsxbn -match "3300239") {$nsxcv = "6.2.1"}
    elseif ($nsxbn -match "3496286") {$nsxcv = "6.2.1a"}
    elseif ($nsxbn -match "3604087") {$nsxcv = "6.2.2"}
    elseif ($nsxbn -match "3638734") {$nsxcv = "6.2.2a"}
    elseif ($nsxbn -match "3755950") {$nsxcv = "6.2.2b"}
    elseif ($nsxbn -match "3979471") {$nsxcv = "6.2.3"}
    elseif ($nsxbn -match "4167369") {$nsxcv = "6.2.3a"}
    elseif ($nsxbn -match "4287432") {$nsxcv = "6.2.3b"}
    elseif ($nsxbn -match "4292526") {$nsxcv = "6.2.4"}
    elseif ($nsxbn -match "4818372") {$nsxcv = "6.2.5"}
    elseif ($nsxbn -match "4977495") {$nsxcv = "6.2.6"}
    elseif ($nsxbn -match "5007049") {$nsxcv = "6.3.0"}
    elseif ($nsxbn -match "5124716") {$nsxcv = "6.3.1"}
    else {
    Write-host -BackgroundColor:Black -ForegroundColor:Red "       Unable to retrieve the NSX version, This is either due to the current version is unknown to this script or the NSX Manager is powered off. Please check and try again."
    exit
    }

    Write-Host -BackgroundColor:Black -ForegroundColor:Green "      Current version of NSX deployed and to be upgraded is $nsxcv
                             "

如果是 xml 格式,则响应如下,我将匹配版本。

<?xml version="1.0" encoding="UTF-8"?>
<globalInfo>
    <currentLoggedInUser>admin</currentLoggedInUser>
    <versionInfo>
        <majorVersion>6</majorVersion>
        <minorVersion>1</minorVersion>
        <patchVersion>5</patchVersion>
        <buildNumber>3102213</buildNumber>    <<<--- this is my match
    </versionInfo>
</globalInfo>

如果响应是 xml 格式(90% 的情况下),上面的脚本将正常工作,但如果它是 json,我将收到以下错误,并且脚本将退出。

Cannot convert value "{"currentLoggedInUser":"admin","versionInfo":{"majorVersion":"6","minorVersion":"1","patchVersion":"5","buildNumber":"3102213"}}" 
to type "System.Xml.XmlDocument". Error: "The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong 
type."
At C:\Users\Administrator\Desktop\Scripts  Folder\NSX-Auto-Upgrade-Single.ps1:68 char:2
+     $nsxbn = ([xml]$r.Content).globalInfo.versionInfo.buildNumber
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument

非常感谢您的帮助。

谢谢。


我了解到您打算通过 powershell 将多个标头添加到 REST API 调用中。而不是像这样添加标题,

$head = @{"Authorization"="Basic $auth"}

Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers $head -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60

你可以像这样添加它们

Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers @{"Authorization"="Basic $auth"; "Accept"="application/xml"} -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60

来源 :http://community.idera.com/powershell/ask_the_experts/f/learn_powershell_from_don_jones-24/20461/invoke-restmethod-passing-header-values http://community.idera.com/powershell/ask_the_experts/f/learn_powershell_from_don_jones-24/20461/invoke-restmethod-passing-header-values

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell-V5 Invoke-Webrequest 添加 2 个标头授权标头和接受接受标头 的相关文章

随机推荐