如何在Windows上获取磁盘标识符?
发布时间:2020-12-14 05:28:38 所属栏目:Windows 来源:网络整理
导读:如何在 Windows上检索磁盘的标识符?这不应与卷标识符混淆;他们是两件不同的事.磁盘标识符是驻留在MBR中的4字节标识符(如果使用GPT,则为16字节标识符).如果运行diskpart并查询磁盘的详细信息,则为“磁盘ID”标记的值. 我已经浏览了所有看起来相关的MSDN文档,
如何在
Windows上检索磁盘的标识符?这不应与卷标识符混淆;他们是两件不同的事.磁盘标识符是驻留在MBR中的4字节标识符(如果使用GPT,则为16字节标识符).如果运行diskpart并查询磁盘的详细信息,则为“磁盘ID”标记的值.
我已经浏览了所有看起来相关的MSDN文档,但是我还没有找到能够做到这一点的任何东西;显然,有可能看到diskpart能够从某个地方获得这个值. 我总是可以调用diskpart作为最后的手段并解析它的输出,但我真的更愿意避免这样做.有谁知道如何以编程方式获得此数字? 解决方法
您可以使用
Win32_DiskDrive WMi类和Signature属性.
查看此示例App #include "stdafx.h" #define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h> # pragma comment(lib,"wbemuuid.lib") #pragma argsused int main(int argc,char* argv[]) { BSTR strNetworkResource; //To use a WMI remote connection set localconn to false and configure the values of the pszName,pszPwd and the name of the remote machine in strNetworkResource strNetworkResource = L"\.rootCIMV2"; COAUTHIDENTITY *userAcct = NULL ; COAUTHIDENTITY authIdent; // Initialize COM. ------------------------------------------ HRESULT hres; hres = CoInitializeEx(0,COINIT_MULTITHREADED); if (FAILED(hres)) { cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl; cout << _com_error(hres).ErrorMessage() << endl; cout << "press enter to exit" << endl; cin.get(); return 1; // Program has failed. } // Set general COM security levels -------------------------- 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)) { cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl; cout << _com_error(hres).ErrorMessage() << endl; CoUninitialize(); cout << "press enter to exit" << endl; cin.get(); return 1; // Program has failed. } // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance(CLSID_WbemLocator,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *) &pLoc); if (FAILED(hres)) { cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl; cout << _com_error(hres).ErrorMessage() << endl; CoUninitialize(); cout << "press enter to exit" << endl; cin.get(); return 1; // Program has failed. } // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t(strNetworkResource),// 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)) { cout << "Could not connect. Error code = 0x" << hex << hres << endl; cout << _com_error(hres).ErrorMessage() << endl; pLoc->Release(); CoUninitialize(); cout << "press enter to exit" << endl; cin.get(); return 1; // Program has failed. } cout << "Connected to rootCIMV2 WMI namespace" << endl; // 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)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; cout << _com_error(hres).ErrorMessage() << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); cout << "press enter to exit" << endl; cin.get(); return 1; // Program has failed. } // Use the IWbemServices pointer to make requests of WMI ---- IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( L"WQL",L"SELECT * FROM Win32_DiskDrive",WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator); if (FAILED(hres)) { cout << "ExecQuery failed" << " Error code = 0x" << hex << hres << endl; cout << _com_error(hres).ErrorMessage() << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); cout << "press enter to exit" << endl; cin.get(); return 1; // Program has failed. } // Secure the enumerator proxy hres = CoSetProxyBlanket( pEnumerator,// Indicates the proxy to set RPC_C_AUTHN_DEFAULT,// RPC_C_AUTHN_xxx RPC_C_AUTHZ_DEFAULT,// RPC_C_AUTHZ_xxx COLE_DEFAULT_PRINCIPAL,// Server principal name RPC_C_AUTHN_LEVEL_PKT_PRIVACY,// RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE,// RPC_C_IMP_LEVEL_xxx userAcct,// client identity EOAC_NONE // proxy capabilities ); // Get the data from the WQL sentence IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE,1,&pclsObj,&uReturn); if(0 == uReturn || FAILED(hr)) break; VARIANT vtProp; hr = pclsObj->Get(L"Name",&vtProp,0);// String if (!FAILED(hr)) { if ((vtProp.vt==VT_NULL) || (vtProp.vt==VT_EMPTY)) wcout << "Name : " << ((vtProp.vt==VT_NULL) ? "NULL" : "EMPTY") << endl; else if ((vtProp.vt & VT_ARRAY)) wcout << "Name : " << "Array types not supported (yet)" << endl; else wcout << "Name : " << vtProp.bstrVal << endl; } VariantClear(&vtProp); hr = pclsObj->Get(L"Signature",0);// Uint32 if (!FAILED(hr)) { if ((vtProp.vt==VT_NULL) || (vtProp.vt==VT_EMPTY)) wcout << "Signature : " << ((vtProp.vt==VT_NULL) ? "NULL" : "EMPTY") << endl; else if ((vtProp.vt & VT_ARRAY)) wcout << "Signature : " << "Array types not supported (yet)" << endl; else wcout << "Signature : " << hex << vtProp.uintVal << endl; } VariantClear(&vtProp); pclsObj->Release(); pclsObj=NULL; } // Cleanup pSvc->Release(); pLoc->Release(); pEnumerator->Release(); if (pclsObj!=NULL) pclsObj->Release(); CoUninitialize(); cout << "press enter to exit" << endl; cin.get(); return 0; // Program successfully completed. } 此代码返回 和DiskPart (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |