重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
'要使得引用System.Management有效,先通过菜单
创新互联公司是一家集网站建设,南澳企业网站建设,南澳品牌网站建设,网站定制,南澳网站建设报价,网络营销,网络优化,南澳网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
'[项目]--[添加引用],在“.Net”选项卡里,选择“System.Management”,单击[确定]
Imports System.Management
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim MySearcher As New ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration")
For Each MySearcherObj As ManagementObject In MySearcher.Get
If CBool(MySearcherObj("IPEnabled")) Then
MsgBox(MySearcherObj("IPAddress")(0))
End If
Next
End Sub
End Class
.net不能获得【指定】网卡的信息,给个思路,先遍历所有网卡,然后找到你需要的的那个网卡的信息。
若系统中安装了 VMWare 或者某些 VPN 客户端软件,则会出现若干虚拟网卡。它们在形式上与物理网卡几乎没有区别。 ipconfig 将它们与本地物理网卡等同对待。 那如何在如何区分虚拟网卡还是物理网卡呢?
有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。但是事实上不能100%区分,在win2000之后的系统基本是行不通的。
有人用GetAdaptersInfo 可以获得本机所有网卡的信息,然后通过判断是否“pci”开头来区分是否虚拟网卡。 具体代码如下:(以下代码引用别处)
bool IsLocalAdapter ( const char *pAdapterName ) const
...{
BOOL ret_value = FALSE;
#define NET_CARD_KEY "System\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"
char szDataBuf[MAX_PATH+1];
DWORD dwDataLen = MAX_PATH;
DWORD dwType = REG_SZ;
HKEY hNetKey = NULL;
HKEY hLocalNet = NULL;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, hNetKey))
return FALSE;
sprintf(szDataBuf, "%s\Connection", pAdapterName);
if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, hLocalNet))
...{
RegCloseKey(hNetKey);
return FALSE;
}
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType", 0, dwType, (BYTE *)szDataBuf, dwDataLen))
...{
goto ret;
}
if (*((DWORD *)szDataBuf)!=0x01)
goto ret;
dwDataLen = MAX_PATH;
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID", 0, dwType, (BYTE *)szDataBuf, dwDataLen))
...{
goto ret;
}
if (strncmp(szDataBuf, "PCI", strlen("PCI")))
goto ret;
ret_value = TRUE;
ret:
RegCloseKey(hLocalNet);
RegCloseKey(hNetKey);
return ret_value!=0;
}
这样方法基本可以达到目标,但是也存在不能识别所有网卡类型。
还有一种更简单,而且可以100%识别的方法,就是通过“Characteristics”这个值来确定网卡的类型是虚拟网卡还是物理网卡。
Characteristics 值在注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\数字下。
在windows中,Characteristics 的取值如下,Characteristics项可以有1个或多个如下的值(多值应计算总和):
十六进制值 名字 描述
ox1 NCF_VIRTUAL 说明组件是个虚拟适配器
ox2 NCF_SOFTWARE_ENUMERATED 说明组件是一个软件模拟的适配器
ox4 NCF_PHYSICAL 说明组件是一个物理适配器
ox8 NCF_HIDDEN 说明组件不显示用户接口
ox10 NCF_NO_SERVICE 说明组件没有相关的服务(设
备驱动程序)
ox20 NCF_NOT_USER_REMOVABLE 说明不能被用户删除(例如,
通过控制面板或设备管理器)
ox40 NCF_MULTIPORT_INSTANCED_ADAPTER 说明组件有多个端口,每个端
口作为单独的设备安装。每个
端口有自己的hw_id(组件ID)
并可被单独安装,这只适合于
EISA适配器
ox80 NCF_HAS_UI 说明组件支持用户接口(例如,
Advanced Page或Customer
Properties Sheet)
ox400 NCF_FILTER 说明组件是一个过滤器
从上面可以看出来,只要用户判断“Characteristics ”的值就可以判断网卡是虚拟网卡还是物理网卡。
如果是虚拟网卡:Characteristics NCF_VIRTUAL ==NCF_VIRTUAL
如果是物理网卡:Characteristics NCF_PHYSICAL ==NCF_PHYSICAL