VC实现查看无线网卡的MAC地址

VC实现查看无线网卡的MAC地址,第1张

我不知道微软对网卡类型是否有统一标准。目前对ipconfig列出的信息

我们一般有两个步骤可以获取到:

1)大部分信息(包括MAC)通过GetAdaptersInfo可以获取到,但IP_ADAPTER_INFO结构里的“type域”对无线网卡无能为力,始终都是6(MIB_IF_TYPE_ETHERNET)

2)IP_ADAPTER_INFO中“AdapterName”存储的是设备的UUID,该值在注册表中有记载:

“HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}”

始终在“{4D36E972-E325-11CE-BFC1-08002BE10318}”下会有子键对应IP_ADAPTER_INFO的“AdapterName”域的UUID。并且在该子键中有一个项目“Name”,“Name”对应的是连接类型字符串,如“本地连接”、“无线网络连接”。该项对应的字符串值和ipconfig获取的信息是一致的。

唯一可惜的是它是个字符串值,而不是个数值。是否所有的无线网卡都能匹配该字符串值,我不知道。

一、Linux网络属性配置

1Linux主机接入到网络方式

IP/NETMASK:实现本地网络通信

路由(网关):可以进行跨网络通信

DNS服务器地址:基于主机名的通信,Linux可以有三个DNS地址

当第一个地址本身挂了,才会查找其备用地址;若第一个地址无法解析则停止

2网络属性配置方式

(1)静态指定

1)命令方式

ifcfg系列命令:

ifconfig:配置IP,NETMASK

route:配置路由相关信息

netstat:状态及统计数据查看

iiproute2系列命令:

ip OBJECT:

addr:地址和掩码;

link:接口

route:路由

ss:状态及统计数据查看

CentOS 7:nm(Network Manager)家族

nmcli:命令行工具

nmtui:text window 工具

hostname/hostnamectl:主机名配置

2) 配置文件:

RedHat及相关发行版:/etc/sysconfig/network-scripts/ifcfg-NETCARD_NAME

DNS服务器指定配置文件:/etc/resolvconf

本地主机名配置文件:/etc/sysconfig/network

注:命令配置能及时生效,但时关闭当前进程之后配置失效,为一次性配置方式

通过配置文件配置网络属性,无法立即生效,需要重启服务、重新加载配置文件或者重启进程

(2)动态分配:依赖于本地网络中有DHCP服务

DHCP:Dynamic Host Configure Procotol, 动态主机配置协议,此时不能固定IP地址

3网络接口命名

(1)传统命名

以太网:eth#,例如eth0, eth1, …

PPP网络:ppp#, 例如,ppp0, ppp1, …

(2)可预测命名方案(CentOS 7)

支持多种不同的命名机制,根据Fireware, 拓扑结构等信息自动配置

1) Firmware或BIOS为主板上集成的设备提供的索引信息可用,则根据此索引进行命名,如eno1,eno2, …

2) Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名,如ens1, ens2, …

3) 如果硬件接口的物理位置信息可用,则根据此信息命名,如enp2s0, …

4) 如果用户显式定义,也可根据MAC地址命名,例如eno16777736(十六进制MAC), …

5)上述均不可用,则仍使用传统方式命名;

(3)命名格式的组成

en:ethernet,表示因特网网卡接口

wl:wlan,表示无线网网卡接口

ww:wwan,Wireless Wide Area Network,表示无线广域网网卡

(4)名称类型:

o<index>:集成设备的设备索引号;

s<slot>:扩展槽的索引号;

x<MAC>:基于MAC地址的命名;

p<bus>s<slot>:基于总线及槽的拓扑结构进行命名;

在#include <pcap/pcaph>的下面,加3行:

#pragma comment(lib, "Libnetlib")

#pragma comment(lib, "Packetlib")

#pragma comment(lib, "wpcaplib")

如果提示找不到这三个LIB的话,就把VS的LIB路径设置到有这三个文件的目录上

Linux *** 作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的,缺点是比 eth0、wlan0 更难读,比如 ens33 。

规则1:

对于板载设备命名合并固件或 BIOS 提供的索引号,如果来自固件或 BIOS 的信息可读就命名,比如eno1,这种命名是比较常见的,否则使用规则2。

规则2:

命名合并固件或 BIOS 提供的 PCI-E 热插拔口索引号,比如 ens1,如果信息可读就使用,否则使用规则3。

规则3:

命名合并硬件接口的物理位置,比如 enp2s0,可用就命名,失败直接到方案5。

规则4:

命名合并接口的 MAC 地址,比如 enx78e7d1ea46da,默认不使用,除非用户选择使用此方案。

规则5:

使用传统的方案,如果所有的方案都失败,使用类似 eth0 这样的样式。

1、前2个字符的含义

2、第3个字符根据设备类型选择

如果不习惯使用新的命名规则,可以恢复使用传统的方式命名,编辑 grub 文件,增加两个变量,再使用 grub2-mkconfig 重新生成 grub 配置文件即可。

1、编辑 grub 配置文件

2、重新生成 grub 配置文件

