0

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\SYSTEM\CurrentControlSet\Services\tcpip\Parameters\Interfaces

HKLM\SYSTEM\CurrentControlSet\Control\Network{4D36E972-E325-11CE-BFC1-08002BE10318}

4

1 に答える 1

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 を使用して、アプリケーションからこれを実行します。

私はまだコードをテストしていません。これは私の頭のてっぺんです。

于 2013-08-18T20:53:37.983 に答える