API获取硬盘序列号

2012-3-28 Nie.Meining Coding

某东西需要获取硬盘序列号,在网上找了找,发现貌似没有直接的API可以做这个事,直接DeviceIoControl什么的兼容性也不太好,最后通过WMI实现了,代码贴出来,给有需要的童鞋:

//#include <Windows.h>
#include <tchar.h>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

int 
WINAPI 
_tWinMain (
   HINSTANCE hinstExe, 
   HINSTANCE, 
   PTSTR pszCmdLine, 
   int
)
/*++
Description:
   This is a demonstration on how to obtain the 
   hard disk serial number via WMI & C++

Author:
   Fypher
   2012/03/29
--*/
{
   // Step 1. Initialize COM.
   HRESULT hRet = CoInitializeEx(NULL, COINIT_MULTITHREADED);
   if (hRet != S_OK{
       MessageBox( NULL, 
                   TEXT("CoInitializeEx failed"), 
                   TEXT("HardDiskSn"), 
                   MB_OK
               );
       return 0;
   }

   // Step 2. Initialize Security.
   hRet =  CoInitializeSecurity(NULL,
                                -1,                 // COM negotiates service
                                NULL,               // Authentication services
                                NULL,               // Reserved
                                RPC_C_AUTHN_LEVEL_DEFAULT,   // authentication
                                RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation
                                NULL,               // Authentication info
                                EOAC_NONE,          // Additional capabilities
                                NULL                // Reserved
                               );
   if (hRet != S_OK{
       MessageBoxNULL, 
                   TEXT("CoInitializeEx failed"), 
                   TEXT("HardDiskSn"), 
                   MB_OK
               );
       CoUninitialize();
       return 0;
   }

   // Step 3. Obtain the initial locator to Windows Management 
   // on a particular host computer.
   IWbemLocator * pLoc = 0;
   hRet = CoCreateInstance(CLSID_WbemLocator,            
                           0,
                           CLSCTX_INPROC_SERVER,
                           IID_IWbemLocator,
                           (LPVOID *&pLoc
                       );
   if (hRet != S_OK{
       MessageBox( NULL, 
                   TEXT("CoInitializeEx failed"), 
                   TEXT("HardDiskSn"), 
                   MB_OK
               );
       CoUninitialize();
       return 0;
   }

   IWbemServices *pSvc = 0;

   // Step 4. Connect to the root\cimv2 namespace with 
   // the current user and obtain pointer pSvc to make 
   // IWbemServices calls.
   hRet = pLoc->ConnectServer_bstr_t(L"ROOT\\CIMV2"), // WMI namespace
                               NULL,                    // User name
                               NULL,                    // User password
                               0,                       // Locale
                               NULL,                    // Security flags                
                               0,                       // Authority      
                               0,                       // Context object
                               &pSvc                    // IWbemServices proxy
                           );
   if (hRet != S_OK{
       MessageBox( NULL, 
                   TEXT("CoInitializeEx failed"), 
                   TEXT("HardDiskSn"), 
                   MB_OK
               );
       pLoc->Release();    
       CoUninitialize();
       return 0;
   }

   // Step 5. Set the IWbemServices proxy so that impersonation of the user occurs.
   hRet = CoSetProxyBlanket(pSvc,                        // the proxy to set
                            RPC_C_AUTHN_WINNT,           // authentication service
                            RPC_C_AUTHZ_NONE,            // authorization service
                            NULL,                        // Server principal name
                            RPC_C_AUTHN_LEVEL_CALL,      // authentication level
                            RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
                            NULL,                        // client identity
                            EOAC_NONE                    // proxy capabilities    
                           );
   if (hRet != S_OK{
       MessageBox(NULL, TEXT("CoInitializeEx failed"), TEXT("HardDiskSn"), MB_OK);
       pSvc->Release();
       pLoc->Release();    
       CoUninitialize();
       return 0;
   }

   // Step 6. Make our requests.
   IEnumWbemClassObject* pEnumerator = NULL;
   hRet = pSvc->ExecQuerybstr_t("WQL"),
                           bstr_t("SELECT * FROM Win32_DiskDrive"),
                           WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
                           NULL,
                           &pEnumerator
                       );

   if (hRet != S_OK{
       MessageBox( NULL, 
                   TEXT("CoInitializeEx failed"), 
                   TEXT("HardDiskSn"), 
                   MB_OK
               );
       pSvc->Release();
       pLoc->Release();    
       CoUninitialize();
       return 0;
   }

   while (pEnumerator)
   {
       ULONG ulRet;
       IWbemClassObject * pclsObj;
       hRet = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &ulRet);
       if (0 == ulRet)
           break;

       VARIANT vtCaption, vtInterfaceType, vtSerialNumber;
       memset(&vtCaption, 0, sizeof(vtCaption));
       memset(&vtInterfaceType, 0, sizeof(vtInterfaceType));
       memset(&vtSerialNumber, 0, sizeof(vtSerialNumber));

       PTSTR tcsCaption, tcsInterfaceType, tcsSerialNumber;

       // Get the value of the Caption property
       hRet = pclsObj->Get(L"Caption", 0, &vtCaption, 0, 0);
       if (hRet == S_OK{
           tcsCaption = vtCaption.bstrVal;
       } else {
           tcsCaption = TEXT("Unknown");
       }

       // Get the value of the InterfaceType property
       hRet = pclsObj->Get(L"InterfaceType", 0, &vtInterfaceType, 0, 0);
       if (hRet == S_OK{
           tcsInterfaceType = vtInterfaceType.bstrVal;
       } else {
           tcsInterfaceType = TEXT("Unknown");
       }

       // Get the value of the Caption property
       hRet = pclsObj->Get(L"SerialNumber", 0, &vtSerialNumber, 0, 0);
       if (hRet == S_OK{
           tcsSerialNumber = vtSerialNumber.bstrVal;
       } else {
           tcsSerialNumber = TEXT("Unknown");
       }

       DWORD dwSnSize = (_tcslen(tcsSerialNumber+ 32* sizeof(TCHAR);
       PTSTR tcsSn = (PTSTR)malloc(dwSnSize);
       DWORD dwMsgSize = ( _tcslen(tcsCaption+
                           _tcslen(tcsInterfaceType+
                           _tcslen(tcsSerialNumber+
                           64 ) * sizeof(TCHAR);
       PTSTR tcsMsg = (PTSTR)malloc(dwMsgSize);
       if (!tcsSn || !tcsMsg{
           MessageBox(NULL, TEXT("malloc failed"), TEXT("HardDiskSn"), MB_OK);
       } else {
           // Makes hard disk serial number readable
           if (!_tcscmp(tcsSerialNumber, TEXT("Unknown"))) {
               _tcscpy_s(tcsSn, dwSnSize / sizeof(TCHAR), tcsSerialNumber);
           } else {
               int i = 0;
               while (TRUE{
                   if (tcsSerialNumber[i] == 0     || 
                       tcsSerialNumber[i + 1] == 0   ) {
                       tcsSn[i] = tcsSerialNumber[i];
                       tcsSn[i + 1] = tcsSerialNumber[i + 1];
                       break;
                   } else {
                       tcsSn[i] = tcsSerialNumber[i + 1];
                       tcsSn[i + 1] = tcsSerialNumber[i];
                   }
                   i += 2;
               }
           }

           // Show our result
           _stprintf_s(tcsMsg,
                       dwMsgSize / sizeof(TCHAR),
                       TEXT("Caption:\t\t\"%s\"\r\n")
                       TEXT("Interface Type:\t\"%s\"\r\n")
                       TEXT("Serial Number:\t\"%s\""),
                       tcsCaption,
                       tcsInterfaceType,
                       tcsSn
                   );
           MessageBox(NULL, tcsMsg, TEXT("HardDiskSn"), MB_OK);
       }
       if (tcsSn)
           free(tcsSn);
       if (tcsMsg)
           free(tcsMsg);
       VariantClear(&vtCaption);
       VariantClear(&vtInterfaceType);
       VariantClear(&vtSerialNumber);
   }

   // Step 7. Cleanup
   pSvc->Release();
   pLoc->Release();    
   CoUninitialize();
   // MessageBox(NULL, TEXT("Over"), TEXT("HardDiskSn"), MB_OK);
   return 0;
}

评论:

Esperknoca
2018-10-20 20:58
uk online  online online

     86af get online pills
Aveniraknoca
2018-10-17 17:28
online con receta espaa

     6a28 online online por internet
Vianorknoca
2018-10-16 18:44
just try online strenght mg

     85d3 noi spedizione online
Leonginaknoca
2018-10-09 13:38
online livraison rapide

     d6e8 donde comprar online mapuche

发表评论:

Powered by emlog