我正在尝试创建一个脚本,该脚本将使用 powershell 和 invoke-webrequest 自动升级 NSX,以利用 NSX Manager 的 API 调用。我对脚本很满意,但脚本的某些部分我需要检查并匹配响应中的某些数据。事实上,NSX API 响应的 90% 都是 xml 格式,但有时也可以是 json。 如果响应以 json 格式出现,我的匹配将不起作用,并且脚本的某些部分也将不起作用,因为它需要 xml 并且无法将 json 转换为 xml。
据我了解,从 powershell v4 开始,您可以添加接受 header ,但问题是我已经在使用一个 header 进行授权。
是否可以在 powershell 中的 invoke-webrequest 中添加多个 header ,如果可以,会怎样。
下面是我拥有的脚本的一部分,它将检查已部署的 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 调用添加多个 header 。而不是像这样添加标题,
$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
关于xml - PowerShell-V5 Invoke-Webrequest 添加 2 个 header 授权 header 和接受 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42683385/
我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara
我想在我的Controller中使用以下corsheader呈现JSON:'Access-Control-Allow-Origin'='*'.我试过这个:defmy_actionrender(json:some_params)response.headers['Access-Control-Allow-Origin']='*'end但是我得到了一个AbstractController::DoubleRenderError。有没有办法使用header呈现JSON? 最佳答案 您不能在渲染后设置header,因为已发送响应。所以在没有意
我有一个“.CSV”文件,我正尝试在ruby中使用CSV对其进行解析。该文件虽然有两行标题,但我以前从未遇到过这种情况,也不知道如何处理。以下是标题和行的示例。第1行"InstitutionID","Institution","GameDate","UniformNumber","LastName","FirstName","Rushing","","","","","Passing","","","","","","TotalOff.","","Receiving","","","PassInt","","","FumbleRet","","","Punting","","Pun
我需要做的就是从CSV文件中获取header。file.csv是:"A","B","C""1","2","3"我的代码是:table=CSV.open("file.csv",:headers=>true)putstable.headerstable.eachdo|row|putsrowend这给了我:true"1","2","3"我已经查看RubyCSV文档几个小时了,这让我发疯。我确信必须有一个简单的单行代码可以将header返回给我。有什么想法吗? 最佳答案 看起来CSV.read会让您访问headers方法:headers=C
我正在尝试使用Ruby从Rack获取原始格式的请求header,但还没有弄清楚。我从request.env得到的散列不是我想要的。在该散列中,header键被大写并使用下划线而不是破折号,如下所示:"CONTENT_TYPE"=>"应用程序/json;字符集=utf-8"我想要的是处理前的header,我正在寻找:"Content_Type"=>"application/json;charset=utf-8"我可以很容易地循环遍历request.env寻找以HTTP_开头的header并将它们拆分,将每个单词和gsub大写以将下划线替换为破折号以使它们成为我想要的格式。在处理标题时,以
我正在为ruby开发一个C扩展,但我需要包含来自IOBluetooth框架的header,特别是:#import#import一切都编译正常,但在运行时,扩展错误:path/to/file.rb:1:in`require_relative':dlopen(/path/to/extension.bundle,9):Symbolnotfound:_OBJC_CLASS_$_IOBluetoothDeviceInquiry(LoadError)我相当确定这与未包含在链接过程中的框架有关,但我不确定原因。任何帮助将不胜感激extconf.rb:#Loadsmkmfwhichisusedto
我正试图在Rails中获得完整的页面缓存,但我在CSRF方面遇到了很大的障碍——或者可能只是我对它的理解。我目前有form_authenticity_token存储在cookie中的字符串,JS可以使用该cookie访问和重写header标签。我在生成的HTML中有两个地方可以找到标记:1)在头部2)在表单的隐藏输入元素中如前所述,这些哈希值彼此不同(在未启用缓存的开发模式下)。他们为什么不同?为什么我可以删除headmeta标签并保留表单输入并且允许请求?然而,当我删除表单输入标签并保留标题时,请求被拒绝了吗?实际上这意味着head标签是无用的,不是吗?我可以将表单输入标签重写为
我想通过Sinatra应用程序代理远程文件。这需要将带有header的HTTP响应从远程源流式传输回客户端,但我不知道如何在Net::HTTP#提供的block内使用流式API时设置响应header获取响应。例如,这不会设置响应头:get'/file'dostreamdo|out|uri=URI("http://manuals.info.apple.com/en/ipad_user_guide.pdf")Net::HTTP.get_response(uri)do|file|headers'Content-Type'=>file.header['Content-Type']file.re
我正在使用Sendgrid将电子邮件发送到邮件列表,使用X-SMTPAPIheader指定多个收件人。来自Sendgriddocumentation“header必须换行以将行长度保持在72以下。”我正在使用ActionMailer发送电子邮件,并使用headers方法设置X-SMTPAPIheader。为了保持行少于72个字符,我尝试用逗号+换行符+空格替换每个逗号。例如,headers["X-SMTPAPI"]={:to=>['user1@example.com','user2@example.com','user3@example.com','user4@example.com'
我在Rubyrails上,我正在安装RubyonRails。我正在尝试安装gems,但它没有发生,我不确定为什么以及如何修复它。$geminstallbundlerERROR:Loadingcommand:install(LoadError)dlopen(/Users/nthulanemakgato/.rbenv/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle,9):Librarynotloaded:/usr/local/opt/openssl/lib/libssl.1.0.0.dylibReferenced