C/C++ 获取硬件唯一标识 (CPU序列号/硬盘号)
调用控制台来获取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序列号/硬盘号)相关推荐
- 获取电脑唯一标识,硬盘序列号,主板序列号,CPU序列号
在生产环境中,有时候会需要获取电脑唯一标识进行程序管理验证,比如一个程序,在A电脑上面只能允许正常登陆一年,到期后提示联系管理员等情况.就是获取电脑唯一标识后将该值存入授权数据库,默认给当前电脑的使用 ...
- Android 设备获取物理唯一标识码
唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure; private String android_id ...
- android设备id完美解决方法,安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题...
一,先说获取渠道名(这里以友盟为例) /* * 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量 * */ public static String getSource() { //获取渠道 ...
- 获取android设备唯一编号_android获取设备唯一标识完美解决方案的思考以及实现方式...
关于Android设备唯一标识符号 前言 由于在开发中需要开发游客模式,在用户没有登录的情况下必须确保设备的唯一性,于是惯性思维想到的肯定是使用DevicesId 来作为设备的唯一标识,用以代替用户登 ...
- android获取设备唯一标识完美解决方案
转自:https://blog.csdn.net/aa1733519509/article/details/50053553 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码. ...
- C语言获取硬件信息(CPU序列号,硬盘序列号,网卡IP、MAC地址、是否插入网线)
目录 一.前言 二.代码实现 2.1 获取CPU序列号 2.2 获取硬盘序列号 2.3 获取网卡信息 附:源代码下载 一.前言 本文主要介绍Linux和Windows下使用C语言获取各种硬件信息, ...
- Windows/Linux获取Mac地址和CPU序列号实现
UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一性.可用的开源库如libuuid,可参考https://blog ...
- php获取主板序列号,PHP获取通过windows系统命令wmic获取MAC地址、CPU序列号、主板序列号...
在项目中,客户需要系统在win系统上获取MAC地址.CPU序列号和主板序列号等,在网上搜索下,通过windows系统命令wmic可以获取,测试基本可行,HardwareInfo.php源代码如下: $ ...
- Android 手机上获取物理唯一标识码
唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. 本文转自:http://blog.csdn.net/zhang31jian/article/details/23787037 imp ...
最新文章
- Github标星9k+,超赞的 PyTorch 资源大列表!
- Hasor:生命周期
- 【MM模块】Cycle Counting 周期盘点
- 为什么Android要采用Binder作为IPC机制?
- leetcode-71-简化路径
- [P2387魔法森林
- 字符串操作以及打印 —— 实现上传下载的进度条功能
- 数据列表的分页实现————分页敏捷开发
- android存电话号码,如何从android中删除联系人的电话号码?
- Linux 进程信号详细总结
- NA/NP/IE最好的模拟器GNS3 part2
- 百度如何使用Go语言重构日请求量千亿级别的系统?
- 机器学习与数学基础知识(二)
- Windows下让Tomcat6定时重启服务的方法
- 这部关于 AI 的纪录片,还是值得一看的
- Unable to add window android.view.ViewRootImpl$W@c1bf05d -- permission denied for window type 2003
- 南邮 | 计算机图形学大作业:Skybox + Shadow volume
- 【电路理论】1-10 两类约束 KVL、KCL方程的独立性
- 编程语言都代表哪些国家?
- MAC chrome浏览器地址栏无法搜索问题解决办法
热门文章
- 量化投资超越市场必须具备哪三个条件
- mysql禁用空密码登录_允许phpmyadmin 空密码登陆
- PL/0编译程序的简单实现
- spidermonkey_Mozilla改进了SpiderMonkey JavaScript引擎中的RegExp支持
- 站九个小时的火车去当伴郎是怎么一种体验
- 一款堪称完美的编程字体Source Code Pro
- xp计算机找不到音量调节,XP系统桌面右下角的音量开关图标不见了,怎么恢复?...
- 【原创】NES游戏创作的学习流程
- Axure 目录设计
- JS 按字符串长度切割字符串(支持汉字占2个长度)