调用控制台来获取CPU序列号/硬盘号
不同PC的硬盘数量可能不同 若有多个硬盘,此处的输出将多个硬盘号拼接到了一起 若需拆分可自行修改。
注:插拔硬盘U盘等会造成获取到的硬盘号不同,如果想以此为机器码的同学可用BIOS序列号替代硬盘号。命令行调用改为wmic bios get serialnumber 即可

#if !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)
#define AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_  #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000  #include <iostream>
#include <string>
#include <windows.h>
//#define CPUSIZE 17using namespace std;//--------------------------------------------------------------
//                      CPU序列号
//--------------------------------------------------------------
BOOL GetCpuByCmd(string &ider, int len = 128);BOOL GetDiskByCmd(string &ider, int len = 128);#endif // !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)  //--------------------------------------------------------------
//                      CPU序列号
//--------------------------------------------------------------
BOOL GetCpuByCmd(string &ider, int len/*=128*/)
{//CPU序列const long MAX_COMMAND_SIZE = 10000; // 命令行输出缓冲大小     WCHAR szFetCmd[] = L"wmic cpu get processorid"; // 获取CPU序列号命令行    const string strEnSearch = "ProcessorId"; // CPU序列号的前导信息  BOOL   bret = FALSE;HANDLE hReadPipe = NULL; //读取管道  HANDLE hWritePipe = NULL; //写入管道      PROCESS_INFORMATION pi;   //进程信息      STARTUPINFO         si;   //控制命令行窗口信息  SECURITY_ATTRIBUTES sa;   //安全属性  char            szBuffer[MAX_COMMAND_SIZE + 1] = { 0 }; // 放置命令行结果的输出缓冲区  string          strBuffer;unsigned long   count = 0;long            ipos = 0;memset(&pi, 0, sizeof(pi));memset(&si, 0, sizeof(si));memset(&sa, 0, sizeof(sa));pi.hProcess = NULL;pi.hThread = NULL;si.cb = sizeof(STARTUPINFO);sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;//1.0 创建管道  bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);if (!bret){goto END;}//2.0 设置命令行窗口的信息为指定的读写管道  GetStartupInfo(&si);si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE; //隐藏命令行窗口  si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//3.0 创建获取命令行的进程  bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);if (!bret){goto END;}//4.0 读取返回的数据  WaitForSingleObject(pi.hProcess, 500/*INFINITE*/);bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);if (!bret){goto END;}//5.0 查找CPU序列号  bret = FALSE;strBuffer = szBuffer;ipos = strBuffer.find(strEnSearch);if (ipos < 0) // 没有找到  {goto END;}else{strBuffer = strBuffer.substr(ipos + strEnSearch.length());}memset(szBuffer, 0x00, sizeof(szBuffer));strcpy_s(szBuffer, strBuffer.c_str());//modify here//去掉中间的空格 \r \n     char temp[512];memset(temp, 0, sizeof(temp));int index = 0;for (size_t i = 0; i < strBuffer.size(); i++){if (strBuffer[i] != ' '&&strBuffer[i] != '\n'&&strBuffer[i] != '\r'){temp[index] = strBuffer[i];index++;}}ider = temp;bret = TRUE;END://关闭所有的句柄  CloseHandle(hWritePipe);CloseHandle(hReadPipe);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return(bret);
}//--------------------------------------------------------------
//                      硬盘编号
//--------------------------------------------------------------
BOOL GetDiskByCmd(string &ider, int len/*=128*/)
{//diskdriveconst long MAX_COMMAND_SIZE = 10000; // 命令行输出缓冲大小     WCHAR szFetCmd[] = L"wmic diskdrive get serialnumber"; // 获取DiskDrive命令行    const string strEnSearch = "SerialNumber"; // DiskDrive序列号的前导信息  BOOL   bret = FALSE;HANDLE hReadPipe = NULL; //读取管道  HANDLE hWritePipe = NULL; //写入管道      PROCESS_INFORMATION pi;   //进程信息      STARTUPINFO         si;   //控制命令行窗口信息  SECURITY_ATTRIBUTES sa;   //安全属性  char            szBuffer[MAX_COMMAND_SIZE + 1] = { 0 }; // 放置命令行结果的输出缓冲区  string          strBuffer;unsigned long   count = 0;long            ipos = 0;memset(&pi, 0, sizeof(pi));memset(&si, 0, sizeof(si));memset(&sa, 0, sizeof(sa));pi.hProcess = NULL;pi.hThread = NULL;si.cb = sizeof(STARTUPINFO);sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;//1.0 创建管道  bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);if (!bret){goto END;}//2.0 设置命令行窗口的信息为指定的读写管道  GetStartupInfo(&si);si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE; //隐藏命令行窗口  si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//3.0 创建获取命令行的进程  bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);if (!bret){goto END;}//4.0 读取返回的数据  WaitForSingleObject(pi.hProcess, 500/*INFINITE*/);bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);if (!bret){goto END;}//5.0 查找CPU序列号  bret = FALSE;strBuffer = szBuffer;ipos = strBuffer.find(strEnSearch);if (ipos < 0) // 没有找到  {goto END;}else{strBuffer = strBuffer.substr(ipos + strEnSearch.length());}memset(szBuffer, 0x00, sizeof(szBuffer));strcpy_s(szBuffer, strBuffer.c_str());//modify here//去掉中间的空格 \r \n     char temp[512];memset(temp, 0, sizeof(temp));int index = 0;for (size_t i = 0; i < strBuffer.size(); i++){if (strBuffer[i] != ' '&&strBuffer[i] != '\n'&&strBuffer[i] != '\r'){temp[index] = strBuffer[i];index++;}}ider = temp;bret = TRUE;END://关闭所有的句柄  CloseHandle(hWritePipe);CloseHandle(hReadPipe);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return(bret);
}int main()
{string cpuid;if (!GetCpuByCmd(cpuid)){cout << "get cpu id failed!\n";return false;}cout << "cpu ID: " << cpuid << endl;string diskid;if (!GetDiskByCmd(diskid)){cout << "get diskdrive failed!\n";return false;}cout << "disk ID: " << diskid << endl;system("pause");return 0;
}

