WMI HD序列号查询返回\\.\PHYSICALDRIVE0而不是实数 [英] WMI HD serial number query returns \\.\PHYSICALDRIVE0 instead of the real number
本文介绍了WMI HD序列号查询返回\\.\PHYSICALDRIVE0而不是实数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
大家好,
我创建了一个C ++代码来使用WMI获取硬盘序列号,但不是获取序列号我得到一个字符串:
\\.\PHYSICALDRIVE0
但是我期待的是:
BCB1-45BB
谁能告诉我这个结果以及如何获得真实的序列号?
这是我使用的代码:
Hi Everyone,
I created a C++ code to get the Hard Disk Serial Number using WMI, however instead of getting the serial Number I get a string with:
\\.\PHYSICALDRIVE0
but I was expecting something like:
BCB1-45BB
Who can explain me this result and how to obtain the real serial number?
Here is the code I used:
#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <wbemidl.h>
int main(int argc, char **argv)
{
HRESULT hres;
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
std::cout << "Failed to initialize COM library. Error code = 0x"
<< std::hex << hres << std::endl;
return 1; // Program has failed.
}
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
// Note: If you are using Windows 2000, you need to specify -
// the default authentication credentials for a user by using
// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
// parameter of CoInitializeSecurity ------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
std::cout << "Failed to initialize security. Error code = 0x"
<< std::hex << hres << std::endl;
CoUninitialize();
return 1; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
std::cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< std::hex << hres << std::endl;
CoUninitialize();
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 (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
std::cout << "Could not connect. Error code = 0x"
<< std::hex << hres << std::endl;
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
std::cout << "Connected to ROOT\\CIMV2 WMI namespace" << std::endl;
// 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))
{
std::cout << "Could not set proxy blanket. Error code = 0x"
<< std::hex << hres << std::endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // 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_DiskDrive"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
std::cout << "Query for operating system name failed."
<< " Error code = 0x"
<< std::hex << hres << std::endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
VARIANT vtProp;
std::cout << "----------------------------------" << std::endl;
std::cout << "Retrieve DISK Info" << std::endl;
std::cout << "----------------------------------" << std::endl;
// Get the value of the Name property
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
std::wcout << " Disk Name : " << vtProp.bstrVal << std::endl;
VariantClear(&vtProp);
hr = pclsObj->Get(L"Model", 0, &vtProp, 0, 0);
std::wcout << " Disk Model : " << vtProp.bstrVal << std::endl;
VariantClear(&vtProp);
hr = pclsObj->Get(L"Status", 0, &vtProp, 0, 0);
std::wcout << " Status : " << vtProp.bstrVal << std::endl;
VariantClear(&vtProp);
hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
std::wcout << " Device ID : " << vtProp.bstrVal << std::endl;
VariantClear(&vtProp);
hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
std::wcout << " SerialNumber : " << vtProp.bstrVal << std::endl;
VariantClear(&vtProp);
hr = pclsObj->Get(L"InterfaceType", 0, &vtProp, 0, 0);
std::wcout << " InterfaceType : " << vtProp.bstrVal << std::endl;
VariantClear(&vtProp);
std::cout << "----------------------------------" << std::endl;
pclsObj->Release();
}
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
return 0; // Program successfully completed.
}</wbemidl.h></comdef.h></iostream>
这是输出:
This is the Output:
Connected to ROOT\CIMV2 WMI namespace
----------------------------------
Retrieve DISK Info
----------------------------------
Disk Name : \\.\PHYSICALDRIVE0
Disk Model : IC35L080AVVA07-0
Status : OK
Device ID : \\.\PHYSICALDRIVE0
SerialNumber : \\.\PHYSICALDRIVE0
InterfaceType : IDE
----------------------------------
谢谢,
$ b $bApóstolo
Thanks,
Apóstolo
推荐答案
这是我的代码:
IWbemClassObject * pclsObj ;
ULONG uReturn = 0;
while(pEnumerator)
{
HRESULT hr = pEnumerator-> Next(WBEM_INFINITE,1, &pclsObj,&uReturn);
if(!uReturn)
{
break;
}
VARIANT vtProp;
VariantInit(&vtProp);
vDiskDriveInfoList.push_back(HardDiskDriveInfo());
HardDiskDriveInfo&rhddi = * vDiskDriveInfoList.rbegin() ;
pclsObj-> BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY);
{
CIMTYPE pvtType;
VARIANT pVal;
BSTR pstrName;
while(pclsObj-> Next(0,&pstrName,&pVal,&pvtType,NULL)== WBEM_S_NO_ERROR)
{
CString strName =(LPCTSTR)(_ bstr_t)pstrName;
if(strName.Compare(_T(SerialNumber))== 0 && pVal .vt == VT_BSTR)
{
rhddi.strSerialNumber =(LPCTSTR)(_ bstr_t)pVal.bstrVal;
rhddi.strSerialNumber.Trim ();
}
else if(strName.Compare(_T(FirmwareRevision))== 0 && pVal.vt == VT_BSTR)
{
rhddi.strFirmwareRevision =(LPCTSTR)(_ bstr_t)pVal.bstrVal;
rhddi.strFirmwareRevision.Trim();
}
else if(strName.Compare(_T(MediaType))== 0 && pVal.vt == VT_BSTR)
{
rhddi.strMediaType =(LPCTSTR)(_ bstr_t)pVal.bstrVal;
rhddi.strMediaType.Trim();
}
else if (strName.Compare(_T(InterfaceType))== 0 && pVal.vt == VT_ BSTR)
{
rhddi.strInterfaceType =(LPCTSTR)(_ bstr_t)pVal.bstrVal;
rhddi.strInterfaceType.Trim(); < br $>
}
SysFreeString(pstrName);
VariantClear(&pVal);
}
}
}
this is my code:
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while( pEnumerator )
{
HRESULT hr = pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn );
if (!uReturn )
{
break;
}
VARIANT vtProp;
VariantInit( &vtProp );
vDiskDriveInfoList.push_back(HardDiskDriveInfo());
HardDiskDriveInfo& rhddi = *vDiskDriveInfoList.rbegin();
pclsObj->BeginEnumeration( WBEM_FLAG_NONSYSTEM_ONLY );
{
CIMTYPE pvtType;
VARIANT pVal;
BSTR pstrName;
while(pclsObj->Next(0, &pstrName, &pVal, &pvtType, NULL) == WBEM_S_NO_ERROR)
{
CString strName = (LPCTSTR)(_bstr_t)pstrName;
if (strName.Compare(_T("SerialNumber")) == 0 && pVal.vt == VT_BSTR)
{
rhddi.strSerialNumber = (LPCTSTR)(_bstr_t)pVal.bstrVal;
rhddi.strSerialNumber.Trim();
}
else if (strName.Compare(_T("FirmwareRevision")) == 0 && pVal.vt == VT_BSTR)
{
rhddi.strFirmwareRevision = (LPCTSTR)(_bstr_t)pVal.bstrVal;
rhddi.strFirmwareRevision.Trim();
}
else if (strName.Compare(_T("MediaType")) == 0 && pVal.vt == VT_BSTR)
{
rhddi.strMediaType = (LPCTSTR)(_bstr_t)pVal.bstrVal;
rhddi.strMediaType.Trim();
}
else if (strName.Compare(_T("InterfaceType")) == 0 && pVal.vt == VT_BSTR)
{
rhddi.strInterfaceType = (LPCTSTR)(_bstr_t)pVal.bstrVal;
rhddi.strInterfaceType.Trim();
}
SysFreeString(pstrName);
VariantClear( &pVal );
}
}
}
这篇关于WMI HD序列号查询返回\\.\PHYSICALDRIVE0而不是实数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文