如何列出所有已启用的网络连接名称(接口)

时间:2015-08-29 16:47:05

标签: delphi delphi-xe7

我使用以下Delphi过程GetAdapters列出所有已启用的网络适配器:

procedure GetAdapters;
var
  oBindObj : IDispatch;
  oNetAdapters, oNetAdapter,
  odnsAddr, oWMIService : OleVariant;
  i, iValue : LongWord;
  oEnum : IEnumVariant;
  oCtx : IBindCtx;
  oMk : IMoniker;
  sFileObj : WideString;
begin
  MainForm.sComboBox1.Items.Clear;
  sFileObj := 'winmgmts:\\.\root\cimv2';

  OleCheck(CreateBindCtx(0,oCtx));
  OleCheck(MkParseDisplayNameEx(oCtx, PWideChar(sFileObj), i, oMk));
  OleCheck(oMk.BindToObject(oCtx, nil, IUnknown, oBindObj));
  oWMIService := oBindObj;

  oNetAdapters := oWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter=True AND MACAddress IS NOT NULL AND AdapterType IS NOT NULL');

  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

  while oEnum.Next(1, oNetAdapter, iValue) = 0 do begin
    try
      MainForm.sCombobox1.Items.Add(oNetAdapter.Caption);
    except
    end;

    oNetAdapter := Unassigned;
  end;

  odnsAddr := Unassigned;
  oNetAdapters := Unassigned;
  oWMIService := Unassigned;
end;

当我需要更改IP时,我需要指定网络接口名称,而不是适配器名称。

如何列出Windows网络和共享中心中列出的网络连接名称。

示例:

Windows 7

Local Area Connection
Wireless Network Connection
Wireless Network Connection 1

Windows 10

Wifi
Wifi 2
etc..

1 个答案:

答案 0 :(得分:2)

Win32_NetworkAdapter具有InterfaceIndex属性。阅读适配器的InterfaceIndex值,然后运行另一个搜索Win32_IP4RouteTable的查询,查找相同的InterfaceIndex值。 Win32_IP4RouteTableNameCaptionDescription个属性。

话虽如此,Win32_NetworkAdapter已被弃用,主要是因为它只支持IPv4。请改为使用MSFT_NetAdapter,它同时支持IP4和IPv6,并具有InterfaceNameInterfaceDescription属性。

话虽这么说,另一种选择是不要将WMI用于此任务。您可以改用GetAdaptersAddresses()。它返回一个IP_ADAPTER_ADDRESSES项数组,其中IP_ADAPTER_ADDRESSES包含IfIndexIpv6IfIndex个字段,可用于匹配GetInterfaceInfo()返回的数组中的条目,GetIfTable()GetIfTable2()