如何从托管C ++调用PSObject上的方法

时间:2011-10-01 22:28:21

标签: .net c++ powershell wmi

我正在尝试使用托管C ++函数中的PowerShell类来执行WMI函数。

但我无法解决如何从PowerShell.Invoke()方法调用PSObject列表中返回的对象的方法。

(在命令行上我会做(gwmi ....)。RequestStateChange(2) - 但是我看不到如何使用PowerShell类的几个方法添加()。

System::Management::Automation::PowerShell ^ ps = System::Management::Automation::PowerShell::Create();

ps->AddCommand("Get-WMIObject");
ps->AddParameter("namespace", "root/virtualization");

p->AddParameter("class", "Msvm_ComputerSystem");

// we could add a filter to only return the VM in question but
// I had problems with quoting so choose the
// simplier route.
System::Collections::ObjectModel::Collection<System::Management::Automation::PSObject^>^ result = ps->Invoke();

System::String ^s = gcnew System::String( id.c_str() );

for (int i = 0; i < result->Count; i++ ) {

    if ( System::String::Compare( dynamic_cast<System::String ^>(result[i]->Members["Name"]->Value), s) == 0 ) {

        // Now what ? I want to call the RequestStateChange method on this VM
        return;
    }
}

2 个答案:

答案 0 :(得分:0)

为什么您希望我们使用PowerShell查询WMI,您可以使用托管类ManagementObjectSearcher

ManagementObjectSearcher ComputerInfos = new ManagementObjectSearcher("select * from Win32_ComputerSystem");

答案 1 :(得分:0)

我知道这有点陈旧,但我在C#中遇到了类似的问题,发现这个主题只是描述我的问题。我得到的解决方案非常基础,这也就不足为奇了,因为我是PowerShell的初学者。我希望这对任何可能在这里绊倒的人都能解决这个问题。

PSObject具有.BaseObject属性,用于访问底层对象。因此,如果您知道具有所需方法的对象的类型(您可能会这样做,否则我不确定您如何期望任何特定方法),您只需尝试进行转换。

SomeClass x = result[i].BaseObject as SomeClass;
if (x == null) 
{
   //some handling
}
x.SpecificMethod();

这是C#cast,但你明白了。

希望这有帮助。