【问题标题】:How to get serial number for Hard Drive如何获取硬盘的序列号
【发布时间】:2010-12-06 15:26:48
【问题描述】:

如何使用 WMI 和 asm 代码以外的 C++ 程序获取处理器 (CPU)、SCSI、显示器和 IDE 的唯一编号(序列号/ID)?

【问题讨论】:

  • 您至少应该添加平台。

标签: c++ adapter scsi


【解决方案1】:

由于您提到 WMI,我假设您在 Windows 上工作。查找GetVolumeInformation()

【讨论】:

  • 这听起来像是许可软件的东西,GetVolumeInformation() 返回每次格式化磁盘时都会更改的卷序列,并且是软件中的微不足道的更改。制造商序列号会更有帮助。
【解决方案2】:

在 Windows 上,您可以从环境变量 *PROCESSOR_** 中获取 CPU 信息,您可以从 vol 中解析卷序列号,从 route print 中解析 MAC 地址

如果你想让它跨平台(如果这是为了软件许可),那么像 Linux 这样的开源平台无论如何都会将问题提升到一个全新的水平,并且需要一种不同的方法。但是,您仍然可以通过解析标准工具的输出来获取大量信息。

您确实应该考虑 WMI。在过去,BIOS 会有所帮助,但它已全部被 HAL 取代。

CodeProject 在这种情况下总是值得搜索。

How To Get Hardware Information

【讨论】:

    【解决方案3】:

    下面是我用来检索游戏硬盘序列号的代码,这样作弊者就会被永久禁止(如果没有新驱动器就无法重新进入!):

    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:\ 以外的驱动器上,这很容易解决。

    【讨论】:

    • 警告!此解决方案不是硬盘驱动器序列号,而是为您提供完全不同的卷序列号。
    • @JustShadow 如果不使用每个制造商的专业工具,就无法在 Windows 中检索 实际 硬盘驱动器序列号。这会检索 Windows 为您提供的“序列号”作为驱动器序列号,因此此答案是有效的。
    • 这里是完整的解决方案:stackoverflow.com/questions/24049367/… 它封装了 WMI 调用,不需要额外的工具
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2014-01-11
    • 2011-05-10
    • 2010-11-24
    • 2011-01-02
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多