【问题标题】:PowerShell C# WMI correct filling input object for InvokeMethodPowerShell C# WMI 为 InvokeMethod 正确填充输入对象
【发布时间】:2015-05-17 14:06:31
【问题描述】:

我在将 PowerShell 脚本转换为 C# 时遇到问题。

我正在关注Exploring NDIS WMI classes 文章,我正在尝试将示例 PowerShell 重写为 C#。更准确地说,我在将 Get-NdisObjectHeader、Get-NdisWmiHeader 正确转换为 inParams 时遇到了问题。首先是 PS 代码,然后是我在 C# 中的失败代码。

PowerShell:

$Adapters =  Get-WmiObject -Namespace root\wmi -Class` MSNdis_ReceiveScaleCapabilities;

## $Adapters[4];
## under 4.element I’ve got my desired adapter InstanceName: „Adapter 0”

function Get-NdisObjectHeader 
{ 
    param( 
        $revision = 1, 
        $type     = 0x02, 
        $size     = 0xffff 
    ) 
    $hdr = ([wmiclass]'root\wmi:MSNdis_ObjectHeader').CreateInstance() 
    $hdr.Revision      = $revision 
    $hdr.Type          = $type 
    $hdr.Size          = $size 
    return $hdr 
}

function Get-NdisWmiHeader 
{ 
    param($timeout = 5) 
    $whdr = ([wmiclass]'root\wmi:MSNdis_WmiMethodHeader').CreateInstance() 
    $whdr.Header       = Get-NdisObjectHeader 
    $whdr.PortNumber   = 0 
    $whdr.NetLuid      = 0 
    $whdr.Padding      = 0 
    $whdr.RequestId    = 0 
    $whdr.Timeout      = $timeout 
    return $whdr 
}

$whdr = Get-NdisWmiHeader;
$outParams = $Adapters[4].WmiQueryReceiveScaleCapabilities($whdr);

C#

static void Main(string[] args)
{
    String AdapterName = "Adapter 0";
    String WMIClassName = "MSNdis_ReceiveScaleCapabilities";
    string Query = "SELECT * FROM " + WMIClassName;
    var ListAdapterInstances = new ManagementObjectSearcher("root\\WMI", Query).Get();

    foreach (ManagementObject AdapterInstance in ListAdapterInstances)
    {
        String AdapterInstanceName;
        AdapterInstanceName = (String)AdapterInstance.GetPropertyValue("InstanceName");

        if (AdapterInstanceName.Contains(AdapterName))
        {
            ManagementBaseObject whdr= AdapterInstance.GetMethodParameters("WmiQueryReceiveScaleCapabilities");

            //here , I don't know how to fill correctly whdr object with NDISWmiHeader(->NDISObjectHeader).. 
            object[] NDISObjectHeader = { 1, 0x02, 0xffff };    //Get-NdisObjectHeader 
            object[] NDISWmiHeader = { NDISObjectHeader, 0, 0, 0, 0, 5 };   //Get-NdisWmiHeader

            whdr["Header"] = NDISWmiHeader;

            ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", whdr, null);
            //
        }
    }
}

感谢您的帮助。 鲍勃

【问题讨论】:

  • 你遇到了什么异常?
  • 您能否将完整的异常(类型、消息、堆栈)添加到您的问题中?此外,您似乎至少在 C# 版本中缺少一些代码,“inParams”是在哪里创建的?
  • inParam -> whdr - 已修复
  • 行内:whdr["Header"] = NDISWmiHeader;调试器停止程序并抛出“ManagmentException 未处理”消息并在查看详细信息中...... - {“类型不匹配”}

标签: c# powershell wmi ndis


【解决方案1】:

您的 PowerShell 代码可以翻译为:

ManagementBaseObject hdr = new ManagementClass("root\\wmi:MSNdis_ObjectHeader").CreateInstance();

hdr["Revision"] = 1;
hdr["Type"] = 0x02;
hdr["Size"] = 0xffff;

ManagementBaseObject whdr = new ManagementClass("root\\wmi:MSNdis_WmiMethodHeader").CreateInstance();

whdr["Header"] = hdr;
whdr["PortNumber"] = 0;
whdr["NetLuid"] = 0;
whdr["Padding"] = 0;
whdr["RequestId"] = 0;
whdr["Timeout"] = 5;

// Two lines bellow are taken from Bob's answer
ManagementBaseObject inParams = AdapterInstance.GetMethodParameters("WmiQueryReceiveScaleCapabilities");

inParams["Header"] = whdr;

ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", inParams, null);

编辑:必须通过ManagementClass.GetMethodParameters 创建ManagementBaseObject 类型的实例来存储参数。而这个ManagementBaseObject 必须传递给InvokeMethod。在 PowerShell 中,这是在您调用方法时由 ManagementObjectAdapter 隐式完成的。

@bob0123 发现了我的错误。所以也支持他的回答。

【讨论】:

  • 有道理,但在最后一行: ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", whdr, null);我有 ManagmentException is unhandled: {"Not Found"} (ErrorCode: System.Management.ManagementStatus.NotFound).. 我很困惑,因为这意味着我的 AdapterInstance 没有 WmiQueryReceiveScaleCapabilities ?,但在 PowerShell 上一切正常,嗯..
【解决方案2】:

对于完整工作的代码,我在版本 Yoh Deadfall 中添加了两行(感谢提示!):

ManagementBaseObject hdr = new ManagementClass("root\\wmi:MSNdis_ObjectHeader").CreateInstance();
                    hdr["Revision"] = 1;
                    hdr["Type"] = 0x02;
                    hdr["Size"] = 0xffff;

ManagementBaseObject whdr = new ManagementClass("root\\wmi:MSNdis_WmiMethodHeader").CreateInstance();
                    whdr["Header"] = hdr;
                    whdr["PortNumber"] = 0;
                    whdr["NetLuid"] = 0;
                    whdr["Padding"] = 0;
                    whdr["RequestId"] = 0;
                    whdr["Timeout"] = 5;

ManagementBaseObject inParams =  AdapterInstance.GetMethodParameters("WmiQueryReceiveScaleCapabilities");
inParams["Header"] = whdr;

ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", inParams, null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2019-10-22
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多