然后重新启动 Linux *** 作系统,通过 ip addr 可以看到网卡名称已经变为 eth0 。

3、修改网卡配置文件

原来网卡配置文件名称为 ifcfg-ens33,这里需要修改为 ethx 的格式,并适当调整网卡配置文件。

注意:ifcfg-ens33 文件最好删除掉,否则重启 network 服务时候会报错。

PHP获取网卡MAC地址的方法- -

做一个限定用户登录的东西时用到这段代码,可能还有人会用到,拿出来分享

<php

@exec("ipconfig /all",$array);

for($Tmpa;$Tmpa<count($array);$Tmpa++){

if(eregi("Physical",$array[$Tmpa])){

$mac=explode(":",$array[$Tmpa]);

echo $mac[1];

}

}

>

CString GetMacAddress()

/

    通过WMI取第一块活动网卡地址,事先需要调用过CoInitialize()初始化COM

/

{

    HRESULT hRes;

    hRes = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,

        RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

    if (FAILED(hRes))

        return _T("");

    IWbemLocator pLoc = NULL;

    hRes = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID)&pLoc);

    if (FAILED(hRes))

        return _T("");

    IWbemServices pSvc = NULL;

    hRes = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0,

        NULL, 0, 0, &pSvc);

    if (FAILED(hRes))

    {

        pLoc->Release();     

        return _T("");

    }

    hRes = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,

        NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT);

    if (FAILED(hRes))

    {

        pSvc->Release();

        pLoc->Release();     

        return _T("");

    }

    IEnumWbemClassObject pEnumerator = NULL;

    hRes = pSvc->ExecQuery(_bstr_t(L"WQL"), 

        _bstr_t(L"SELECT  FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"),

        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 

        NULL, &pEnumerator);

    if (FAILED(hRes))

    {

        pSvc->Release();

        pLoc->Release();

        return _T("");

    }

    CString szMacAddress = _T("");

    while (true)

    {

        IWbemClassObject pclsObj = NULL;

        ULONG uReturn = 0;

        hRes = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

        if (FAILED(hRes) || !uReturn)

            break;

        VARIANT vtProp;

        VariantInit(&vtProp);

        if (SUCCEEDED(pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0)))

        {

            if (V_VT(&vtProp) == VT_BSTR)

            {

                szMacAddress = vtPropbstrVal;

                VariantClear(&vtProp);

                pclsObj->Release();

                break;

            }

            VariantClear(&vtProp);

        }

        pclsObj->Release();

    }

    pEnumerator->Release();

    pSvc->Release();

    pLoc->Release();

    return szMacAddress;

}

------解决方案--------------------奥,那个DLL大概在02年左右整理的好像,时间太久了,应该是不支持vsita的,楼主看看这段代码是否有用?我是拷贝来的:/  //函数名称:GetDriverInfomation  //函数功能:得到驱动器的信息  //参数1:bAlpha - BYTE型,驱动器的代号A-Z(a-z)  //参数2:iGTI_TYPE - int,将要获取的驱动器信息类型  // GDI_VOLUMENAME 得到驱动器名字  // GDI_VOLUMESERIALNUMBER 得到驱动器序列号  // GDI_VOLUMEFILESYSTEM 得到驱动器文件系统  // GDI_VOLUMETYPE 得到驱动器类型  // GDI_VOLUMESIZE 得到驱动器总大小  // GDI_VOLUMEFREESIZE 得到驱动器剩余大小  //返回值:CString型,所要得到的驱动器信息的字符串表达  //例子:得到C盘的名字GetDriverInfomation('C',GDI_VOLUMENAME)  /  #define GDI_VOLUMENAME 0  #define GDI_VOLUMESERIALNUMBER 1  #define GDI_VOLUMEFILESYSTEM 2  #define GDI_VOLUMETYPE 3  #define GDI_VOLUMESIZE 4  #define GDI_VOLUMEFREESIZE 5  CString GetDriverInfomation(BYTE bAlpha,int iGTI_TYPE)  {  CString strResult = _T("");

代码如下:

using System;

using SystemDrawing;

using SystemWindowsForms;

using SystemManagement;  //必须在项目中添加SystemManagement引用!

using SystemCollectionsGeneric;

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            

            comboBox1DropDownStyle = ComboBoxStyleDropDownList;

            comboBox1ItemsAddRange(GetNetcardName()ToArray());

       }

        // 获取计算机上安装的网卡名称

        private List<string> GetNetcardName()

        {

            List<string> cardNames = new List<string>();

            

            ManagementClass mc = 

                new ManagementClass("Win32_NetworkAdapter");

            ManagementObjectCollection moc = mcGetInstances();

            

            foreach (ManagementObject mo in moc)

            {

                 cardNamesAdd(mo["Description"]ToString());

            }

            return cardNames;

        }

    }

}

以上就是关于VC实现查看无线网卡的MAC地址全部的内容,包括:VC实现查看无线网卡的MAC地址、Linux关于网卡的几个命令、刚刚开始学winpcap编程,第一个是获取网卡详细信息的程序,编译时出现这个错误。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9495135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存