Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / Managed C++ / March 2005

Tip: Looking for answers? Try searching our database.

Accessing hardware information

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Stephen Corey - 18 Mar 2005 18:39 GMT
How can I access the hardware information of a system, like hard
drive(s) model & serial numbers, video card model, etc...?

Thanks!
Jochen Kalmbach - 18 Mar 2005 19:18 GMT
Hi Stephen Corey,

> How can I access the hardware information of a system, like hard
> drive(s) model & serial numbers, video card model, etc...?

WMI...

Signature

Greetings
 Jochen

  My blog about Win32 and .NET
  http://blog.kalmbachnet.de/

William DePalo [MVP VC++] - 18 Mar 2005 19:53 GMT
> How can I access the hardware information of a system, like hard drive(s)
> model & serial numbers, video card model, etc...?

There are a number of ways, any of which is likely to make your head hurt.
:-)

One thing that you can do is to use Windows Management Instrumentation
(WMI). I might be wrong but I think WMI was intended to be used in scripts,
where it is reasonably straightforward. In C++ it is just downright homely,
IMO.

In any event there is a WMI sample in C++ here:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/exam
ple__getting_wmi_data_from_the_local_computer.asp


Once you read that link you can navigate back to the overview of WMI to get
up to speed on the various "classes" of information that you can query
against.

I started with that sample, and oh-so-mechanically changed the query against
the Win32 operating system class to one against the disk drive class and
replaced the display of the operating system name with the name,
manufacturer and model of each drive it found. It succeeds in enumerating
the drives on this box and is appended below.

You might want to scan the docs to find the other classes of info that you
need.

Regards,
Will

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>

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

int main(int argc, char **argv)
{
   HRESULT hres;

   // Step 1: --------------------------------------------------
   // Initialize COM. ------------------------------------------

   hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
   if (FAILED(hres))
   {
       cout << "Failed to initialize COM library. Error code = 0x"
           << hex << hres << 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))
   {
       cout << "Failed to initialize security. Error code = 0x"
           << hex << hres << 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))
   {
       cout << "Failed to create IWbemLocator object."
           << " Err code = 0x"
           << hex << hres << 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))
   {
       cout << "Could not connect. Error code = 0x"
            << hex << hres << endl;
       pLoc->Release();
       CoUninitialize();
       return 1;                // Program has failed.
   }

   cout << "Connected to ROOT\\CIMV2 WMI namespace" << 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))
   {
       cout << "Could not set proxy blanket. Error code = 0x"
           << hex << hres << 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_OperatingSystem"),
       bstr_t("SELECT * FROM Win32_DiskDrive"),
       WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
       NULL,
       &pEnumerator);

   if (FAILED(hres))
   {
       cout << "Query for operating system name failed."
           << " Error code = 0x"
           << hex << hres << 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;
       VariantInit(&vtProp);

       // Get the value of the Name property
       //hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
       //wcout << " OS Name : " << vtProp.bstrVal << endl;
       hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
       wcout << " Name : " << vtProp.bstrVal << endl;
       VariantClear(&vtProp);
       hr = pclsObj->Get(L"Manufacturer", 0, &vtProp, 0, 0);
       wcout << " Manufacturer : " << vtProp.bstrVal << endl;
       VariantClear(&vtProp);
       hr = pclsObj->Get(L"Model", 0, &vtProp, 0, 0);
       wcout << " Model : " << vtProp.bstrVal << endl;
       VariantClear(&vtProp);

   }

   // Cleanup
   // ========

   pSvc->Release();
   pLoc->Release();
   pEnumerator->Release();
   pclsObj->Release();
   CoUninitialize();

   return 0;   // Program successfully completed.

}

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.