Я работаю с API WMI с помощью командлетов Cim. Проблема в том, что я не могу понять, как передать объект wmi на wmi-метод, который принимает массив объектов wmi.Пропустить массив CimInstance до CimMethod
Вот метод определения параметров:
Name CimType Qualifiers
---- ------- ----------
Path String {ID, in}
Permissions InstanceArray {EmbeddedInstance, ID, in}
ResetChildren Boolean {ID, in}
Path
и ResetChildren
простые параметры. Они принимают простые значения, такие как "/path"
и $true
соответственно. Но у меня проблемы с параметром Permissions
.
Вот мой код
#Acquiring object that I want to pass to method
$group = Get-CimInstance -Namespace "root\VisualSVN" -ClassName VisualSVN_Group -Filter "Name='Readers'"
#Acquiring object which method will be called
$repositories = Get-CimInstance -Namespace "root\VisualSVN" -ClassName VisualSVN_Repository
#Preparing method arguments
$args = @{
Path = "/";
Permissions = @($group[0]); #Trouble here
ResetChildren = $true
}
#Invoking method with arguments
Invoke-CimMethod -InputObject ($repositories[0]) -MethodName SetSecurity -Arguments $args
Выполнение этого кода приведет к ошибке:
Invoke-CimMethod : Unable to cast object of type 'Microsoft.Management.Infrastructure.CimInstance' to type 'M
icrosoft.Management.Infrastructure.Native.InstanceHandle'.
Parameter name: value
At C:\somepath\script1.ps1:11 char:1
+ Invoke-CimMethod -InputObject ($repositories[0]) -MethodName SetSecurity -Argume ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Invoke-CimMethod], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.Management.Infrastructure.CimCmdlets.Invoke
CimMethodCommand
Если изменить код
Permissions = @($group[0]); #Trouble here
Чтобы закодировать
Permissions = $group; #Trouble here
Тогда сообщение об ошибке также изменится:
Invoke-CimMethod : Unable to cast object of type 'Microsoft.Management.Infrastructure.Native.InstanceHandle'
to type 'System.Collections.IList'.
Parameter name: value
At C:\somepath\script1.ps1:11 char:1
+ Invoke-CimMethod -InputObject ($repositories[0]) -MethodName SetSecurity -Argume ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Invoke-CimMethod], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.Management.Infrastructure.CimCmdlets.Invoke
CimMethodCommand
Любые идеи, как передать $group
на метод правильно?
у меня нет VisualSVN установлен, поэтому не может проверить это, но делает ваш «$ группа [0]» объект есть Обработать свойство? Если да, то как насчет передачи «$ group [0] .Handle»? –
Я думаю, что эта проблема не связана непосредственно с VisualSVN. Таким образом, вы можете воспроизвести его любым методом WMI, который имеет аналогичную подпись. Метод должен принимать массив некоторых объектов WMI. К сожалению, моя «$ group [0]» не имеет ни свойства Handle, ни чего-то, что связано с InstanceHandle. Класс InstanceHandle связан с деталями внутренней реализации и не имеет публичной документации. Я предполагаю, что это исключение бросает, когда PowerShell делает магию для преобразования из внутреннего представления объекта WMS PowerShell в чистый объект WMI. – rotor
Я понимаю, что это не проблема VisualSVN, было бы неплохо воспроизвести ошибку. Вот еще один пример [link] http://powershell.com/cs/forums/p/13888/26108.aspx. К сожалению, я тоже не могу воспроизвести его. Один «намек», который я нашел, - «Командлеты CIM возвращают инертные объекты» ([link] http://blogs.msmvps.com/richardsiddaway/category/powershellandwmi/page/4/) В нем объясняется, что объекты, Сопротивление - это «инертные» копии объектов WMI без каких-либо методов. Я попытался бы переписать код с помощью Get-WmiObject и посмотреть, можете ли вы вызвать метод напрямую. –