我正在通过New-WebServiceProxy cmdlet(显然)使用一些基于SOAP的Web服务(Opsware Twister,更具体),并且在为我调用的方法提供参数时遇到一些困难 - 它会导致类型转换错误。这是代码:
$user = "myuser"
$passw = Get-Content "z:\creds.txt" | ConvertTo-SecureString
$hpsa_core = "core.dom.loc"
$creds = [PSCredential]::New($user, $passw)
$URI_ss = "https://$hpsa_core/osapi/com/opsware/server/ServerService?WSDL"
$ws_ss = New-WebServiceProxy -URI $URI_ss -Credential $creds -Namespace 'ns_ss'
$URI_search = "https://$hpsa_core/osapi/com/opsware/search/SearchService?WSDL"
$ws_search = New-WebServiceProxy -URI $URI_search -Credential $creds -Namespace 'ns_search'
$hostname = "SQLSERVER1.dom.loc"
$objectType = "device"
$expression = "ServerVO.hostname CONTAINS $hostname"
$filter = [ns_search.Filter] @{
objectType = $objectType
expression = $expression
}
$refs = $ws_ss.findServerRefs($filter)
问题是,findServerRefs方法不需要原始类型,而是另一个类(com.opsware.search.Filter),并且不会通过服务公开创建其实例的方法。这种简单的方法不起作用,导致错误:
无法转换参数“filter”,值为:“ns_search.Filter”,for “findServerRefs”键入“ns_ss.Filter”:“无法转换 键入“ns_search.Filter”类型的“ns_search.Filter”值 “ns_ss.Filter”。“在行:36字符:1 + $ refs = $ ws_ss.findServerRefs($ filter) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodException + FullyQualifiedErrorId:MethodArgumentConversionInvalidCastArgument
SearchService实现为Java接口(com.opsware.search -Interface SearchService)
我使用了错误的方法吗?
一个重要的评论:供应商(DLL)中有一个Powershell的集成组件,它提供了一个easyirir体验,但我想用纯Powershell功能(如果可能的话)获得相同的结果。
答案 0 :(得分:0)
替换此片段
$filter = [ns_search.Filter] @{
objectType = $objectType
expression = $expression
}
这一个
$filter = [ns_ss.Filter] @{
objectType = $objectType
expression = $expression
}
可能会完成这项工作。
找到此问题的原因: Bug in New-WebServiceProxy cmdlet when using -Namespace?
简而言之,您必须将脚本保存为文件并以此方式调用(使用&
运算符,或作为命令行参数:powershell.exe -File script.ps1
)。