我想做一个注册机之类的东西。需要读取机器的硬盘序列号和网卡MAC地址(不知道说法是否正确,高手勿笑:)),用GetVolumeInformation读出来的是逻辑序列号,请问怎样获得硬盘物理序列号呢?GetVolumeInformation中的第一个参数(好像是设置盘符名称的)我如果不指定(为空)也可以读出来一些东西,不过好像比指定盘符时的短一些,不知道不指定时读出的是什么?还有怎么读取网卡MAC地址?从网上找的好多都有问题。

解决方案 »

  1.   

    我是用WMI获取的MAC和硬盘序列号的。不过同一系列的硬盘取到的序列号是相同的,不知道取对没。
      

  2.   

    不光是硬盘序列号,CPU序列号现在也是一样的,建议你用微软提供的WMI工具查看硬盘序列号和CPU序列号
      

  3.   

    总算把获得mac的代码找着了。就差硬盘物理序列号了。有代码的朋友帮帮忙呀。或者解释一下:
    GetVolumeInformation中的第一个参数(好像是设置盘符名称的)我如果不指定(为空)也可以读出来一些东西,不过好像比指定盘符时的短一些,不知道不指定时读出的是什么?
      

  4.   

    一些VB的,不知有用否?
    http://www.99inf.net/Article/netjc/vbnetl/2005-05-24/21335.html获得硬盘序列号 Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive") Dim Uint32 As UInt32 For Each cmicWmiObj As ManagementObject In cmicWmi.Get Uint32 = cmicWmiObj("signature") Next TextBox1.Text = Uint32.ToString '获得CPU序列号 Dim Wmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_Processor") Dim Uint32 As String For Each WmiObj As ManagementObject In Wmi.Get Uint32 = WmiObj("ProcessorId") Next TextBox1.Text = Uint32 '获得硬盘总容量 Dim Wmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive") Dim Uint64 As UInt64 For Each WmiObj As ManagementObject In Wmi.Get Uint64 = WmiObj("size") Next TextBox1.Text = Uint64.ToString 首先,引用System.Management;然后在代码中Imports System.Management; 
      

  5.   

    获取网卡MAC
    #if defined(WIN32) || defined(__WIN32__)
        #include <Iprtrmib.h>
        #include <Iphlpapi.h>    #pragma comment(lib, "Iphlpapi.lib")
    #endifstring get_localhost_mac_addr()
    {
        string mac;#if defined(WIN32) || defined(__WIN32__)    #ifdef IPRTRMGR_PID
        PIP_ADAPTER_INFO pAdapterInfo;
        PIP_ADAPTER_INFO pAdapter = NULL;
        DWORD dwRetVal = 0;    pAdapterInfo = (IP_ADAPTER_INFO*) malloc(sizeof(IP_ADAPTER_INFO));
        ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
        {
            free(pAdapterInfo);
            pAdapterInfo = (IP_ADAPTER_INFO*) malloc(ulOutBufLen); 
        }    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
        {
            pAdapter = pAdapterInfo;
            while (pAdapter)
            {
                if (pAdapter->AddressLength >= 6)
                {
                    char szMAC[32];
                    sprintf(szMAC, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", 
                        pAdapter->Address[0], 
                        pAdapter->Address[1], 
                        pAdapter->Address[2], 
                        pAdapter->Address[3], 
                        pAdapter->Address[4], 
                        pAdapter->Address[5]); 
                    
                    mac = szMAC;                break;
                }
                pAdapter = pAdapter->Next;
            }
        }
        #endif#else    #if 0    ::system("ifconfig eth0 | head -1 > mactmp.dat");    file_t f;
        if (f.open_exist("mactmp.dat"))
        {
            char buf[256];
            memset(buf, 0, sizeof(buf));
            int len = f.read(buf, 256);
            if (len)
            {
                char* pos = strstr(buf, "HWaddr");
                if (pos) mac = (pos + 7);
            }
        }    #else    #if defined(PF_PACKET)
        SOCKET s = socket(PF_PACKET, SOCK_RAW, 0);
        #else
        SOCKETs = socket(AF_INET, SOCK_PACKET, SOCK_PACKET);
        #endif
        
        char *ifname = "eth0";    struct ifreq if_hwaddr;
        unsigned char *hwaddr = (unsigned char*)if_hwaddr.ifr_hwaddr.sa_data;    strcpy(if_hwaddr.ifr_name, ifname);
        if (IOCTLSOCKET(s, SIOCGIFHWADDR, &if_hwaddr) >= 0)
        {
            char str[32];
            sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", hwaddr[0], hwaddr[1],
                   hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
            mac = str;
        }    #endif
    #endif    return mac;
    }
      

  6.   

    http://community.csdn.net/Expert/topic/4205/4205897.xml?temp=.8650019
      

  7.   

    不过mac地址你发现或取的是系统的不是网卡固化的,!!!!!!!!!!
    还有那个获取硬盘序列号的不对的
    以上的方法你重装一遍系统就全不一样了
    我曾做过类似的注册程序,不过你....
    你可以baidu一下类似的情况~~~~~~~~~~~~~~~~~~
      

  8.   

    哪个获取硬盘序列号的不对? wihi(wihi.net)的获取mac也不对吗?我在网上搜了很久了,也搜不到获得硬盘物理序列号的方法(或者搜到了,但是太乱,看不明白),不知道我的那个获取mac的是不是也不行,如果重装系统后都变,那就不行。
      

  9.   

    Getting the MAC Address for an Ethernet Adapter
    You can use the Netbios function to get the Media Access Control (MAC) address for an ethernet adapter if your card is bound to NetBIOS. The following example uses the NCBASTAT command, providing an asterisk (*) as the name in the ncb_callname member of the NCB structure. Note  The following code does not work reliably on Windows 95 or Windows 98. #include <windows.h>
    #include <wincon.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>typedef struct _ASTAT_
    {
        ADAPTER_STATUS adapt;
        NAME_BUFFER    NameBuff [30];
    }ASTAT, * PASTAT;ASTAT Adapter;void main (void)
    {
        NCB ncb;
        UCHAR uRetCode;
        char NetName[50];    memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBRESET;
        ncb.ncb_lana_num = 0;    uRetCode = Netbios( &ncb );
        printf( "The NCBRESET return code is: 0x%x \n", uRetCode );    memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBASTAT;
        ncb.ncb_lana_num = 0;    strcpy( ncb.ncb_callname,  "*               " );
        ncb.ncb_buffer = (char *) &Adapter;
        ncb.ncb_length = sizeof(Adapter);    uRetCode = Netbios( &ncb );
        printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
        if ( uRetCode == 0 )
        {
            printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
                    Adapter.adapt.adapter_address[0],
                    Adapter.adapt.adapter_address[1],
                    Adapter.adapt.adapter_address[2],
                    Adapter.adapt.adapter_address[3],
                    Adapter.adapt.adapter_address[4],
                    Adapter.adapt.adapter_address[5] );
        }
    }
     
     
      

  10.   

    或者参见  。NET 2003 帮助里的 platform Sdk : Ip HELPER   在索引里输入   getadaptersinfo  你可以从这里知道如何取 MAC 地址  
    硬盘的序列号  本人无能为力了 
      

  11.   

    你自己在虚拟机下试一下,重装系统,mac还是会变的,获取mac其实就这几句啊
    GUID uuid; 
    CoCreateGuid(&uuid); 
    printf("%02X:%02X:%02X:%02X:%02X:%02X",uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],uuid.Data4[5],uuid.Data4[6],uuid.Data4[7]); 
    但是你要试一下重装系统的问题
      

  12.   

    非常感谢上边几位!我试过重装系统的话,mac不会变,现在在网上找了一个获取硬盘物理序列号的dll,但是不会用,附带有一个做好的demo,我试了一下,那个获取的硬盘序列号重装系统后不会变。可惜我不会用那个dll。郁闷哪!晚上还没新消息的话,就结贴。