Wmi Program

Header

  • 
    
  • IWbemLocator*   m_pIWbemLocator;
    IWbemServices*   m_pIWbemServices;
    IEnumWbemClassObject* m_pIEnumWbem;
    IWbemClassObject* m_pIWbemObject;



  • VisualStudio
    # pragma warning(disable: 4800)  // ワーニングメッセージの抑制 bool値の強制設定
    # pragma comment(lib, "wbemuuid.lib")
    #define _WIN32_WINNT 0x0400
    #define _WIN32_IE 0x0400
    #define _UNICODE
    #define UNICODE
    #ifdef _DEBUG
    #define
    _CRTDBG_MAP_ALLOC #include <windows.h> // Windows標準ヘッダー #include <windowsx.h> // Windows標準ヘッダー #include <stdio.h> // 標準入出力ヘッダー #include <stdlib.h> #include <atlbase.h> // COMインターフェイス(ATL) #include <ObjBase.h> // COM+インターフェイス(OBJ) #include <crtdbg.h> #else #include <windows.h> // Windows標準ヘッダー #include <windowsx.h> // Windows標準ヘッダー #include <stdio.h> // 標準入出力ヘッダー #include <stdlib.h> #include <atlbase.h> // COMインターフェイス(ATL) #include <ObjBase.h> // COM+インターフェイス(OBJ) #endif





  • ComSecurity


    ///////////////////////////////////////////////////////////////
    // WMIの開始
    ///////////////////////////////////////////////////////////////
    bool CWmiLib::Init(void)
    {
       HRESULT   hr;
       DWORD   dwLen = MAX_COMPUTERNAME_LENGTH + 1;
       TCHAR szServer[MAX_PATH];
       char cTemp[MAX_PATH];
    
       // COMライブラリを使用できるように初期化
       // COMライブラリの初期化は1度だけ行うので、最初に行い個別には行わない
       // メインのルーチンで行えば後は必要ないので、ここに見本で記載
    /*   hr = CoInitializeEx(0, COINIT_MULTITHREADED);
       if (FAILED(hr))
       {
          // エラーだったら終了
          return false;
       }
    */
       g_CompStatus = NULL;
    
       g_CompStatus = new COMPSTATUS;
       if(g_CompStatus == NULL)
       {
          // メモリの確保に失敗
          return false;
       }
    
       ZeroMemory(g_CompStatus, sizeof(COMPSTATUS));
    
       m_pIWbemLocator  = NULL;
       m_pIWbemServices = NULL;
       m_pIEnumWbem = NULL;
    
       ZeroMemory(m_szCompName,sizeof(m_szCompName));
       m_bstrServer = NULL;
       m_ulCount = 0;
    
       // セキュリティー設定 -- WMI
       hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
                                  RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
       if (FAILED(hr))
       {
          return false;
       }
    
       // WMIロケーターの作成
       // Admin(CLSID_WbemAdministrativeLocator)権限ロケーターを作成
       // Windows2000/WindowsXP Proはこのロケーターで無ければ取得不能
       hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER,
                             IID_IWbemLocator, (LPVOID *) &m_pIWbemLocator);
       if (FAILED(hr))
       {
          return false;
       }
    
       ZeroMemory(m_szCompName, sizeof(m_szCompName));
       GetComputerName( m_szCompName, &dwLen );
    
       lstrcpy(szServer, _T("\\\\.\\root\\cimv2"));
    
       m_bstrServer = SysAllocString(szServer);
       if (m_bstrServer == NULL)
       {
          Clear();
          return false;
       }
    
       // ロケーターをサービスに接続
       hr = m_pIWbemLocator->ConnectServer((BSTR)m_bstrServer,NULL,NULL, 0L,0L,
                                               NULL, NULL, &m_pIWbemServices);
       if (FAILED(hr))
       {
          InstanceErrStr(hr,cTemp);
          Clear();
          return false;
       }
    
       // セキュリティ設定
       hr = CoSetProxyBlanket(m_pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
                              NULL, RPC_C_AUTHN_LEVEL_CALL, 
                              RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
       if (FAILED(hr))
       {
          InstanceErrStr(hr,cTemp);
          Clear();
          return false;
       }
    
       // コンピュータネームを保持
       WideCharToMultiByte(CP_ACP , 0 , m_szCompName,
                           -1 , (char*)g_CompStatus->lpCompName ,
                           lstrlenW(m_szCompName), NULL , NULL);
    
       return true;
    }
    
    



  • ///////////////////////////////////////////////////////////////
    // WMIの終了
    ///////////////////////////////////////////////////////////////
    void CWmiLib::Clear(void)
    {
       if(m_bstrServer != NULL)
       {
          SysFreeString((BSTR)m_bstrServer);
       }
    
       if(m_pIWbemObject != NULL)
       {
          m_pIWbemObject->Release();
          m_pIWbemObject = NULL;
       }
    
       if(m_pIEnumWbem != NULL)
       {
          m_pIEnumWbem->Release();
          m_pIEnumWbem = NULL;
       }
    
       if(m_pIWbemServices != NULL)
       {
          m_pIWbemServices->Release();
          m_pIWbemServices = NULL;
       }
    
       if(m_pIWbemLocator != NULL)
       {
          m_pIWbemLocator->Release();
          m_pIWbemLocator = NULL;
       }
    }
    

