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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
1 Q+ X( L- J# H3 O; t6 w/ O; f* W" U% t) B$ z) W! K7 o
8 }1 S9 G5 n: t" H# P, x) {. E
--------------------------------------------------------------------------------
7 U9 A! e8 G" sWMI: Windows Management Instrumentation (Windows 管理工具)9 J3 k3 F7 ]$ e9 L; g4 X
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. R7 t: z. {+ L% U9 u( g& P2 O+ L   利用这个工具可以管理本地或客户端系统中几乎所有的信息。) V9 R6 d0 ?, _, R
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 $ o$ [5 ^: }' P) d
# x4 v+ E9 H/ U/ D$ v/ d
--------------------------------------------------------------------------------
' H8 Y7 r! L4 ]BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! O  ]6 i# i* B0 ]) u" @( M# Z: W2 g1 o3 f( K& C7 _
--------------------------------------------------------------------------------2 q  i2 ]& ]2 B0 n$ e( E
① 初始化 COM 接口:
  Z/ L5 o8 C+ O/ O   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 U8 ~  e. g. f, p8 Q0 p% ^4 ^
  这两个函数在 #include <comdef.h> 里面定义。
8 g- ~! a6 t5 c) B2 |: Y
& r. y$ i1 A9 b% M7 Z- L② 获取访问 WMI 权限:
$ g% b& o3 g2 Z' {+ J0 L   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 G0 ~. B# y8 x6 h   如果这个函数返回 S_OK 获取权限成功, 否则为失败。, @. x# j% g3 X+ A" `3 C! B

$ }" W  h. W. ~0 t+ L  ?③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:  W: a/ _2 C1 M7 s
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
9 _* _6 W  p- s& b* |1 L# K0 M
+ O0 E, k! K  ^# _; y" wvoid GetWmiInfo(TStrings *lpList, WideString wsClass). b& [4 N/ z+ B) X1 m* j# \
{2 G  G* K5 s7 Q! a# b3 t6 T
  IWbemLocator *pWbemLocator = NULL;# P; w1 Q3 D7 }! p8 K+ P2 c
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
3 v& n, M6 K/ E, k% c1 n7 L2 Z: T   {* b7 T& z* n5 ?7 N; T
    IWbemServices *pWbemServices = NULL;
8 P( }) C$ @0 i2 q! X     WideString wsNamespace = (L"root\\cimv2");5 x% v( f+ }5 j0 V* A$ H+ h
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 i- ^+ e3 j% T  _7 f7 K& n0 Y      {
8 y! Q5 }- |( M9 m: i        IEnumWbemClassObject *pEnumClassObject = NULL;/ E7 ?! U/ P2 h, q, E( [# n
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;8 f6 I) \2 p+ C, y1 c' R& ?) p
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
, |. L  ]5 |! i% Q         {0 x+ X  I- g2 M9 r( Z
          IWbemClassObject *pClassObject = NULL;
" `( Z  J) C4 f1 I* H9 j           ULONG uCount = 1, uReturned;5 l( e9 z: \  n- x) k" X
          if(pEnumClassObject->Reset() == S_OK)& P  c) f: X$ A2 f( W# F- c: h
           {! i- ^, C( \, h" [+ f: k7 ?
             int iEnumIdx = 0;3 [2 h1 z, p( h8 |7 q6 a0 Z) Q+ D
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK). x& o5 O- P2 X& b6 [
              {7 ]4 H" {! {7 v# B4 S
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
4 M+ t! P! G* i$ n# a0 S
* B4 M  V$ J/ f& n" t& K                 SAFEARRAY *pvNames = NULL;
/ c1 }, r" [  S  w2 s                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* S! }' s# S5 M% ?- ~; k  e8 ]                  {5 N. m1 M0 B9 P" N* _
                   long vbl, vbu;
; A- [9 W) Q/ x* `                    SafeArrayGetLBound(pvNames, 1, &vbl);4 L: w% \6 Z# U6 C# v6 E8 J4 l! i
                   SafeArrayGetUBound(pvNames, 1, &vbu);; B6 x6 d: o  B: c! i
                   for(long idx=vbl; idx<=vbu; idx++), D* u" O  {% x" e# v4 W" Q
                    {# V' Z; X9 m0 a9 L1 z! U
                      long aidx = idx;9 i! ]; C! g# H: f6 Y
                      wchar_t *wsName = 0;! k( g$ R8 @* U0 X: s( k
                      VARIANT vValue;
6 n7 j6 F  U$ v/ G# E7 x  E                       VariantInit(&vValue);0 ?; y+ y# n0 ^: v3 h
                      SafeArrayGetElement(pvNames, &aidx, &wsName);  I- U/ o7 c' ~# r$ J* m

$ i2 @7 y: Q. M3 o" A2 D# u0 _                       BSTR bs = SysAllocString(wsName);' e' o5 p. |2 {3 J! j# u; U
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 J' Y+ {, ^3 m8 ~' o5 b2 {
                      SysFreeString(bs);
* D  N7 ^- d* B, L* }6 R; _/ b2 ]  e5 O& ?( n4 L# V* ^! v, Q
                      if(hRes == S_OK)7 \/ ]1 K" M/ r- k
                       {; P4 V* o, S2 [$ T3 ?
                         AnsiString s;' l: f7 F* P9 _5 Z) c9 I
                         Variant v = *(Variant*)&vValue;2 |! B. |0 x, r) d1 W4 e5 c$ j
                         if(v.IsArray())
9 S; |. Q. \' e% ]& r                           {
6 i' N% |$ v1 j* ^& L1 o                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
7 G$ m6 f6 K+ m                              {: u- W- U' [( l4 p1 Z/ Y
                               Variant a = v.GetElement(i);+ v0 e+ ^4 _) }2 x$ B* p6 b( [
                               if(!s.IsEmpty())
) @& n+ @; f5 b. ~8 `6 a- q8 f                                  s+=", ";; M! l* I0 u1 Y# i8 E5 e
                               s+=VarToStr(a);
5 O* c# S8 C1 g4 b5 N                              }9 c4 W, N5 {! [& O
                          }; C" q4 L" \9 w% f$ B% S' `' z. }+ I
                         else
: m  L7 y; B! w- z. h+ z( R                           {
% e+ q$ N  r  Q+ n8 T) ]; \8 D( l                             s = VarToStr(v);( }1 _' C4 e  n% U$ _- [! Z( F
                          }+ A* w% @* k( Y4 }" n4 u
                         lpList->Add(AnsiString(wsName)+"="+s);
% T! Z* P; A0 _' a9 Q                        }
4 `8 b4 g2 C$ w6 P% n4 E6 P6 g7 `7 |2 q8 v2 g: r2 u
                      VariantClear(&vValue);
- F$ B" W5 u1 X                       SysFreeString(wsName);+ l$ \) ?# [$ W% U: ]9 P+ y
                    }
# }, Z1 E, E6 H+ p1 x5 f                  }9 o/ Q( d$ q! M* M8 a
                if(pvNames)SafeArrayDestroy(pvNames);
) n  c. K1 e' j6 y& }                 iEnumIdx++;# Q# Z9 N* @# I+ a; G' }% k
              }) M# W$ o! R$ q7 p
           }2 J8 H) M) h/ Y1 T
          if(pClassObject)pClassObject->Release();. \7 ~  r3 p& p
        }# ~  G& R8 a& p* \0 Y* z  e
       if(pEnumClassObject)pEnumClassObject->Release();
