我正在通过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",用于"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提供了集成组件,它提供了易用体验,但我希望使用纯Powershell功能实现相同的结果(如果可能的话)。
发布于 2018-02-14 13:56:04
替换这个片段
$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)。
https://stackoverflow.com/questions/48770175
复制相似问题