Wmi Command




  • VideoController VideoController
    ///////////////////////////////////////////////////////////////
    // VideoController情報の取得
    ///////////////////////////////////////////////////////////////
    bool CWmiLib::GetVideoControllerInfo(VIDEODEVICE *m_CompStatus)
    {
      HRESULT  hr;
      ULONG i = 0;
    	char  cSize[MAX_PATH];      // 容量
      _int64    iSize = 0;
      char cTemp[MAX_PATH];
      bool  bVideo = true;
    
      // Win32_VideoController情報の取得を開始
      // SQL文風に取得することも可能
      // hr = m_pIWbemServices->ExecQuery(L"WQL", L"SELECT * Win32_VideoController", 
                              WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
                              iWbemContext, &m_pIEnumWbem); 
      hr = m_pIWbemServices->CreateInstanceEnum(L"Win32_VideoController",
                                  WBEM_FLAG_SHALLOW|WBEM_FLAG_FORWARD_ONLY,
                                  NULL, &m_pIEnumWbem);
      if ( hr != WBEM_S_NO_ERROR)
      {
        // エラーになった場合 Win32_DisplayConfiguration で取得
        hr = m_pIWbemServices->CreateInstanceEnum(L"Win32_DisplayConfiguration",
                                    WBEM_FLAG_SHALLOW|WBEM_FLAG_FORWARD_ONLY,
                                    NULL, &m_pIEnumWbem);
        if ( hr != WBEM_S_NO_ERROR)
        {
          InstanceErrStr(hr,cTemp);
          OBJClear();
          return false;
        }
        else
        {
         bVideo = false;
        }
      }
    
      // OBJECTに入れる
      while(m_pIEnumWbem->Next(WBEM_INFINITE, 1, &m_pIWbemObject, &m_ulCount) == WBEM_S_NO_ERROR)
      {
       m_CompStatus[i].bVga = true;
    
       if(bVideo)
       {
         GetStringValue(m_pIWbemObject, L"AdapterCompatibility", 
                   (char*)m_CompStatus[i].cAdapterCompatibility, MAX_PATH);
    
         GetStringValue(m_pIWbemObject, L"AdapterDACType", 
                   (char*)m_CompStatus[i].cAdapterDACType, MAX_PATH);
    
         GetIntValue(m_pIWbemObject, L"AdapterRAM", (long*)&iSize);
         ZeroMemory(cSize , sizeof(cSize));
         if(iSize >= 1048576)
         {
           iSize = iSize / 1048576;
           _i64toa(iSize , (char*)cSize , 10);
           strcat(cSize, " MB");
           lstrcpy((LPWSTR)m_CompStatus[i].cAdapterRAM, (LPWSTR)cSize);
         }
         else
         {
           _i64toa(iSize , (char*)cSize , 10);
           strcat(cSize, " KB");
           lstrcpy((LPWSTR)m_CompStatus[i].cAdapterRAM, (LPWSTR)cSize);
         }
    
         // インストールされているドライバの名前とバージョンを取得
         // ただしWMIで取得可能なバージョンは実際のバージョンとは異なる場合がある
         GetStringValue(m_pIWbemObject, L"InstalledDisplayDrivers", 
                   (char*)m_CompStatus[i].cDriverName, MAX_PATH);
    
         GetStringValue(m_pIWbemObject, L"DriverVersion", 
                   (char*)m_CompStatus[i].cDriverVersion, MAX_PATH);
         //  VariantClear(&var);
         //  m_pIWbemObject->Get(L"Caption", 0, &var, NULL, NULL);
         //  VariantClear(&var);
         //  m_pIWbemObject->Get(L"DriverDate", 0, &var, NULL, NULL);
    
         GetStringValue(m_pIWbemObject, L"Name", (char*)m_CompStatus[i].cName, MAX_PATH);
    
         GetStringValue(m_pIWbemObject, L"VideoProcessor", 
                   (char*)m_CompStatus[i].cVideoProcessor, MAX_PATH);
       }
       else
       {
         lstrcpy((LPWSTR)m_CompStatus[i].cAdapterCompatibility, (LPWSTR)"not found");
         lstrcpy((LPWSTR)m_CompStatus[i].cAdapterDACType, (LPWSTR)"not found");
         lstrcpy((LPWSTR)m_CompStatus[i].cAdapterRAM, (LPWSTR)"not found");
         lstrcpy((LPWSTR)m_CompStatus[i].cDriverName, (LPWSTR)"not found");
         lstrcpy((LPWSTR)m_CompStatus[i].cDriverVersion, (LPWSTR)"not found");
    
         GetStringValue(m_pIWbemObject, L"DeviceName", (char*)m_CompStatus[i].cName, MAX_PATH);
    
         lstrcpy((LPWSTR)m_CompStatus[i].cVideoProcessor, (LPWSTR)"not found");
       }
       i++;
      }
    
      g_CompstatusCount.iVideoDevice = i;
    
      OBJClear();
      return true;
    }