: F9 X  s9 ]5 {2 u      }' x$ ~0 g0 I- E( i6 y6 `
    if(pWbemServices)pWbemServices->Release();
0 o1 N# {% ?1 a3 J8 t6 G( o   }
9 [) \+ q4 N  W: J3 n" O+ a7 ?  if(pWbemLocator)pWbemLocator->Release();
8 |1 o" H( X) Y}! K. k% l) ?$ y( |6 A. E
//---------------------------------------------------------------------------/ m/ P% K/ b) c9 h' n
, E; m$ W5 S% l+ W
// 通过 WIN32_bios 获取 BIOS 信息:# s$ K- z! f# B# Z( Z, I
void __fastcall TForm1::Button1Click(TObject *Sender), N, a0 S( K/ K
{* ^" J% _) J% ~4 E. N
   Memo1->Lines->Add("================== [WIN32_bios] =================");; a7 @3 W0 V/ p2 ^% W* M9 W
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
, X/ ^' F2 h3 {5 d9 b' s# U' F9 W    Memo1->Lines->Add("");+ s" F' [% ~! B' I+ r: r
}4 F* _$ U. m/ d! k+ n& s

; Z  `6 E4 A; `1 e' J$ x--------------------------------------------------------------------------------
' L. W. p) s6 R; q/ \& y
& a8 H+ |( v/ J" ?, w1 AWMI 可以访问的信息类型有:
7 r/ G" i) S8 I" T. h* A   Win32_1394Controller; N- s# K( X; `9 [# m
  Win32_BaseBoard
" k- ]% Y5 [, W. E' F' z6 O& K   Win32_Battery0 {- u& p6 k! a7 Z/ L
  Win32_BIOS
8 X; Q; d0 O- k   Win32_Bus6 }& c+ V5 T  p0 u# o
  Win32_CacheMemory2 ^  j5 r1 F% M- \: e# e! w0 m! I
  Win32_CDROMDrive: w! A5 g6 ?1 c) s' V  L9 L
  Win32_CurrentProbe
