- °³¿ä
- ¼³¸í
- ¶óÀ̺귯¸®
- Âü°í
- °³¼±ÇؾßÇÒ Á¡
- ¼Ò½º
- »ç¿ë¹ý
- Ãâ·Â °á°ú
1 °³¿ä
WMI¸¦ ÀÌ¿ëÇØ, ½Ã½ºÅÛ »óÀÇ ¿ÀºêÁ§Æ®µé¿¡ °üÇÑ Á¤º¸¸¦ ¾Ë¾Æ³»±â
2 ¼³¸í
¾ÖÃÊ¿¡ WMI±îÁö ã¾Æ µé¾î°¡°Ô µÈ °è±â´Â ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ºñµð¿À Ä«µåÀÇ Á¾·ù¿Í ºñµð¿À ·¥ÀÇ Å©±â¸¦ ¾Ë±â À§Çؼ¿´´Ù. CPU Á¾·ù³ª ÇÏµå µð½ºÅ© ¿ë·® µîÀÇ Á¤º¸´Â ºñ±³Àû ½±°Ô Á¢±ÙÇÒ ¼ö ÀÖ´Â µ¥¿¡ ºñÇØ¼, ºñµð¿À Ä«µå¿¡ °üÇÑ Á¤º¸¸¦ ¾ò´Â °ÍÀº µü ¶³¾îÁö´Â API°¡ ¾ø¾ú´Ù. ±×·¡¼ À̰ÍÀú°Í ã´Ù°¡, °á±¹ ¾î¶»°Ô WMI¶ó´Â °ÍÀÌ Çϵå¿þ¾î Á¤º¸¿Í ¿¬°üµÇ¾îÀÖ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Âµ¥, ¸·»ó ÀÚ¼¼È÷ »ìÆìº¸´Ï, Çϵå¿þ¾î »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ °ÅÀÇ ¸ðµç ½Ã½ºÅÛ ¿ÀºêÁ§Æ®¿¡ °üÇÑ Á¤º¸¸¦ ¾Ë ¼ö ÀÖ°Ô µÇ¾îÀÖ¾ú´Ù.
3 ¶óÀ̺귯¸®
¾Æ·¡ÀÇ ¶óÀ̺귯¸®(?)´Â WMI SDK ³»¿¡ Á¸ÀçÇÏ´Â »ùÇà Áß¿¡¼ Simple Client¶ó´Â »ùÇÃÀ» Âü°íÇØ¼ Á¦ÀÛÇÑ °ÍÀÌ´Ù. °¢°¢ÀÇ Á¤º¸µéÀº ¸ðµÎ Æ÷¸ËÀÌ ´Ù¸¥µ¥, ÀÚ¼¼ÇÑ °ÍÀº
MSDNÀ» Âü°íÇϱ⠹ٶõ´Ù.
3.1 Âü°í
- Visual C++ .Net 2003¿¡¼´Â ¾Æ¹« ¹®Á¦¾øÀÌ ÄÄÆÄÀÏ¿¡ ¼º°øÇß´Ù.
- CoCreateInstance() µîÀÇ ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§Çؼ´Â windows.h¸¦ Æ÷ÇÔÇϱâ Àü¿¡ _WIN32_WINNT »ó¼ö¸¦ ÀçÁ¤ÀÇÇØÁà¾ßÇÑ´Ù.
- ¼Ò½ºÀÇ ÁÖ¼®¿¡µµ ³ª¿ÍÀÖÁö¸¸, ½ÇÇà ÆÄÀÏ ÇÁ·ÎÁ§Æ®¿¡´Ù°¡ wbemuuid.lib¸¦ Ãß°¡ÀûÀ¸·Î ¸µÅ©ÇØÁà¾ßÇÑ´Ù.
- MFC¸¦ »ç¿ëÇÏÁö ¾Ê°í ¸¸µé¾îÁø ¶óÀ̺귯¸®´Ù. MFC¸¦ »ç¿ëÇÒ °æ¿ì, 2¹ÙÀÌÆ® ¹®ÀÚ¿ ºÎºÐÀ̳ª, OLE °ü·Ã ºÎºÐÀÌ »ó´çÈ÷ ÆíÇØÁö±ä ÇÏÁö¸¸, µ¶¸³¼ºÀÌ ¶³¾îÁø´Ù°í »ý°¢Ç߱⠶§¹®¿¡, »ç¿ëÇÏÁö ¾Ê¾Ò´Ù.
3.2 °³¼±ÇؾßÇÒ Á¡
- COM°ú °ü·ÃµÈ ºÎºÐÀº Àß ¾ËÁö ¸øÇÏ´Â »óȲ¿¡¼ ÄÚµùÇ߱⠶§¹®¿¡, ¹ö±×°¡ Á¸ÀçÇÒ °¡´É¼ºÀÌ ³ô´Ù.
- À¯´ÏÄڵ带 ¸ÖƼ¹ÙÀÌÆ®·Î º¯È¯Çؼ ó¸®Çϰí ÀÖ´Ù. ¿ØÁö ½Ã´ë¸¦ ¿ªÇàÇϰí ÀÖ´Â µíÇÑ ´À³¦ÀÌ µé±âµµ ÇÑ´Ù¸¸...
- ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ Á¤º¸´Â VARIANT Çü½ÄÀ¸·Î ³Ñ¾î¿À´Âµ¥, ¹®ÀÚ¿°ú ¼ýÀÚ¸¸ ó¸®ÇÏ°í ´Ù¸¥ ŸÀÔÀÇ VARIANT´Â Á¦´ë·Î ó¸®Çϰí ÀÖÁö ¾Ê´Ù.
3.3 ¼Ò½º
//////////////////////////////////////////////////////////////////////////////
/// \file WMIAccessor.h
/// \author excel96
/// \date 2003.12.18
//////////////////////////////////////////////////////////////////////////////
#ifndef __WMIACCESSOR_H__
#define __WMIACCESSOR_H__
// Ç÷§Æû SDK¿¡ ÀÖ´Â ÇÔ¼ö Áß¿¡¼ _WIN32_WINNT °ªÀÌ 0x0500ÀÌ»óÀ̾î¾ß¸¸
// includeµÇ´Â ÇÔ¼öµéÀÌ Á¸ÀçÇÑ´Ù. ±×·± ÇÔ¼öµéÀ» »ç¿ëÇϱâ À§Çؼ Á¤ÀÇÇÑ´Ù.
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0500
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////////////
/// \class WMIAccessor
/// \brief ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë¾Æ³»±â À§ÇÑ
/// À¯Æ¿¸®Æ¼ Ŭ·¡½º.
///
/// ³»ºÎÀûÀ¸·Î WMI(Windows Management Instrumentation)¸¦ »ç¿ëÇÑ´Ù. ±×·¡¼
/// wbemuuid.lib¸¦ ¸µÅ© ÅÇ¿¡´Ù Ãß°¡ÇØÁà¾ßÇÑ´Ù. pragma¸¦ »ç¿ëÇÏ¸é ±ò²ûÇϰÔ
/// ÇØ°áµÉ µíµµ ÇÏ´Ù¸¸...
//////////////////////////////////////////////////////////////////////////////
class WMIAccessor
{
private:
struct IMPL;
IMPL* m_pImpl;
public:
WMIAccessor(const string& szNameSpace="\\\\.\\root\\cimv2");
virtual ~WMIAccessor();
public:
/// \brief ÁÖ¾îÁø Ŭ·¡½º¿¡ ¼ÓÇÑ ¿ÀºêÁ§Æ®µé¿¡ ´ëÇÑ Á¤º¸¸¦ Á¶»çÇØ¼,
/// ³»ºÎ ¹öÆÛ¿¡´Ù ÀúÀåÇÑ´Ù.
void enumerate(const string& szWMIAccessorID);
/// \brief enumerate ÇÔ¼ö¸¦ »ç¿ëÇØ¼ »ý¼ºÇÑ ¿ÀºêÁ§Æ®ÀÇ ¼ö¸¦ ¹ÝȯÇÑ´Ù.
size_t size() const;
/// \brief ÁöÁ¤µÈ ¿ÀºêÁ§Æ®ÀÇ ¼Ó¼º°ªÀ» ¹ÝȯÇÑ´Ù.
string asString(size_t index, const string& property_name) const;
/// \brief ÁöÁ¤µÈ ¿ÀºêÁ§Æ®ÀÇ ¼Ó¼º°ªÀ» ¹ÝȯÇÑ´Ù.
int asInt(size_t index, const string& property_name) const;
/// \brief ³»ºÎ µ¥ÀÌÅ͸¦ ¹®ÀÚ¿·Î º¯È¯Çؼ ¹ÝȯÇÑ´Ù.
string toString() const;
public:
/// \brief enumerate ÇÔ¼ö ³»ºÎ¿¡¼ »ç¿ëÇÏ´Â ÇÔ¼ö·Î¼, ÇØ´çÇÏ´Â À妽ºÀÇ
/// ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸¸¦ ¸Ê¿¡´Ù ±â·ÏÇÑ´Ù.
void query(size_t index);
public:
/// \brief WMIAccessor Ŭ·¡½º¸¦ »ç¿ëÇϱâ Àü¿¡ ºÒ·¯Áà¾ßÇÏ´Â ÃʱâÈ ÇÔ¼ö
static void initialize();
/// \brief WMIAccessor Ŭ·¡½º¸¦ »ç¿ëÇÑ ÈÄ¿¡ ºÒ·¯Áà¾ßÇÏ´Â ÃʱâÈ ÇÔ¼ö
static void finalize();
};
#endif //__WMIACCESSOR_H__
//////////////////////////////////////////////////////////////////////////////
/// \file WMIAccessor.cpp
/// \author excel96
/// \date 2003.12.18
//////////////////////////////////////////////////////////////////////////////
#include "WMIAccessor.h"
#include <windows.h>
#include <wbemcli.h>
#include <assert.h>
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <fstream>
#include <vector>
#include <hash_map>
#define BUF_SIZE 1024
//////////////////////////////////////////////////////////////////////////////
/// \brief ÆÄÀÏ¿¡´Ù ·Î±×¸¦ ³²±ä´Ù.
/// \param fmt Æ÷¸Ë
/// \param ... ÆÄ¶ó¹ÌÅ͵é...
//////////////////////////////////////////////////////////////////////////////
static void filelog(char* fmt, ...)
{
ofstream file;
file.open("WMIAccessorError.log", ios::out | ios::app);
if (file.is_open())
{
va_list valist;
va_start(valist, fmt);
char message_buffer[30000] = {0, };
int nchars = _vsnprintf(message_buffer, 30000, fmt, valist);
if (nchars == -1 || nchars > 30000)
{
filelog("filelog buffer overflow!");
throw ("filelog() : more buffer size needed for log");
}
va_end(valist);
time_t now = time(0);
char time_buffer[256] = {0, };
sprintf(time_buffer, "%s : ", ctime(&now));
file.write(time_buffer, (streamsize)strlen(time_buffer));
file.write(message_buffer, (streamsize)strlen(message_buffer));
file.write("\n", (streamsize)strlen("\n"));
}
}
//////////////////////////////////////////////////////////////////////////////
/// \class WideString
/// \brief
//////////////////////////////////////////////////////////////////////////////
class WideString
{
private:
BSTR m_pSTR;
public:
WideString()
{
m_pSTR = ::SysAllocString(NULL);
if (m_pSTR == NULL) { filelog("WideString() : Cannot allocate."); }
}
WideString(const char* szContent)
{
wchar_t buf[BUF_SIZE] = {0, };
mbstowcs(buf, szContent, BUF_SIZE);
m_pSTR = ::SysAllocString(buf);
if (m_pSTR == NULL) { filelog("WideString() : Cannot allocate."); }
}
WideString(const string& szContent)
{
wchar_t buf[BUF_SIZE] = {0, };
mbstowcs(buf, szContent.c_str(), BUF_SIZE);
m_pSTR = ::SysAllocString(buf);
if (m_pSTR == NULL) { filelog("WideString() : Cannot allocate."); }
}
WideString(const wchar_t* szContent)
{
m_pSTR = ::SysAllocString(szContent);
if (m_pSTR == NULL) { filelog("WideString() : Cannot allocate."); }
}
~WideString() { clear(); }
string toString() const
{
char buf[BUF_SIZE] = {0, };
wcstombs(buf, m_pSTR, BUF_SIZE);
return string(buf);
}
void clear()
{
if (m_pSTR)
{
::SysFreeString(m_pSTR);
m_pSTR = NULL;
}
}
operator BSTR() { return m_pSTR; }
operator string() { return toString(); }
private:
WideString(const WideString&) {}
WideString& operator = (const WideString&) { return *this; }
};
//////////////////////////////////////////////////////////////////////////////
/// \brief
///
/// \param var
/// \return static string
//////////////////////////////////////////////////////////////////////////////
static string Variant2String(const VARIANT& var)
{
if (var.vt == VT_NULL)
{
return "NULL";
}
else if (var.vt == VT_BOOL)
{
return var.boolVal ? "true" : "false";
}
else if (var.vt == VT_UI1)
{
char buf[128] = {0,};
sprintf(buf, "%c", var.cVal);
return string(buf);
}
else if (var.vt == VT_I2)
{
char buf[128] = {0,};
sprintf(buf, "%d", var.iVal);
return string(buf);
}
else if (var.vt == VT_I4)
{
char buf[128] = {0,};
sprintf(buf, "%d", var.lVal);
return string(buf);
}
else if (var.vt == VT_BSTR)
{
return WideString(V_BSTR(&var)).toString();
}
return "Unknown";
}
//////////////////////////////////////////////////////////////////////////////
/// \struct WMIAccessor::IMPL
/// \brief WMIAccessor Ŭ·¡½º ³»ºÎ µ¥ÀÌÅÍ ±¸Á¶Ã¼
//////////////////////////////////////////////////////////////////////////////
struct WMIAccessor::IMPL
{
typedef vector<string> DEVICE_NAMES;
typedef stdext::hash_map<string, string> DETAIL;
typedef stdext::hash_map<string, DETAIL> DETAIL_MAP;
IWbemServices* pServices; ///< IWbemServices ÀÎÅÍÆäÀ̽º
DEVICE_NAMES Names; ///< ÀÓÀÇÀÇ Å¬·¡½º¿¡ ¼ÓÇÑ ¿ÀºêÁ§Æ®µéÀÇ À̸§
DETAIL_MAP Details; ///< °¢ ¿ÀºêÁ§Æ®ÀÇ »ó¼¼ÇÑ Á¤º¸µé
static bool s_bOLEInit; ///> OLE DLLÀÌ ÃʱâȵǾú´Â°¡?
IMPL()
: pServices(NULL)
{
}
~IMPL()
{
if (pServices) pServices->Release();
Names.clear();
Details.clear();
}
};
bool WMIAccessor::IMPL::s_bOLEInit = false;
//////////////////////////////////////////////////////////////////////////////
/// \brief
/// \param szNameSpace
//////////////////////////////////////////////////////////////////////////////
WMIAccessor::WMIAccessor(const string& szNameSpace)
: m_pImpl(new IMPL)
{
IWbemLocator* pLocator = NULL;
HRESULT result = S_OK;
// WbemLocator ÀÎÅÍÆäÀ̽º °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
result = ::CoCreateInstance(CLSID_WbemLocator, NULL,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLocator);
// WBemLocation ÀÎÅÍÆäÀ̽º »ý¼º¿¡ ¼º°øÇß´Ù¸é...
if (SUCCEEDED(result))
{
// ³×ÀÓ ½ºÆäÀ̽º ¹®ÀÚ¿À» BSTR·Î º¯È¯ÇÑ´Ù.
WideString wszNameSpace(szNameSpace.c_str());
// If already connected, release m_pImpl->pServices.
if (m_pImpl->pServices) m_pImpl->pServices->Release();
// Using the locator, connect to CIMOM in the given namespace.
result = pLocator->ConnectServer(
wszNameSpace, // namespace
NULL, //using current account for simplicity
NULL, //using current password for simplicity
0L, // locale
0L, // securityFlags
NULL, // authority (domain for NTLM)
NULL, // context
&m_pImpl->pServices);
if (FAILED(result))
{
filelog("WMIAccessor() : Bad namespace!");
}
}
// WBemLocation ÀÎÅÍÆäÀ̽º »ý¼º¿¡ ½ÇÆÐÇß´Ù!
else
{
filelog("Failed to create IWbemLocator object");
}
// Done with pLocator.
pLocator->Release();
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¼Ò¸êÀÚ
//////////////////////////////////////////////////////////////////////////////
WMIAccessor::~WMIAccessor()
{
delete m_pImpl;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÁÖ¾îÁø Ŭ·¡½º¿¡ ¼ÓÇÑ ¿ÀºêÁ§Æ®µé¿¡ ´ëÇÑ Á¤º¸¸¦ Á¶»çÇØ¼,
/// ³»ºÎ ¹öÆÛ¿¡´Ù ÀúÀåÇÑ´Ù.
/// \param szWMIAccessorID ¿°ÅÇÒ Å¬·¡½º
//////////////////////////////////////////////////////////////////////////////
void WMIAccessor::enumerate(const string& szWMIAccessorID)
{
// ±âÁ¸ÀÇ µ¥ÀÌÅ͸¦ »èÁ¦ÇÑ´Ù.
m_pImpl->Names.clear();
m_pImpl->Details.clear();
HRESULT result = S_OK;
IEnumWbemClassObject* pClassObjects = NULL;
// ÇØ´çÇϴ Ŭ·¡½º¿¡ ¼ÓÇÏ´Â ¿ÀºêÁ§Æ®µéÀ» ¸ñ·ÏÀ» ¾ò¾î¿Â´Ù.
result = m_pImpl->pServices->CreateInstanceEnum(
WideString(szWMIAccessorID), 0, NULL, &pClassObjects);
// ¿ÀºêÁ§Æ®ÀÇ ¸ñ·ÏÀ» ¾ò¾î¿À´Âµ¥ ½ÇÆÐÇß´Ù¸é ¸®ÅÏÇÑ´Ù.
if (FAILED(result))
{
filelog("enumerate() : CreateInstanceEnum() failed:");
return;
}
ULONG uReturned = 1;
while (uReturned == 1)
{
IWbemClassObject* pObject = NULL;
// °á°ú¼ÂÀ» Ⱦ´ÜÇϸé¼...
result = pClassObjects->Next(
2000, // ÀÀ´äÀÌ ¿Ã ¶§±îÁö 2Ãʰ£ ±â´Ù¸°´Ù.
1, // °á°ú¼Â Áß¿¡ Çϳª¸¸ ¸®ÅÏÇÑ´Ù.
&pObject, // ¿ÀºêÁ§Æ®ÀÇ À§Ä¡¸¦ ÀúÀåÇÒ °÷
&uReturned); // °á°ú¼Â¿¡¼ ²¨³½ ¿ÀºêÁ§Æ®ÀÇ ¼ö, 1 ¶Ç´Â 0
if (SUCCEEDED(result) && (uReturned == 1))
{
VARIANT pObjectName;
::VariantClear(&pObjectName);
// Get the "__RELPATH" property.
result = pObject->Get(WideString(L"__RELPATH"),
0L, &pObjectName, NULL, NULL);
// ¾ò¾î¿Â Ŭ·¡½º ¿ÀºêÁ§Æ®ÀÇ À̸§À» ÀúÀåÇØµÐ´Ù.
if (SUCCEEDED(result))
{
m_pImpl->Names.push_back(WideString(V_BSTR(&pObjectName)));
}
// ÀÌ ¿ÀºêÁ§Æ®´Â ´õ ÀÌ»ó »ç¿ëÇÒ ÀÏÀÌ ¾ø´Ù.
pObject->Release();
}
} // end of while (uReturned == 1)
// ´õ ÀÌ»ó »ç¿ëÇÒ À̸® ¾øÀ¸´Ï, ¿ÀºêÁ§Æ® ¸ñ·ÏÀ» »èÁ¦ÇÑ´Ù.
if (pClassObjects) pClassObjects->Release();
// °¢°¢ÀÇ Å¬·¡½º ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ »ó¼¼ ³»¿ªÀ» ¾ò¾î¿Â´Ù.
for (size_t i=0; i<m_pImpl->Names.size(); i++) { query(i); }
}
//////////////////////////////////////////////////////////////////////////////
/// \brief enumerate ÇÔ¼ö ³»ºÎ¿¡¼ »ç¿ëÇÏ´Â ÇÔ¼ö·Î¼, ÇØ´çÇÏ´Â À妽ºÀÇ
/// ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸¸¦ ¸Ê¿¡´Ù ±â·ÏÇÑ´Ù.
///
/// À妽º°¡ ¹üÀ§¸¦ ¹þ¾î³ª´Â °æ¿ì ¾î¼Æ®!
///
/// \param index ¿ÀºêÁ§Æ®ÀÇ À妽º
//////////////////////////////////////////////////////////////////////////////
void WMIAccessor::query(size_t index)
{
assert(index < m_pImpl->Names.size());
IWbemClassObject* pClassObject = NULL;
HRESULT result = S_OK;
SAFEARRAY* psaNames = NULL;
// ¿ÀºêÁ§Æ®ÀÇ À̸§À» ÀÌ¿ëÇØ, ¿ÀºêÁ§Æ® °´Ã¼¸¦ ¾ò¾î¿Â´Ù.
result = m_pImpl->pServices->GetObject(
WideString(m_pImpl->Names[index]), 0L, NULL, &pClassObject, NULL);
// ¿ÀºêÁ§Æ® °´Ã¼¸¦ ¾ò¾î¿ÀÁö ¸øÇß´Ù¸é ±×³É ¸®ÅÏÇÑ´Ù.
if (FAILED(result))
{
filelog("IWbemServices::GetObject() failed!");
return;
}
// »ó¼¼ »çÇ× ¸Ê¿¡¼ ÇØ´çÇÏ´Â ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ ¿£Æ®¸®°¡ ÀÖ´ÂÁö Á¶»çÇÑ´Ù.
IMPL::DETAIL_MAP::iterator itr =
m_pImpl->Details.find(m_pImpl->Names[index]);
// »ó¼¼ »çÇ× ¸Ê¿¡ ÇØ´çÇÏ´Â ¿£Æ®¸®°¡ Á¸ÀçÇÒ °æ¿ì, ±âÁ¸°ªµéÀ» »èÁ¦Çϰí,
// ¿£Æ®¸®°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é, »õ·Î ¸¸µé¾îÁØ´Ù.
if (itr != m_pImpl->Details.end())
{
itr->second.clear();
}
else
{
itr = m_pImpl->Details.insert(IMPL::DETAIL_MAP::value_type(
m_pImpl->Names[index], IMPL::DETAIL())).first;
}
IMPL::DETAIL& Detail = itr->second;
// ¿ÀºêÁ§Æ® ³»¿¡ Á¸ÀçÇÏ´Â ¼Ó¼º À̸§µéÀ» ¾ò¾î¿Â´Ù.
result = pClassObject->GetNames(
NULL, WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, NULL, &psaNames);
// ¼Ó¼º À̸§µéÀ» ¾ò¾î¿ÀÁö ¸øÇß´Ù¸é ¸®ÅÏÇÑ´Ù.
if (FAILED(result))
{
filelog("IWbemClassObject::GetNames() failed!");
return;
}
// ¹è¿ÀÇ ÃÖ¼Ò À妽º¿Í ÃÖ´ë À妽º¸¦ ¾ò¾î¿Â´Ù.
long lbound = 0, ubound = 0;
::SafeArrayGetLBound(psaNames, 1, &lbound);
::SafeArrayGetUBound(psaNames, 1, &ubound);
// ¹è¿À» Ⱦ´ÜÇÏ¸é¼ °¢°¢ÀÇ ¼Ó¼º¿¡ ´ëÇÑ °ªÀ» ¾ò¾î¿Â´Ù.
for (long i = lbound; i <= ubound; i++)
{
WideString wszObjectPropName;
// ÇöÀç À妽ºÀÇ ¼Ó¼º À̸§À» ¹è¿¿¡¼ ¾ò¾î¿Â´Ù.
result = ::SafeArrayGetElement(psaNames, &i, &wszObjectPropName);
if (FAILED(result)) { continue; }
VARIANT pObjectPropType;
VARIANT pObjectPropValue;
VariantClear(&pObjectPropType);
VariantClear(&pObjectPropValue);
// ÇöÀç ¼Ó¼ºÀÌ ¼ÓÇØÀִ ŸÀÔµéÀ» Àоî¿Â´Ù. ½Ã½ºÅÛ ¼Ó¼ºÀÎ °æ¿ì, ŸÀÔ
// ¼ÂÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» Âü°íÇϱ⠹ٶõ´Ù.
IWbemQualifierSet* pObjectProperties = NULL;
if (FAILED(pClassObject->GetPropertyQualifierSet(
wszObjectPropName, &pObjectProperties)))
{
continue;
}
// ¼Ó¼º ŸÀÔµéÀ» ÀÌ¿ëÇØ ¼Ó¼º ¹®ÀÚ¿À» Àоî¿Â´Ù.
if (FAILED(pObjectProperties->Get(
L"CIMTYPE", 0L, &pObjectPropType, NULL)))
{
continue;
}
// ¼Ó¼º ¹®ÀÚ¿À» ÀÏ¹Ý ¹®ÀÚ¿·Î º¯È¯ÇصдÙ.
string property_type_string = WideString(V_BSTR(&pObjectPropType));
// ¼Ó¼ºÀÇ °ªÀ» Àоî¿Â´Ù.
if (FAILED(pClassObject->Get(
wszObjectPropName, 0, &pObjectPropValue, NULL, NULL)))
{
continue;
}
// ¼Ó¼ºÀÇ °ª ŸÀÔ¿¡ µû¶ó, Àû´çÈ÷ ¹®ÀÚ¿·Î º¯È¯ÇØÁØ µÚ,
// ±× °ªÀ» »ó¼¼ »çÇ× ¸Ê¿¡´Ù°¡ Áý¾î³Ö´Â´Ù.
Detail[wszObjectPropName.toString()] = Variant2String(pObjectPropValue);
}
// ¼Ó¼º À̸§ ¹è¿Àº »ç¿ëÀÌ ³¡³µÀ¸´Ï »èÁ¦ÇØÁØ´Ù.
::SafeArrayDestroy(psaNames);
// Ŭ·¡½º ¿ÀºêÁ§Æ®µµ ¸¶Âù°¡Áö...
pClassObject->Release();
}
//////////////////////////////////////////////////////////////////////////////
/// \brief enumerate ÇÔ¼ö¸¦ »ç¿ëÇØ¼ »ý¼ºÇÑ ¿ÀºêÁ§Æ®ÀÇ ¼ö¸¦ ¹ÝȯÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
size_t WMIAccessor::size() const
{
return m_pImpl->Names.size();
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÁöÁ¤µÈ ¿ÀºêÁ§Æ®ÀÇ ¼Ó¼º°ªÀ» ¹ÝȯÇÑ´Ù.
///
/// À妽º°¡ ¹üÀ§¸¦ ¹þ¾î³ª°Å³ª, ÇØ´çÇÏ´Â ¼Ó¼ºÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡´Â
/// ºó ¹®ÀÚ¿À» ¹ÝȯÇÑ´Ù.
///
/// \param index ¿ÀºêÁ§Æ® À妽º
/// \param property_name ¼Ó¼º À̸§
/// \return string ¼Ó¼ºÀÇ °ª
//////////////////////////////////////////////////////////////////////////////
string WMIAccessor::asString(size_t index, const string& property_name) const
{
if (index < m_pImpl->Names.size())
{
IMPL::DETAIL_MAP::const_iterator i =
m_pImpl->Details.find(m_pImpl->Names[index]);
if (i == m_pImpl->Details.end()) return "";
const IMPL::DETAIL& detail = i->second;
IMPL::DETAIL::const_iterator j = detail.find(property_name);
return j != detail.end() ? j->second : "";
}
return "";
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÁöÁ¤µÈ ¿ÀºêÁ§Æ®ÀÇ ¼Ó¼º°ªÀ» ¹ÝȯÇÑ´Ù.
///
/// À妽º°¡ ¹üÀ§¸¦ ¹þ¾î³ª°Å³ª, ÇØ´çÇÏ´Â ¼Ó¼ºÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡´Â
/// -1À» ¹ÝȯÇÑ´Ù.
///
/// \param index ¿ÀºêÁ§Æ® À妽º
/// \param property_name ¼Ó¼º À̸§
/// \return string ¼Ó¼ºÀÇ °ª
//////////////////////////////////////////////////////////////////////////////
int WMIAccessor::asInt(size_t index, const string& property_name) const
{
if (index < m_pImpl->Names.size())
{
IMPL::DETAIL_MAP::const_iterator i =
m_pImpl->Details.find(m_pImpl->Names[index]);
if (i == m_pImpl->Details.end()) return -1;
const IMPL::DETAIL& detail = i->second;
IMPL::DETAIL::const_iterator j = detail.find(property_name);
return j != detail.end() ? atoi((j->second).c_str()) : -1;
}
return -1;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ³»ºÎ µ¥ÀÌÅ͸¦ ¹®ÀÚ¿·Î º¯È¯Çؼ ¹ÝȯÇÑ´Ù.
/// \return string º¯È¯ÇÑ µ¥ÀÌÅÍ
//////////////////////////////////////////////////////////////////////////////
string WMIAccessor::toString() const
{
string msg;
for (IMPL::DETAIL_MAP::const_iterator i = m_pImpl->Details.begin();
i != m_pImpl->Details.end(); i++)
{
const IMPL::DETAIL& detail = i->second;
msg += string("DEVICE ") + i->first + "\n";
for (IMPL::DETAIL::const_iterator j=detail.begin();
j != detail.end(); j++)
{
msg += string("\t") + j->first + string(" = ") + j->second + "\n";
}
}
return msg;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief WMIAccessor Ŭ·¡½º¸¦ »ç¿ëÇϱâ Àü¿¡ ºÒ·¯Áà¾ßÇÏ´Â ÃʱâÈ ÇÔ¼ö.
///
/// OLE DLLÀ» ·ÎµåÇϰí, º¸¾È ±ÇÇÑ ¼öÁ¤À» ÇàÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
void WMIAccessor::initialize()
{
IMPL::s_bOLEInit = (::CoInitialize(NULL) == S_OK);
if (!IMPL::s_bOLEInit)
{
filelog("Failed to initialize the OLE libraries");
assert(false);
}
// Adjust the security to allow client impersonation.
// NOTE:
// When using asynchronous WMI API's remotely in an environment where
// the "Local System" account has no network identity
// (such as non-Kerberos domains), the authentication level of
// RPC_C_AUTHN_LEVEL_NONE is needed. However, lowering the authentication
// level to RPC_C_AUTHN_LEVEL_NONE makes your application less secure.
// It is wise to use semi-synchronous API's for accessing WMI data and
// events instead of the asynchronous ones.
HRESULT hres = ::CoInitializeSecurity(
NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_SECURE_REFS, //change to EOAC_NONE if you change dwAuthnLevel to RPC_C_AUTHN_LEVEL_NONE
NULL);
if (FAILED(hres))
{
filelog("Failed to fix security!");
assert(false);
}
}
//////////////////////////////////////////////////////////////////////////////
/// \brief WMIAccessor Ŭ·¡½º¸¦ »ç¿ëÇÑ ÈÄ¿¡ ºÒ·¯Áà¾ßÇÏ´Â ÃʱâÈ ÇÔ¼ö.
///
/// OLE DLLÀÇ Á¤¸®¸¦ ´ã´çÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
void WMIAccessor::finalize()
{
if (IMPL::s_bOLEInit) { ::CoUninitialize(); }
}
3.4 »ç¿ë¹ý
int main()
{
WMIAccessor::initialize();
WMIAccessor video;
video.enumerate("Win32_VideoController");
cout << video.toString() << endl;
WMIAccessor::finalize();
return 0;
}
3.5 Ãâ·Â °á°ú
DEVICE Win32_VideoController.DeviceID="VideoController1"
AdapterRAM = 33554432
MaxRefreshRate = 150
Name = NVIDIA GeForce2 MX/MX 400
ReservedSystemPaletteEntries = NULL
VideoModeDescription = 1280 x 1024 x 4294967296
DitherType = NULL
DriverVersion = 6.14.10.4403
InfSection = nv4
VideoMemoryType = 2
CreationClassName = Win32_VideoController
ProtocolSupported = NULL
Description = NVIDIA GeForce2 MX/MX 400
...ÀÌÇÏ »ý·«...
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)