2016-04-04 2 views
3

У меня возникают проблемы при попытке выполнить методы класса WMI Win32_TSGatewayServer с использованием Powershell с использованием роли шлюза удаленного рабочего стола на сервере 2012 R2.Powershell 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 

Update 1

Использование Server 2012 R2. Цель состоит в том, чтобы полностью имитировать поведение функции экспорта/импорта в графическом интерфейсе.

Ответ 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 
} 

Какой будет генерировать файл для каждого вызова удалось, как он будет бросать исключения иначе. Из результатов стало ясно, что 65 из 128 параметров генерируются действительный экспорт:

  • 32-63
  • 96-127

Тогда я хэшированный все файлы, чтобы увидеть если их содержимое отличается, и единственными файлами, имеющими один и тот же хеш, являются файлы с Export (0) и Export (127).

Так что растровые изображения, по-видимому, работают хотя бы частично, но с другим сопоставлением (?), Как описано в статье MSDN (с тех пор как я разместил вопрос и теперь отображает значения int вместо битовой таблицы)

ответ

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 являются битовые значения. Это означает, что вам необходимо передать значения в столбце Actual Value. Вы также можете добавить значения, если хотите комбинацию.

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. 
+0

Спасибо за ваш ответ. В моем случае $ source.GetType() возвращает фактический объект, а не массив, поэтому методы можно вызвать правильно. Однако я не понимаю, что такое битовая маска. Экспорт (0), Экспорт (32) и Экспорт (33) возвращают разные значения. Экспорт (1), 2, 5 возвращает исключение. – leepfrog

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" 
+0

Не работает (просто установите первый метод Invoke-Method): 'Invoke-WmiMethod: Недопустимый метод Параметр (ы) В строке: 1 char: 1 + Invoke-WmiMethod -Namespace" root \ CIMV2 \ TerminalServices "-Class" Win32_TSGatewa ... + + CategoryInfo: InvalidOperation: (:) [Invoke-WmiMethod], ManagementException + FullyQualifiedErrorId: InvokeWMIManagementException, Microsoft.PowerShell.Commands.InvokeWmiMethod' – leepfrog

+0

Какие свойства (кроме PsComputerName и __ *) делает это возвращение '(Get-WmiObject -Namespace root \ CIMV2 \ TerminalServices -Class Win32_TSGatewayServer -List) .GetMethodParameters («Экспорт») '? –

+0

В нем перечислены ExportType: http://pastebin.com/jZDFLV87 – leepfrog