【问题标题】:c program for linux, to get a serial number of the device, for a non-root user [closed]用于Linux的c程序,用于获取设备的序列号,适用于非root用户[关闭]
【发布时间】:2014-01-19 00:58:40
【问题描述】:

我试过ioctlHDIO_GET_IDENTITY来确定硬盘的序列号,但它需要root权限。

请帮我用c写一个程序来获取设备的序列号(hdd、cpu、mb)或mac地址,不需要root权限。

【问题讨论】:

    标签: c++ c licensing


    【解决方案1】:

    为什么不使用 MAC 地址作为唯一的计算机 ID。这是获取接口之一的 MAC 地址的代码。下面的代码基本上读取了所有可用接口的名称,然后遍历它们以获取第一个不包括环回接口的 MAC 地址。

    int main()
    {
    struct ifreq ifr;
    struct ifconf ifc;
    char buf[1024];
    int success = 0;
    
    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (sock == -1) { /* handle error*/ };
    
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = buf;
    if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }
    
    struct ifreq* it = ifc.ifc_req;
    const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));
    
    for (; it != end; ++it) {
        strcpy(ifr.ifr_name, it->ifr_name);
        if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
            if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
                if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
                    success = 1;
                    break;
                }
            }
        }
        else { /* handle error */ }
    }
    
    unsigned char mac_address[6];
    
    if (success) memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
    }
    

    【讨论】:

    • 大多数网卡上的mac地址不能改吗?如果用户更换网卡会怎样?
    • 是的,在可插拔 NIC 卡的情况下可能,但如果它是板载的则很难
    • 使用高清序列号时同样的问题。用户也可以更改高清。
    • 这是个好主意。谢谢@VikramSingh
    • @ErikKianu 很酷.. 如果它真的有帮助,请接受答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2020-11-07
    • 1970-01-01
    • 2018-10-09
    • 2011-02-01
    • 2010-09-06
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多