找回密码
 注册
搜索
查看: 12610|回复: 0

[收藏]C++ Builder 通过 WMI 获取系统信息

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
# x) ^+ v0 i2 R: Z  T
3 a+ X9 v  h& {! @
$ W# @/ t: E4 @--------------------------------------------------------------------------------
. k8 J7 p8 M1 y5 w* L/ ?WMI: Windows Management Instrumentation (Windows 管理工具)7 c4 I# c& A5 y6 z5 B! k
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
) J5 r7 |3 P1 c) f  R# q- Q& Y   利用这个工具可以管理本地或客户端系统中几乎所有的信息。- \8 t  K7 s$ Y% k. g
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 z: S3 D# a, u' g
+ G) u6 c' B0 ^! g" j
--------------------------------------------------------------------------------
! B5 Z8 ]3 _9 U# ]& tBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面/ r4 D' R% v- s* w8 M
8 A! q; z; d- A4 v  {4 E% m; a& c
--------------------------------------------------------------------------------' L- t. g2 z2 V% f( l
① 初始化 COM 接口:
- l/ _8 s4 g0 Q7 j   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。; J0 Y% Q4 i* W; Q# O. V" g
  这两个函数在 #include <comdef.h> 里面定义。
- ?3 X6 l! t6 A: q/ F: F+ ~9 [+ V( f# X$ I
② 获取访问 WMI 权限:  J, I* y* d" B7 Q$ L8 I
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);3 g' Y  R+ E1 z2 v3 p
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
% u$ k! D9 @1 R' W" B; e8 z, T! x- a. _" y0 D! d
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:  v  l* j# d! ~2 I
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。! k% S/ t) b& O) {
' E) E6 [! X6 f, E% k
void GetWmiInfo(TStrings *lpList, WideString wsClass)" C. F; e' \! N5 R
{
5 g, V. E  T1 s/ B' }! Q  IWbemLocator *pWbemLocator = NULL;
; c% S  l7 N. S% \1 q: Z7 B  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK); G  {! P# C7 u: {6 p% l
  {
1 z$ f  @, C' v3 i     IWbemServices *pWbemServices = NULL;
6 d# N& r3 b( E+ t" E& A* |* D     WideString wsNamespace = (L"root\\cimv2");
4 ^7 b& K7 n! ^     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
. U5 ]; _9 i  |4 L      {: y  s% g# Y+ @- a: q2 u
       IEnumWbemClassObject *pEnumClassObject = NULL;
1 v/ g4 g- L' O% p# j9 E7 Q        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;4 `- a* W1 U9 t) z: a: E
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)( w7 t  J. G- e2 c9 I. s
        {/ e0 ?+ [: h# Q% f; {! i5 h
          IWbemClassObject *pClassObject = NULL;  a5 f5 f, q6 _* |  P% Q
          ULONG uCount = 1, uReturned;
5 a, ]5 B- m% }0 ~- ~- R           if(pEnumClassObject->Reset() == S_OK)$ l  q& ?3 o" z) ?. `
           {
9 x9 z' B* c- P/ B              int iEnumIdx = 0;
# S) T" h  `# v              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)9 u& z# |/ ^3 Q
              {2 G2 c; i  s2 b% S
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
5 l4 k9 Q  k. h: Y# M
$ U! U+ x) x: ~7 G                 SAFEARRAY *pvNames = NULL;
3 V/ ]6 Y, U4 c2 ], e* T                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 _# |1 J+ Q1 N! F- ^                  {' F  Y' T) f5 K- `& Q( a
                   long vbl, vbu;$ A+ `) k4 F* s9 L) g; t, `
                   SafeArrayGetLBound(pvNames, 1, &vbl);2 d+ Y, W7 j2 e2 y
                   SafeArrayGetUBound(pvNames, 1, &vbu);8 w  }& K3 _1 E% ~. B4 ~
                   for(long idx=vbl; idx<=vbu; idx++). \2 E5 [. Y" A0 Y. p9 z3 i2 l
                    {
: C% i2 L/ C1 L                       long aidx = idx;
' C# S$ h8 U9 L$ J! {                       wchar_t *wsName = 0;
4 y; d  ?- j9 i& E& v2 f9 P6 y' n                       VARIANT vValue;
/ M6 T  h; W' o0 ~- w8 {                       VariantInit(&vValue);
7 [4 T) l( d( O0 \: I4 j3 V- X$ y6 B" b                       SafeArrayGetElement(pvNames, &aidx, &wsName);, v. m  D: G/ E1 k

8 G7 m4 u+ x$ Q5 K' \8 Y/ t3 g                       BSTR bs = SysAllocString(wsName);
+ n( K- x- m- Z4 h* a5 ^                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);5 X/ h5 g) D+ \
                      SysFreeString(bs);
- u& J& P  ~; U
; U  [* h6 r% k                       if(hRes == S_OK), N0 F% f: h+ a
                       {
0 X4 D* F& ^5 ~4 a; ?* S% i& E                          AnsiString s;9 F' V& }2 p. I0 N
                         Variant v = *(Variant*)&vValue;6 X7 h" Q3 m7 g! v: n, z
                         if(v.IsArray())
) D/ H& c8 |! t  K+ x! e2 T                           {& H) l) m( [( O! k9 I
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
( J% p; M: j% T) c1 I6 {                              {, y8 p7 N# k1 E0 T
                               Variant a = v.GetElement(i);
* V- z/ n! b9 \7 C5 y. |                                if(!s.IsEmpty())
$ M+ |' g/ O# K) h0 _; ]                                  s+=", ";
. n, _; u- ^9 D. l                                s+=VarToStr(a);  t) r9 X2 P4 j/ `) N9 d
                             }2 u% R1 m+ u9 j! h
                          }: |9 K! E) B$ A5 y1 Q
                         else
% W- N- s' ^! h% u( H; x7 R% W6 i: ]& L5 E                           {
9 i# b/ l" P+ z                             s = VarToStr(v);1 R- l0 Z& D" ?; m* l
                          }
. O0 ]8 ^4 m- h0 H                          lpList->Add(AnsiString(wsName)+"="+s);
! t$ S; T; U. E2 b& ^; O                        }
: v4 ~; W# Y1 Z6 L6 s- V, g7 }! I/ N7 B$ Q' \" _3 F" P% e; N
                      VariantClear(&vValue);7 x0 c* v7 h  P4 j$ K
                      SysFreeString(wsName);
2 T2 s* G- h8 g/ s8 l" L                     }6 o  f- e0 K1 t+ S8 [$ j
                 }
6 d) w5 }1 Y8 I! r& c                 if(pvNames)SafeArrayDestroy(pvNames);
. @. ?' {4 V  w& @  P1 v                 iEnumIdx++;2 z. S' ?3 G( M4 ^, O7 W$ q8 H
              }
6 ~- m; `" R0 T- Q+ q            }
8 ~. _* A0 X& f  _$ h# x           if(pClassObject)pClassObject->Release();
( [% A8 Y0 J- W5 C7 }: r         }7 b& h8 t6 g" h( C8 I
       if(pEnumClassObject)pEnumClassObject->Release();
  `- `8 R% f! D% q5 K      }& n- Z5 ^3 _( o9 h
    if(pWbemServices)pWbemServices->Release();
* x0 z4 y$ L- z. w  I1 w# }   }
: h$ X( s! z0 ]1 I+ ]  if(pWbemLocator)pWbemLocator->Release();
  {& M% m7 X) [* G9 f! j2 z}9 P9 x& n5 z3 ]( l6 {% ?; q6 B$ Y
//---------------------------------------------------------------------------
& L7 I8 l" H% R6 _' V- U  Q0 q7 s9 a5 b" p
// 通过 WIN32_bios 获取 BIOS 信息:5 F% l" n' c' J7 H' A- G2 ~# ~
void __fastcall TForm1::Button1Click(TObject *Sender)  n7 N" K$ O1 x! C/ Z- e) G
{
, ?  u) V3 {1 v, m    Memo1->Lines->Add("================== [WIN32_bios] =================");
; J  s2 D- Z% P/ `$ \$ D    GetWmiInfo(Memo1->Lines, "WIN32_bios");
1 K) C2 O& b$ @1 d$ K# G# k: g    Memo1->Lines->Add("");+ w- Y6 e  d; t/ B
}
$ n; B. P8 G( M  X9 P7 i* X0 m. x8 Y$ t/ q- `9 h
--------------------------------------------------------------------------------
3 q: d* A# ?! P2 k. r) X" F5 |3 P7 L+ X
WMI 可以访问的信息类型有:+ F/ F! F& o# o
  Win32_1394Controller
8 n+ Q3 o6 ~) o: L* B* x   Win32_BaseBoard4 E$ G+ {6 k+ E  [% ], D
  Win32_Battery
0 ]$ G& q, f' U, Z8 i9 _: x   Win32_BIOS
/ d& w+ f( Y; }; Z1 l   Win32_Bus" h& {1 f! p, e$ T
  Win32_CacheMemory
, @8 Y& K" D$ @   Win32_CDROMDrive" Y' S, v! d/ K9 P" [: o9 ?" c
  Win32_CurrentProbe- n' V6 ^7 T% y/ u; ?
  Win32_DesktopMonitor8 w* T. f) D- b
  Win32_DeviceMemoryAddress7 u6 z6 v6 S$ x( O
  Win32_DiskDrive* B' h/ S( t9 D" `, v/ d1 N
  Win32_DisplayConfiguration9 t# K' {$ r, A" S% R% Q% {, \2 m
  Win32_DisplayControllerConfiguration
- ], v$ l6 h8 \* v2 c' a6 ^! D   Win32_DMAChannel
  b) ]% Y. f1 j) U( _- R. C$ w   Win32_Fan
! ]9 s1 o& ~2 U/ b/ V8 Z  m2 C   Win32_FloppyController
0 U: ]* `8 @  z# k   Win32_FloppyDrive
* g* I: d. l' ^) l$ P2 v8 ?, d   Win32_HeatPipe% i( n% V1 J% M' Q( l
  Win32_IDEController
; m, B+ c' ]3 u! f4 x- O   Win32_InfraredDevice6 ^$ y  A* c3 u, S+ L
  Win32_IRQResource
$ r& W3 I6 b" W7 J   Win32_Keyboard7 n; f; B$ J8 ~. l$ j
  Win32_MemoryArray
; B- \% g2 [# ~6 n+ k; l  c   Win32_MemoryDevice
" F- H& h, I3 S: H7 e0 f# `   Win32_MotherboardDevice: M1 \6 d% _  D  g0 E0 K
  Win32_NetworkAdapter
6 Q0 t* R7 t! \+ R( D6 q   Win32_NetworkAdapterConfiguration5 K( J( M/ _2 T
  Win32_OnBoardDevice
5 [4 D6 `* G0 }   Win32_ParallelPort
! [) N7 j  B9 [. F0 M3 U% ]   Win32_PCMCIAController
8 \3 A* v+ f: L8 ^   Win32_PhysicalMemory1 @! u, n( X+ `0 p# i
  Win32_PhysicalMemoryArray
2 u- ~5 {6 _% M' c% q, @! Z   Win32_PnPEntity
$ z( u. `; b, y: O# h   Win32_PointingDevice2 _9 \; i1 u# A. a5 S6 K3 s
  Win32_PortableBattery* S! f" Q9 B+ y3 V) ]: ^! l
  Win32_PortConnector
) P" A0 F5 K: {/ H8 S1 C   Win32_PortResource& G. j' T7 d" T; n
  Win32_POTSModem4 r" w1 L7 r4 m9 V! I1 O2 t
  Win32_PowerManagementEvent
) \+ I- l: A4 P: t, E1 |4 E" z   Win32_Printer
: N: r3 `! ~' q+ {0 G1 b6 B   Win32_PrinterConfiguration
6 V7 a3 |- V) |8 R3 L   Win32_PrintJob$ M! F: `4 |  S- u% ]3 q
  Win32_Processor* L# O; x0 {" }3 n. r0 X3 [5 X
  Win32_Refrigeration/ {' r# J" ?9 N- ]9 G- h3 N
  Win32_SerialPort
* k" O! H- |* z   Win32_SerialPortConfiguration
7 h5 U8 D/ V# r( M: E, |1 _   Win32_SMBIOSMemory
. f' D! p" J$ T   Win32_SoundDevice3 h6 g4 c( v! E" r6 b
  Win32_SystemEnclosure3 u- f0 V5 M5 m% D8 ]
  Win32_SystemMemoryResource' j  r7 \& v7 m% G) `+ `# x3 }4 x
  Win32_SystemSlot
1 f6 u* K3 c. n) L7 S) ]! s6 I   Win32_TapeDrive4 R$ ?! x( ^1 [. d4 C( Z$ h3 p1 ]
  Win32_TemperatureProbe" _6 g; H; }( F( k' g: H; @
  Win32_UninterruptiblePowerSupply. ^6 z. b3 ~; T
  Win32_USBController
4 J: c0 }  x' _' c! W, ]   Win32_VideoConfiguration2 Y' H8 y2 Z; M' Y' |
  Win32_VideoController' a* }0 @5 h( q/ G) r0 ?
  Win32_VoltageProbe
5 a) F- B9 d1 }- _0 ~2 k" d# H' `; Z4 C. \  g) S
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-12-23 14:40 , Processed in 0.020018 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表