在需要对计算机进行标识的场景下,我们一般会选择获取一些硬件信息。然而CPU序列号可能有重复、网卡MAC地址和计算机名又能被轻易地修改,所以其中最可靠的应该就是硬盘序列号了。Windows下硬盘序列号的获取本身并不复杂,而关键在于如何在无需权限提升的情况下获取到硬盘序列号。为了解决这个问题,我也查了很多资料,基本上各大博客中贴出的都是需要权限提升的代码。
最终,在DiskID32的源码中,我找到了不提权获取硬盘序列号的办法。不过其源码只能使用MBCS多字节字符集方式编译,而无法使用Unicode字符集编译,为此,我进行了一些修改,使之兼容两种方式。下面将经过我修改、测试后的代码贴出来,供大家参考。
其中,获取硬盘序列号的函数命名为GetHDSerial,该函数依赖flipAndCodeBytes函数。前者使用说明如下:
- 函数名:GetHDSerial
功能:用于获取指定编号的硬盘序列号,无需任何权限提升 参数:
- PCHAR pszIDBuff:传入的字符串缓冲区,用于接收硬盘序列号
- int nBuffLen:传入的字符串缓冲区大小,当硬盘序列号大于该值时,只复制nBuffLen长度
- int nDriveID:要获取的驱动器编号,从0开始,到15为止
返回值:成功获取到的硬盘序列号长度,为0表示获取失败
#include <locale.h>
#include <tchar.h>
#include <windows.h>
#include <stdio.h>
char * flipAndCodeBytes(const char * str,
int pos,
int flip,
char * buf)
{
int i;
int j = 0;
int k = 0;
buf[0] = '\0';
if (pos <= 0)
return buf;
if (!j)
{
char p = 0;
// First try to gather all characters representing hex digits only.
j = 1;
k = 0;
buf[k] = 0;
for (i = pos; j && str[i] !=