尝试使用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个产生了有效的出口:
然后我散列所有文件以查看它们的内容是否不同,并且具有相同散列的唯一文件是具有Export(0)和Export(127)的文件。
所以位图似乎至少部分工作,但有一个不同的映射(?),如MSDN文章中所描述的那样(因为我发布了问题,现在反映了int值而不是位表)
答案 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
。
另一个注意事项:Import
和Export
方法的文档声明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"