国际化选择要绑定的网络适配器的正确方式



我有一个应用程序需要绑定到"Microsoft环回适配器"。我可以枚举所有的网络设备,并在友好名称上执行字符串匹配,但当然,这在国际Windows变体上会失败。

识别正确网络适配器的正确方法是什么?

您担心对面向用户的字符串进行硬编码是正确的。本地化不仅是一个问题,而且字符串在Windows7中也发生了变化。因此,"微软环回适配器"甚至无法与最新操作系统的美国版本相匹配。

你能找到的最好的不变量是网络接口的硬件ID,它是*MSLOOP,包括文字星号。

一种方法是使用CCD_ 2。要点是找到一个INetCfgComponent,其中它的GetId方法返回字符串"*msloop"。一旦知道了匹配的组件,就可以从GetInstanceGuid中查询其GUID。该GUID在许多网络API中唯一标识NIC。如果需要将GUID转换为其他标识符(如ifAlias或NET_LUID),则可以使用GetIfTable2Ex或related将GUID映射到其他标识符。

在伪代码中,可能类似于:

CoInitializeEx
CoCreateInstance(CLSID_CNetCfg, 0, CLSCTX_SERVER, IID_PPV_ARGS(&netcfg));
netcfg->Initialize(0)
netcfg->EnumComponents(GUID_DEVCLASS_NET, &enumerator)
while (S_OK == enumerator->Next(1, &component, 0))
    component->GetId(&id)
    if (id case-insensitive-match "*msloop")
        component->GetInstanceGuid(result)
        print "Windows loopback adapter: " + result

如果你有幸在Windows 8或更高版本上运行,这可以在PowerShell中很容易地执行:

Get-NetAdapter | Where ComponentID -eq '*msloop'

从那里,你可以剥离任何有趣的属性,甚至直接进入它的IP地址:

Get-NetAdapter | 
    Where ComponentID -eq '*msloop' | 
    Get-NetIPAddress -AddressFamily IPv4 |
    fl IPAddress

最新更新