使用C ++从bios获取资产标签和序列

时间:2014-09-15 23:44:51

标签: c++ windows bios

我想学习如何使用c ++从本地机器的BIOS中获取资产标签和序列号。我现在已经在网上搜索了将近一个小时,到目前为止,我想出的是用vb编写的一些脚本。

我正在使用Windows 7计算机,但也希望它能与Windows 8一起使用。

1 个答案:

答案 0 :(得分:1)

您可以使用WMI

示例函数将类似于以下源代码,我将它放在一起以获取PC的序列号,它似乎工作得非常好。从Windows注册表中删除一个序列号然后忽略它,因为它适用于专门的环境。

# pragma comment(lib, "wbemuuid.lib")
static SHORT CDeviceConfigCheckSerialNumber (TCHAR *tcsSerialNo)
{
    HRESULT hres;
    IWbemLocator *pLoc = NULL;

    *tcsSerialNo = 0;    // initialze return string to empty string

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))
    {
        return 1;                 // Program has failed.
    }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;

    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (for example, Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );

    if (FAILED(hres))
    {
        pLoc->Release();     
        return 2;                // Program has failed.
    }

    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities 
    );

    if (FAILED(hres))
    {
        pSvc->Release();
        pLoc->Release();     
        return 3;               // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
//        bstr_t("SELECT * FROM Win32_SystemEnclosure"),
//        bstr_t("SELECT * FROM Win32_BaseBoard"),
        bstr_t("SELECT * FROM Win32_BIOS"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);

    if (FAILED(hres))
    {
        pSvc->Release();
        pLoc->Release();
        return 4;               // Program has failed.
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------

    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;

    SHORT  sRetStatus = -100;

    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;

        // Get the value of the Name property
        hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
        if (!FAILED(hres)) {
            switch (vtProp.vt) {
                case VT_BSTR:
                    _tcscpy (tcsSerialNo, vtProp.bstrVal);
                    sRetStatus = 0;
                    break;
            }
        }
        VariantClear(&vtProp);

        pclsObj->Release();
    }
    pEnumerator->Release();

    // Cleanup
    // ========
    pSvc->Release();
    pLoc->Release();

    // if the search for a serial number in the BIOS did not provide
    // something then lets see if the NCR Retail Systems Manager has
    // put a serial number into the Windows Registry.
    if (sRetStatus != 0) {
        ULONG  ulCount = 0;
        TCHAR  lpszValue[256] = {0};

        ScfGetRsmValue (L"SerialNumber", &ulCount, lpszValue);
        if (ulCount > 0) {
            _tcscpy (tcsSerialNo, lpszValue);
            sRetStatus = 0;
        }
    }
    return sRetStatus;
}