如何获取安装 Windows 的磁盘的磁盘型号和序列号

如何获取安装 Windows 的磁盘的磁盘型号和序列号

您可以使用wmic diskdrive get model,serialnumber来获取模型序列号当前插入的磁盘,如果同时使用它们,则它们是唯一的(如果仅使用序列号,则可能会发生另一家制造商使用相同序列号的变化,尽管实际上它们都有不同的模式),如果您需要一种唯一区分两台设备(PC,笔记本电脑……)的方法,这非常有用。现在我遇到的问题是我只想要安装操作系统的磁盘的型号和序列号。

是否有另一个命令或它们的组合(检查它们的结果并可能看到一个共同的部分,这将导致我需要的),它们将仅返回安装了操作系统的值?

我检查了 的选项wmic diskdrive get,但没有找到一个可以满足我需求的。另外还有一个vol C,但它给出的是 Windows 为该逻辑卷(分区)提供的序列号,而不是磁盘本身的序列号。

此外,虽然用户确实可以简单地将操作系统安装在不同的磁盘上,因此型号和序列号会与上次不同(如果他们意识到这是验证方法的话),但执行此操作所需的时间(无论是克隆还是全新安装,然后再次下载并安装应用程序),至少就我的情况而言,足以不方便尝试欺骗应用程序,并且它还用于一些其他无法与 IP 绑定的小验证,因为可以通过重新启动路由器或禁用/启用网络(大多数情况下)轻松更改 IP,而且 IP 适用于整个网络,而不是特定的设备。

//编辑 1:我发现了另一个在 Windows 11 上使用时有效的命令终端/电源外壳,但不幸的是,当像这样在 C++ 中使用时,system("Get-Disk (Get-Partition -DriveLetter 'C').DiskNumber");它会给出错误,'Get-Disk' is not recognized as an internal or external command, operable program or batch file.因为我只需要 Windows,默认情况下它将使用分区 C,所以就是这样。它给出了以下信息Number / Friendly Name (is the manufacturer and model) / Serial Number / Health Status / Operational Status / Total Size / Partition Style

//Edit2:使用 Zac67 给出的命令,我在 C++ 中尝试了它们(std17,版本 x64,我只需要 Windows):

#include <iostream>
#include <string>
#include <array>

using namespace std;

std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::unique_ptr<FILE, decltype(&_pclose)> pipe(_popen(cmd, "r"), _pclose);
    if (!pipe) {
        throw std::runtime_error("popen() failed!");
    }
    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
        result += buffer.data();
    }
    return result;
}

void main() {
    cout << exec("wmic bootconfig get description");
    cout << exec("wmic diskdrive where DeviceID='\\\\.\\PHYSICALDRIVE3' get model,serialnumber");
}

第一个命令有我期望的返回值:Description\Device\Harddisk3\Partition1,但是当运行第二个命令时,不幸的是我得到了ERROR: Description = Invalid query。如果我直接在 CMD 中运行它们,那么它们都运行良好,但如果我在 Windows 11 终端/PowerShell 中使用它们,那么与代码相同,第一个命令没问题,但第二个命令出现同样的错误。

//Edit3:根据我从 Zac67 获得的命令,这是 C++ 中的最终形式:

#include <iostream>
#include <string>
#include <array>

std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::unique_ptr<FILE, decltype(&_pclose)> pipe(_popen(cmd, "r"), _pclose);
    if (!pipe) {
        throw std::runtime_error("popen() failed!");
    }
    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
        result += buffer.data();
    }
    return result;
}

void replaceString(std::string& subject, const std::string& search,
    const std::string& replace) {
    size_t pos = 0;
    while ((pos = subject.find(search, pos)) != std::string::npos) {
        subject.replace(pos, search.length(), replace);
        pos += replace.length();
    }
}

void main() {
    std::string index = exec("wmic bootconfig get description");
    index = index.at(index.find_last_of("\\") - 1);
    std::string modelSerialNumber = "wmic diskdrive where DeviceID='\\\\\\\\.\\\\PHYSICALDRIVE" + index + "' get model,serialnumber";
    modelSerialNumber = exec(modelSerialNumber.c_str());
    replaceString(modelSerialNumber, "Model", "");
    replaceString(modelSerialNumber, "SerialNumber", "");
    replaceString(modelSerialNumber, " ", "");
    std::cout << modelSerialNumber;
}

输出将是:KINGSTONSA2000M8250GXXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX.。就我的用例而言,我需要将型号和序列号像这样联合起来。

答案1

你可以运行

C:\> wmic bootconfig get description
Description
\Device\Harddisk3\Partition2

注意以下索引硬盘- 这里3。这就是下一个查询中使用的索引。

跑步

C:\> wmic diskdrive where DeviceID='\\\\.\\PHYSICALDRIVE3' get model,serialnumber
Model                    SerialNumber
Samsung SSD 980 PRO 1TB  00xx_xxxx_xxxx_xxxx.

\\需要双倍才能转义每个\cmd 批处理。如果您使用另一种语言运行相同的逻辑,则只需要\\.\PHYSICALDRIVE3。当然,您应该更喜欢 C++ 中的本机 WMI 查询。

相关内容