Powershell WMI:向Win32\u TSGatewayServer类方法传递参数

Powershell WMI:向Win32\u TSGatewayServer类方法传递参数,powershell,wmi,Powershell,Wmi,我在尝试使用Powershell在服务器2012 R2上使用远程桌面网关角色执行WMI类Win32\u TSGatewayServer的方法时遇到问题 我的目标是将远程桌面网关配置从一个系统导出/导入到另一个系统Win32\u TSGatewayServer似乎包含了所需的方法: 我能够让它在一定程度上工作,但是我无法将ExportType/ImportType参数传递给方法调用 我目前使用的是: $source = Get-WmiObject -Namespace root\CIMV2

我在尝试使用Powershell在服务器2012 R2上使用远程桌面网关角色执行WMI类
Win32\u TSGatewayServer
的方法时遇到问题

我的目标是将远程桌面网关配置从一个系统导出/导入到另一个系统
Win32\u TSGatewayServer
似乎包含了所需的方法:

我能够让它在一定程度上工作,但是我无法将ExportType/ImportType参数传递给方法调用

我目前使用的是:

$source = Get-WmiObject -Namespace root\CIMV2\TerminalServices -Class Win32_TSGatewayServer -ComputerName rdg1
$destination = Get-WmiObject -Namespace root\CIMV2\TerminalServices -Class Win32_TSGatewayServer -ComputerName rdg2
$settings = $source.Export(0).XmlString
$destination.Import(0,$settings,$null)
这似乎导出/导入了整个配置

如何调用指定ImportType参数的导出/导入?无论我尝试什么,每次我指定一个不同于
0
的参数时,它都会失败

PS C:\Windows\system32> $source.Export(1)
Exception calling "Export" : ""
At line:1 char:1
+ $source.Export(1)
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WMIMethodException
更新1

使用服务器2012 R2。目的是完全模拟GUI中导出/导入功能的行为

JamesQMurphy的答案更清楚地说明了位图是如何处理的。正如在评论中简要提到的,我能够将Export()与一些参数(例如0、32和33)一起使用,但其他应该工作的参数将失败(例如1、3和5)

这使我产生了以下想法:

for ($i = 0; $i -le 128; $i++) 
{
  $source.Export($i).XmlString | Out-File C:\temp\$i.txt
}
它将为每个成功调用生成一个文件,否则将抛出异常。从结果可以明显看出,128个参数中有65个生成了有效的导出:

  • 0
  • 32-63
  • 96-127
然后我对所有文件进行散列,看看它们的内容是否不同,只有那些具有相同散列的文件是那些具有Export(0)和Export(127)的文件


因此位图似乎至少部分起作用,但使用了MSDN文章中描述的不同映射(?)(这是因为我发布了这个问题,现在反映的是int值而不是位表)

错误消息中的
[]
表明您实际上有一个对象集合,而不是单个对象。您可以通过调用
$source.GetType()
来确认这一点;如果类型实际上是
对象[]
,则您有一个集合:

$source = Get-WmiObject -Namespace root\CIMV2\TerminalServices -Class Win32_TSGatewayServer -ComputerName rdg1
$source.GetType()

IsPublic IsSerial Name          BaseType
-------- -------- ----          --------
True     True     Object[]      System.Array
如果是这种情况,并且您知道您对第一个对象感兴趣,那么只需调用
$source[0].Export(1).XmlString
。否则,您将需要使用
ForEach对象
在集合上循环。或者,您可以通过管道将结果传送到
选择对象-第一个1

另一个注意事项是:
Import
Export
方法的文档说明
ImportType
的值是位值。这意味着您需要传递实际值列中的值。如果需要组合,也可以添加值

位号实际值含义
----------    ------------     -------
0 1导出所有RD封顶
1 2导出所有网络策略服务器(NPS)服务器的列表。
2.4出口所有研发RAP。
3.8导出所有资源组。
4 16导出所有负载平衡服务器的列表。
5 32导出所有与RD网关相关的服务器设置。

我没有RDS可供测试,但这些方法听起来像静态方法。尝试:

$source = Invoke-WmiMethod -Namespace "root\CIMV2\TerminalServices" -Class "Win32_TSGatewayServer" -Name "Export" -ArgumentList 1 -ComputerName "rdg1"
$xml = $source | Select-Object -ExpandProperty XmlString
$destination = Invoke-WmiMethod -Namespace "root\CIMV2\TerminalServices" -Class "Win32_TSGatewayServer" -Name "Import" -ArgumentList 1, $xml -ComputerName "rdg1"

#If you need a value for MergeOrReplace, try:
#$destination = Invoke-WmiMethod -Namespace "root\CIMV2\TerminalServices" -Class "Win32_TSGatewayServer" -Name "Import" -ArgumentList 1, $xml, 0 -ComputerName "rdg1"

谢谢你的回复。在我的例子中,$source.GetType()返回实际对象,而不是数组,因此可以正确调用这些方法。但是,我不清楚位掩码。Export(0)、Export(32)和Export(33)返回不同的值Export(1)、2、5返回异常。不起作用(只测试第一个调用方法):
Invoke WmiMethod:Invalid Method参数位于第1行char:1+Invoke WmiMethod-命名空间“root\CIMV2\TerminalServices”-Class“Win32_TSGatewa…++”CategoryInfo:InvalidOperation:(:)[Invoke WmiMethod],ManagementException+FullyQualifiedErrorId:InvokeWMIManagementException,Microsoft.PowerShell.Commands.InvokeWmiMethod
此操作返回哪些属性(PSComputerName和__;*)
(获取WmiObject-Namespace root\CIMV2\TerminalServices-Class Win32\u TSGatewayServer-List)。GetMethodParameters(“导出”)
?我将您的参数值0用于Export-/ImportType,该值无效。它是0位(值1)这将导出CAP。请尝试更新的答案。您需要什么策略?您需要组合这些值以选择要导出的多个策略类型。例如CAPs(1)+Radius服务器(2)=3我意识到了这一点,并使用其他值对其进行了测试,但是您的方法根本不起作用。请参阅我问题的更新1。好的。那么我猜您需要此方法的对象。至于导出类型,我无法帮助您,因为我自己无法测试它。