C/C++ 获取硬件唯一标识 (CPU序列号/硬盘号)相关推荐

  1. 获取电脑唯一标识,硬盘序列号,主板序列号,CPU序列号

    在生产环境中,有时候会需要获取电脑唯一标识进行程序管理验证,比如一个程序,在A电脑上面只能允许正常登陆一年,到期后提示联系管理员等情况.就是获取电脑唯一标识后将该值存入授权数据库,默认给当前电脑的使用 ...

  2. Android 设备获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure; private String android_id ...

  3. android设备id完美解决方法,安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题...

    一,先说获取渠道名(这里以友盟为例) /* * 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量 * */ public static String getSource() { //获取渠道 ...

  4. 获取android设备唯一编号_android获取设备唯一标识完美解决方案的思考以及实现方式...

    关于Android设备唯一标识符号 前言 由于在开发中需要开发游客模式,在用户没有登录的情况下必须确保设备的唯一性,于是惯性思维想到的肯定是使用DevicesId 来作为设备的唯一标识,用以代替用户登 ...

  5. android获取设备唯一标识完美解决方案

    转自:https://blog.csdn.net/aa1733519509/article/details/50053553 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码. ...

  6. C语言获取硬件信息(CPU序列号,硬盘序列号,网卡IP、MAC地址、是否插入网线)

    目录 一.前言 二.代码实现 2.1 获取CPU序列号 2.2 获取硬盘序列号 2.3 获取网卡信息 附:源代码下载 一.前言   本文主要介绍Linux和Windows下使用C语言获取各种硬件信息, ...

  7. Windows/Linux获取Mac地址和CPU序列号实现

    UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一性.可用的开源库如libuuid,可参考https://blog ...

  8. php获取主板序列号,PHP获取通过windows系统命令wmic获取MAC地址、CPU序列号、主板序列号...

    在项目中,客户需要系统在win系统上获取MAC地址.CPU序列号和主板序列号等,在网上搜索下,通过windows系统命令wmic可以获取,测试基本可行,HardwareInfo.php源代码如下: $ ...

  9. Android 手机上获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. 本文转自:http://blog.csdn.net/zhang31jian/article/details/23787037 imp ...

最新文章

  1. Github标星9k+,超赞的 PyTorch 资源大列表!
  2. Hasor:生命周期
  3. 【MM模块】Cycle Counting 周期盘点
  4. 为什么Android要采用Binder作为IPC机制?
  5. leetcode-71-简化路径
  6. [P2387魔法森林
  7. 字符串操作以及打印 —— 实现上传下载的进度条功能
  8. 数据列表的分页实现————分页敏捷开发
  9. android存电话号码,如何从android中删除联系人的电话号码?
  10. Linux 进程信号详细总结
  11. NA/NP/IE最好的模拟器GNS3 part2
  12. 百度如何使用Go语言重构日请求量千亿级别的系统?
  13. 机器学习与数学基础知识(二)
  14. Windows下让Tomcat6定时重启服务的方法
  15. 这部关于 AI 的纪录片,还是值得一看的
  16. Unable to add window android.view.ViewRootImpl$W@c1bf05d -- permission denied for window type 2003
  17. 南邮 | 计算机图形学大作业:Skybox + Shadow volume
  18. 【电路理论】1-10 两类约束 KVL、KCL方程的独立性
  19. 编程语言都代表哪些国家?
  20. MAC chrome浏览器地址栏无法搜索问题解决办法

热门文章

  1. 量化投资超越市场必须具备哪三个条件
  2. mysql禁用空密码登录_允许phpmyadmin 空密码登陆
  3. PL/0编译程序的简单实现
  4. spidermonkey_Mozilla改进了SpiderMonkey JavaScript引擎中的RegExp支持
  5. 站九个小时的火车去当伴郎是怎么一种体验
  6. 一款堪称完美的编程字体Source Code Pro
  7. xp计算机找不到音量调节,XP系统桌面右下角的音量开关图标不见了,怎么恢复?...
  8. 【原创】NES游戏创作的学习流程
  9. Axure 目录设计
  10. JS 按字符串长度切割字符串(支持汉字占2个长度)