我使用以下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..
答案 0 :(得分:2)
Win32_NetworkAdapter
具有InterfaceIndex
属性。阅读适配器的InterfaceIndex
值,然后运行另一个搜索Win32_IP4RouteTable
的查询,查找相同的InterfaceIndex
值。 Win32_IP4RouteTable
有Name
,Caption
和Description
个属性。
话虽如此,Win32_NetworkAdapter
已被弃用,主要是因为它只支持IPv4。请改为使用MSFT_NetAdapter
,它同时支持IP4和IPv6,并具有InterfaceName
和InterfaceDescription
属性。
话虽这么说,另一种选择是不要将WMI用于此任务。您可以改用GetAdaptersAddresses()
。它返回一个IP_ADAPTER_ADDRESSES
项数组,其中IP_ADAPTER_ADDRESSES
包含IfIndex
和Ipv6IfIndex
个字段,可用于匹配GetInterfaceInfo()
返回的数组中的条目,GetIfTable()
,GetIfTable2()
等