Powershell WMI:将参数传递给Win32_TSGatewayServer类方法

时间:2016-04-04 13:27:35

标签: powershell wmi

尝试使用Powershell在Server 2012 R2上使用远程桌面网关角色执行WMI类Win32_TSGatewayServer的方法时遇到问题。

我的目标是将远程桌面网关配置从一个系统导出/导入到另一个系统。 Win32_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

使用Server 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值而不是位表)

2 个答案:

答案 0 :(得分:1)

错误消息中的[]表明您实际上有一个对象集合,而不是单个对象。您可以致电$source.GetType()确认;如果类型实际上是object[],那么你有一个集合:

$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-Object循环遍历集合。或者,您可以将结果传递给Select-Object -First 1

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

Bit Number    Actual Value     Meaning
----------    ------------     -------
    0               1          Export all RD CAPs
    1               2          Export a list of all Network Policy Server (NPS) servers.
    2               4          Export all RD RAPs.
    3               8          Export all resource groups.
    4              16          Export a list of all load-balancing servers.
    5              32          Export all RD Gateway-related server settings.

答案 1 :(得分:1)

我没有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"