! ~' G+ B* ~7 o) {2 a   Win32_DesktopMonitor
/ M/ m# w& T6 ?1 r9 ]   Win32_DeviceMemoryAddress3 b. ^2 S1 s$ P
  Win32_DiskDrive4 O5 `8 S* e% h9 b& ]4 P  b
  Win32_DisplayConfiguration
" T9 p% G3 _2 p) l/ q: _# c   Win32_DisplayControllerConfiguration
/ p" w- S: W$ k% y( {2 x   Win32_DMAChannel
6 y; I* U; u7 g% N+ K! j   Win32_Fan/ X: F$ B9 {" P- x  J
  Win32_FloppyController
# Q0 G4 A9 q, |3 ?" a. T7 s+ f   Win32_FloppyDrive" z2 C% X2 m$ Z+ ^
  Win32_HeatPipe' B4 k3 K9 V: C2 V4 n
  Win32_IDEController" P, z' _6 o$ J8 k
  Win32_InfraredDevice/ \. z" t2 |3 @4 b
  Win32_IRQResource
: h0 \2 O+ c! U2 V8 h  b+ B   Win32_Keyboard
- ?  Q$ j& Z: U8 i+ N; t   Win32_MemoryArray$ R+ d1 e' t2 R! V; p7 p
  Win32_MemoryDevice" ^3 E' b1 e# B: }
  Win32_MotherboardDevice
* ?) P  A- {0 c9 @& T   Win32_NetworkAdapter) J6 c% a) |8 E' ~& u* v9 ?
  Win32_NetworkAdapterConfiguration
3 }; U8 T! `1 N1 ^) ~/ y   Win32_OnBoardDevice
4 F) A  H' w' T) n   Win32_ParallelPort) d* f  n4 k5 b8 i5 o/ w2 ]
  Win32_PCMCIAController% l# M. p8 N* G8 X4 d
  Win32_PhysicalMemory6 b1 a2 e4 h* O' P
  Win32_PhysicalMemoryArray
7 N7 T3 L6 {6 Q! Y' Q8 s   Win32_PnPEntity
+ b% R8 Y6 @: D, ?3 I4 {   Win32_PointingDevice
2 e2 V5 g% |6 K- O3 E  R   Win32_PortableBattery5 e2 x3 ]( a! f# F& H9 d/ J  ?
  Win32_PortConnector
' b- ], q5 k  ?   Win32_PortResource+ r5 h) W8 o- @) _9 K
  Win32_POTSModem
+ e0 N. o* R5 h. a4 B) u& P2 p, ~. Q   Win32_PowerManagementEvent+ d# y' T+ B  g3 ]) p3 F
  Win32_Printer
  W3 n$ e; o$ Y; N" ]" v6 Q* g   Win32_PrinterConfiguration' y' H& Q" P' \
  Win32_PrintJob
9 m* F1 w- A6 u   Win32_Processor
* N. p6 F0 d1 Q, k7 W3 ~   Win32_Refrigeration% l& l; W2 T4 W' ]1 D
  Win32_SerialPort
1 C5 l3 A# E+ w5 D   Win32_SerialPortConfiguration
) d1 o: D* P1 p! ]0 {) f4 S+ S8 M   Win32_SMBIOSMemory
; {* ?. z7 J+ C' r2 o* R# `) H   Win32_SoundDevice  j* {3 o* @" Q
  Win32_SystemEnclosure
9 I! }7 m" e5 R1 ~   Win32_SystemMemoryResource0 i. k& b, k8 k- }
  Win32_SystemSlot1 A& e! I7 |  J# Y8 W  p* I
  Win32_TapeDrive1 ~4 A) g0 U) E
  Win32_TemperatureProbe
. \% \" v; V  N+ }- L1 b$ Q  J   Win32_UninterruptiblePowerSupply: B" n2 ]* [! t5 ]4 b8 }3 C- a
  Win32_USBController' \* Z! A3 T! y5 t0 x
  Win32_VideoConfiguration7 }# @* a5 Z* q( w7 u
  Win32_VideoController1 {! N4 J5 ?/ w6 ~  ^7 j2 J' m3 z
  Win32_VoltageProbe& W; d2 ^/ l! x) E
& F" a' c. f4 {$ i! B
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-21 01:52 , Processed in 0.020087 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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