PowerShell-V5 Invoke-Webrequest添加2个标头授权标头并接受accept标头 [英] PowerShell-V5 Invoke-Webrequest adding 2 headers authorization header and accept accept header

查看:121
本文介绍了PowerShell-V5 Invoke-Webrequest添加2个标头授权标头并接受accept标头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

是否有可能在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

I am trying create a script that will automate the upgrade of NSX using powershell and invoke-webrequest to utilize the API calls of the NSX Manager. I am doen with the script but some part of the script i need to check and match on some data in the respond. as a matter of fact the NSX API response will 90% be in xml format but some times it can be in json. If the response came in json format my matching will not work and also some parts of the script will not work as it is expecting xml and can not convert json to xml.

as i understand that starting from powershell v4 you can add the accept header but the problem is that i am already using one header for authorization.

Is it possible to add multiple headers in the invoke-webrequest in powershell and if yes how would it be.

Below is a part of the script that i have which will check the current version of the deployed NSX. so it will match on a value in the response which will show the version.

#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
                             "

The response if it is in xml format would as below and i will match on the version.

<?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>

The above script will just work fine if the response is in xml format (which 90% of the time) but if it is json i will get the below error and the script will exit.

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

your help is much appreciated.

Thank you.

解决方案

I gather that you intend to add multiple headers to a REST API call through powershell. Instead of adding headers like this,

$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

You can add them like this

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

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

这篇关于PowerShell-V5 Invoke-Webrequest添加2个标头授权标头并接受accept标头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