c#NetworkInterface.GetAllNetworkInterfaces vs WMI Win32_NetworkAdapter

时间:2013-08-18 20:42:27

标签: wmi ethernet

我使用GetBestInterface(iphlpapi.dll)获得了一个InterfaceIndex。

目标:阅读其他界面属性。

此WMI查询速度很慢:

SELECT MACAddress,Name,GUID,NetConnectionID FROM Win32_NetworkAdapter WHERE InterfaceIndex=

在C#中,更快,

NetworkInterface.GetAllNetworkInterfaces()

但是每个NetworkInterface都没有属性InterfaceIndex(sic!)。

我不知道如何优化它:

    EnumerationOptions wmi_options = new EnumerationOptions();
    wmi_options.Rewindable = false;
    wmi_options.ReturnImmediately = true;
    string wql = "SELECT MACAddress,Name,GUID,NetConnectionID FROM Win32_NetworkAdapter WHERE InterfaceIndex=" + iface;
    ManagementObjectCollection recordset = new ManagementObjectSearcher(@"root\cimv2", wql, wmi_options).Get();
    foreach (ManagementObject mo in recordset)

选项似乎没有帮助。 我可以拆分操作并缓存任何步骤吗?

或另一条路径:避免WMI并从注册表中查找接口(使用InterfaceIndex)?

  

HKLM \系统\ CurrentControlSet \服务\ TCPIP \参数\接口

     

HKLM \系统\ CurrentControlSet \控制\网络{4D36E972-E325-11CE-BFC1-08002BE10318}

1 个答案:

答案 0 :(得分:0)

我不知道这实际上是否更快,但你尝试过PowerShell吗?

string IfIndex = "15";
        string psscript = "get-netadapter |  Where-Object interfaceindex -eq " + IfIndex;
        PowerShell powershell = PowerShell.Create();
        powershell.Runspace = RunspaceFactory.CreateRunspace();
        powershell.Runspace.Open();
        powershell.AddScript(psscript);
        foreach (PSObject result in powershell.Invoke())
        {
            Console.WriteLine("Name: {0} " + "Status: {1}",result.Members["Name"].Value, result.Members["status"].Value);
        }
        Console.Read();

使用System.Management.Automation& System.Management.Automation.Runspaces;

我还没有测试过代码,这是我的头脑。