PowerShell C# WMI 为 InvokeMethod 正确填充输入对象
PowerShell C# WMI correct filling input object for InvokeMethod
我在将 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);
//
}
}
}
感谢您的帮助。
鲍勃
您的 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 发现了我的错误。所以也为他的回答点赞。
对于完整的代码,我在 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);
我在将 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);
//
}
}
}
感谢您的帮助。 鲍勃
您的 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 发现了我的错误。所以也为他的回答点赞。
对于完整的代码,我在 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);