通过 Powershell 的 SOAP 语法

Syntax for SOAP through Powershell

我正在尝试使用 PVOrder 方法通过 Globalsign 的 API 和 Powershell 订购 SSL 证书。 URL 是 https://test-gcc.globalsign.com/kb/ws/v1/ManagedSSLService?wsdl and they have documentation here https://downloads.globalsign.com/acton/attachment/2674/f-092e/1/-/-/-/-/globalsign-mssl-api-user-guide-v2.3.pdf

我使用的Powershell非常简单:

$URI = "https://test-gcc.globalsign.com/kb/ws/v1/ManagedSSLService?wsdl"
$result = (iwr $URI –infile "C:\Users\Administrator\Desktop\script_other\pvorder_soap.xml" –contentType "text/xml" –method POST)

XML 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<xs:complexType name="PVOrder">
<xs:sequence>
<xs:element minOccurs="0" name="Request" type="tns:BmV1PvOrderRequest"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BmV1PvOrderRequest">
<xs:sequence>
<xs:element name="OrderRequestHeader" type="tns:OrderRequestHeader"/>
<xs:element name="OrderRequestParameter" type="tns:OrderRequestParameter"/>
<xs:element name="MSSLProfileID" type="xs:string"/>
<xs:element name="MSSLDomainID" type="xs:string"/>
...
</xs:complexType>

但是,我 运行 很难弄清楚应该在何处定义参数。我发现的大多数教程中的 XML 设计看起来与此处的 XML 不同。在 google 上进行的一些搜索让我尝试将参数放在 xml 的末尾,但在我尝试之前,所以它看起来像下面这样,但响应根本没有改变。

...
<MSSLDomainID>test.com</MSSLDomainID>
</xs:complexType>

关于我应该在这里做什么有什么想法吗?我对 Powershell 有相当多的经验,但是 none 对 SOAP 和 none 我读过的教程似乎对此有答案。

您不会post WSDL。这描述了 XML 应该是什么样子。

您真正需要的是 XML 应该是什么的示例,然后您只需将变量插入其中即可。您获得的文档描述了订单的格式。实际上没有例子。我进行了快速搜索,但找不到满足您特定需求的产品。从技术上讲,您应该能够使用 WSDL 构建它。

GlobalSign doco 展示了一些 XML 您 post 的实际示例,但不适用于您的特定 API。

更新: 找到了一个分析 WSDL 的服务,并为您提供了可以使用的示例 XML。看看https://www.wsdl-analyzer.com/

  1. Copy/paste 只是 WSDL from API 在一个文本文件中
  2. 上传here
  3. 点击操作->EVOrder
  4. 您可以使用的示例 XML。这就是您可以 POST 到您的代码中的内容。

不要调用 Web 请求,而是使用 Powershell 中内置的名为 New-WebServiceProxy 的实用程序。完成后,您将能够看到 Web 服务公开的方法和属性。

$Proxy = New-WebServiceProxy -Uri https://test-gcc.globalsign.com/kb/ws/v1/ManagedSSLService?wsdl
$Proxy | get-member 
Name                                 MemberType Definition                                                                                                                                                                               
----                                 ---------- ----------                                                                                                                                                                               
AddDomainToProfileCompleted          Event      Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1b_ws_v1_ManagedSSLService_wsdl.AddDomainToProfileCompletedEventHandler AddDomainToProfileCompleted...
AddMSSLDomainCompleted               Event      Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1b_ws_v1_ManagedSSLService_wsdl.AddMSSLDomainCompletedEventHandler AddMSSLDomainCompleted(System.Ob...
AddMSSLProfileCompleted              Event      Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1b_ws_v1_ManagedSSLService_wsdl.AddMSSLProfileCompletedEventHandler AddMSSLProfileCompleted(System....
ChangeSubjectAltNameCompleted        Event      Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1b_ws_v1_ManagedSSLService_wsdl.ChangeSubjectAltNameCompletedEventHandler ChangeSubjectAltNameCompl...
Disposed                             Event      System.EventHandler 

使用此代理,我可以通过以下方式从中获取类型:

 $Proxy = New-WebServiceProxy -Uri https://test-gcc.globalsign.com/kb/ws/v1/ManagedSSLService?wsdl -namespace globalsign -Class managed
 $proxyType = $proxy.gettype().Namespace
 $bmv1pvOrderRequest = New-Object("$proxyType.BmV1PvOrderRequest")
PS:\> $bmv1pvOrderRequest


OrderRequestHeader    : 
OrderRequestParameter : 
MSSLProfileID         : 
MSSLDomainID          : 
SubID                 : 
PVSealInfo            : 
ContactInfo           : 
SANEntries            : 
Extensions            : 

我选择尝试填写 contactinfo,它的类型是 Contactinfo,因此您必须创建一个该类型的对象并填写元素:

$C = new-object ("$proxyType.contactinfo")
$C.FirstName = 'thom'
$c.lastname = 'schumacher'
$c
FirstName LastName   Phone Email
--------- --------   ----- -----
thom      schumacher            

接下来,您需要检查 $bmv1pvOrderRequest 中的每一项,并根据需要在每种类型的新代理中进行代理,然后将请求发送到 Web 服务。

$o = new-object ("$proxyType.orderRequestHeader")
$o
AuthToken
---------
PS:\> $p = new-object ("$proxyType.orderRequestParameter")

PS:\> $p


ProductCode          : 
BaseOption           : 
OrderKind            : 
Licenses             : 
Options              : 
ValidityPeriod       : 
CSR                  : 
RenewalTargetOrderID : 
TargetCERT           : 
SpecialInstructions  : 
Coupon               : 
Campaign             : 

$bmv1pvOrderRequest.OrderRequestHeader = $o
$bmv1pvOrderRequest.OrderRequestParameter = $p
$bmv1pvOrderRequest.ContactInfo = $c