【发布时间】:2010-12-06 15:26:48
【问题描述】:
如何使用 WMI 和 asm 代码以外的 C++ 程序获取处理器 (CPU)、SCSI、显示器和 IDE 的唯一编号(序列号/ID)?
【问题讨论】:
-
您至少应该添加平台。
如何使用 WMI 和 asm 代码以外的 C++ 程序获取处理器 (CPU)、SCSI、显示器和 IDE 的唯一编号(序列号/ID)?
【问题讨论】:
由于您提到 WMI,我假设您在 Windows 上工作。查找GetVolumeInformation()。
【讨论】:
在 Windows 上,您可以从环境变量 *PROCESSOR_** 中获取 CPU 信息,您可以从 vol 中解析卷序列号,从 route print 中解析 MAC 地址
如果你想让它跨平台(如果这是为了软件许可),那么像 Linux 这样的开源平台无论如何都会将问题提升到一个全新的水平,并且需要一种不同的方法。但是,您仍然可以通过解析标准工具的输出来获取大量信息。
您确实应该考虑 WMI。在过去,BIOS 会有所帮助,但它已全部被 HAL 取代。
CodeProject 在这种情况下总是值得搜索。
【讨论】:
下面是我用来检索游戏硬盘序列号的代码,这样作弊者就会被永久禁止(如果没有新驱动器就无法重新进入!):
string GetMachineID()
{
// LPCTSTR szHD = "C:\\"; // ERROR
string ss;
ss = "Err_StringIsNull";
UCHAR szFileSys[255],
szVolNameBuff[255];
DWORD dwSerial;
DWORD dwMFL;
DWORD dwSysFlags;
int error = 0;
bool success = GetVolumeInformation(LPCTSTR("C:\\"), (LPTSTR)szVolNameBuff,
255, &dwSerial,
&dwMFL, &dwSysFlags,
(LPTSTR)szFileSys,
255);
if (!success) {
ss = "Err_Not_Elevated";
}
std::stringstream errorStream;
errorStream << dwSerial;
return string(errorStream.str().c_str());
}
虽然存在一个潜在的错误,如果 Windows 安装在 C:\ 以外的驱动器上,这很容易解决。
【讨论】: