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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
" u+ p, l& _) ~" `; v9 r: h; Y
6 H1 a* q8 B5 i9 W# H
7 F# o/ M4 }* H9 y6 T: ~--------------------------------------------------------------------------------/ S9 M- M5 n# X6 v+ f3 r9 ^8 ?9 F
WMI: Windows Management Instrumentation (Windows 管理工具)
+ V2 U3 X9 u  [, }   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 4 r2 @6 E1 e" D9 t) o: X& K, f, a
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。* q5 A7 N- n" t: J) b
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ; v" G- I  ?1 P) E! Y' D6 U! f
' m1 E  I. v7 e/ v; ]$ B3 v! S
--------------------------------------------------------------------------------. e7 U1 O. M6 y  N4 o  R& p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面: N0 Q' x- B% ?, [4 `  Y

( ]8 R2 p! t" a--------------------------------------------------------------------------------- b+ |& q% D1 b: i+ [6 R; \6 J
① 初始化 COM 接口:
, \: }! @' Z- {9 s7 K   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。4 t( x1 s8 ?. j6 b3 U
  这两个函数在 #include <comdef.h> 里面定义。
" \) m9 v( Y7 z! w
/ r! B0 Z0 ]. G% n4 M② 获取访问 WMI 权限:1 E: ?0 M* t% S
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);& q0 X6 V7 z  n
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 D9 |5 Z9 B' P0 z  T
. v% C! U2 k# D0 e4 V③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:8 g) A3 B; Q- n% Z
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。; A0 W6 {; j" _# F8 s$ R; q6 l1 R
& p) K+ _$ I1 c" L( f
void GetWmiInfo(TStrings *lpList, WideString wsClass)" |" A3 q( ?1 g. r0 D0 `# Y
{( b. [/ H; r  R0 L0 Q* k# r* ~
  IWbemLocator *pWbemLocator = NULL;
! l  x+ T$ }% N( M  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)9 l: X* F% x% v8 h
  {/ d" ~8 i" y+ y' V
    IWbemServices *pWbemServices = NULL;
0 Y4 z0 [3 b; Z( K& ?9 @     WideString wsNamespace = (L"root\\cimv2");' Z1 A  b3 P' R1 @8 j* u
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
& P/ a0 v) Z  O$ C5 R      {
2 B1 E  F# b0 K- R" z        IEnumWbemClassObject *pEnumClassObject = NULL;
) a- L7 U! V- O5 t& k        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 F3 ?$ C4 {6 ?3 y% }" c        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK): R# s5 r. a1 L6 Q# d) u- ]! c
        {
% d1 k$ h, O+ s: m* v8 ]           IWbemClassObject *pClassObject = NULL;
% u5 C  m( y! C" U. _2 L           ULONG uCount = 1, uReturned;
" ~; H4 z# H! }2 u4 W           if(pEnumClassObject->Reset() == S_OK)0 w6 u! y1 X* [1 [
           {
& I3 W: T2 H& h- `$ u3 p$ T              int iEnumIdx = 0;$ \2 v0 _2 r6 X7 ?& j. @
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)& O* s5 D$ I6 Q  N
              {
1 r" i% ]8 g$ ~+ d                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
* z. a8 e4 e  H$ G# l1 _) Q+ S1 O/ W% @" l$ a# H" t
                SAFEARRAY *pvNames = NULL;( Y. ^9 K+ R" B
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)( z/ H2 p/ y. g7 Q( u
                 {6 S8 c! X! K; @2 `
                   long vbl, vbu;
2 [" r  G& [8 f                    SafeArrayGetLBound(pvNames, 1, &vbl);
  t' d$ f) V4 ~6 x7 `! T                    SafeArrayGetUBound(pvNames, 1, &vbu);8 J; M" D" s  ?& I- y; f
                   for(long idx=vbl; idx<=vbu; idx++): Z) A. a, x# x1 ~0 @. ^' R
                    {
/ Y  }4 |& V! u8 R7 C* {1 A9 \& l                       long aidx = idx;
9 P) }7 Y# l: H5 T                       wchar_t *wsName = 0;6 }  j, Z  O" V. E; i- T
                      VARIANT vValue;* ?- l3 s$ R0 x7 N5 d. I6 `
                      VariantInit(&vValue);4 q$ T3 N" o, e% `$ F8 o' k
                      SafeArrayGetElement(pvNames, &aidx, &wsName);& `4 ]" e- _* a+ n$ g! w
) z5 {9 w5 a; P% F
                      BSTR bs = SysAllocString(wsName);
. v  B0 ^) o0 {9 k( A+ C( \2 D                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
% K& _) f7 c# R& x1 w9 x' P                       SysFreeString(bs);7 u. Q1 L5 [0 u: X
: o3 [! I+ L' b) p  W; m: R
                      if(hRes == S_OK)( L) G8 k5 o8 I& Y9 x
                       {
' u8 ]4 ]  D5 Q5 `9 ]" m5 R$ o                          AnsiString s;% a7 x8 A8 e, Z
                         Variant v = *(Variant*)&vValue;
0 m9 C% j; W; F5 {4 n& S8 ]                          if(v.IsArray()); k  o2 l# q7 r' }
                          {
' U$ [* v+ d8 h4 k2 u: m- [                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 O) I6 @) j$ p7 I. E                              {
$ B5 V6 X/ h1 i% G# G+ ~0 F1 O                                Variant a = v.GetElement(i);' h6 \; T1 g: G0 e# f
                               if(!s.IsEmpty())
4 ^6 b- Y, }% r# n3 m) G7 N; M                                  s+=", ";
8 Q1 s+ l9 x  B' b$ z                                s+=VarToStr(a);
& U% T0 b" b9 _' r. L$ t                              }
% h8 J: i0 S7 m* S% O1 u% X                           }! `& e6 U2 s- g5 T
                         else
; p  x4 z$ ]8 g/ l, E% _; ?                           {
# d/ t% ~0 I5 ?$ _                             s = VarToStr(v);! v2 `1 F" G* h" K& u0 H5 r
                          }
+ z8 [6 K9 x7 a8 D3 g- l                          lpList->Add(AnsiString(wsName)+"="+s);
, o! j) Y* _7 k+ _, Z1 C0 c! N( j5 A                        }
6 {7 r- }# h$ r  s4 f
7 C4 A, y' ?) f                       VariantClear(&vValue);/ D5 k! p3 N0 Y" Q4 c
                      SysFreeString(wsName);2 ^' _8 e, q# I4 A; b  Q
                    }
7 {/ ?6 }+ N6 c9 X! o                  }
, r/ j  q1 R$ X" w                 if(pvNames)SafeArrayDestroy(pvNames);* D" I1 X) O6 C+ D
                iEnumIdx++;% `9 }! [9 o0 M. G$ l
              }% B$ O) I9 U3 a' ^4 {( s
           }: j0 [+ y$ Y, f: H  m2 v3 }" D% o
          if(pClassObject)pClassObject->Release();
2 z3 h( f' c2 z3 _         }3 H* N1 b4 Z8 b, C) M
       if(pEnumClassObject)pEnumClassObject->Release();4 ]. U: n- \% w) _6 }
     }2 }% V, x! Q: ~2 }% X; c. b! S! c
    if(pWbemServices)pWbemServices->Release();2 R' g- @3 ?6 G/ Q5 `7 o& C" i1 i
  }# H% E4 D1 ~  d
  if(pWbemLocator)pWbemLocator->Release();
, \# S6 E+ K1 r1 a% `+ Z& T}3 I+ h* i: I  V, H
//---------------------------------------------------------------------------( N+ N9 U- w& r9 `/ M+ u! I  o
7 P' _, s  T3 x0 u% I+ ^8 l) [
// 通过 WIN32_bios 获取 BIOS 信息:: [/ V  z: }3 }$ |! c! t" s  c
void __fastcall TForm1::Button1Click(TObject *Sender)
# c2 I1 T2 O- i8 M3 k" n/ B8 B- @{
8 h) _3 Z* T7 L7 t; D) u    Memo1->Lines->Add("================== [WIN32_bios] =================");
; n" d/ ~- [$ v" U9 U* }    GetWmiInfo(Memo1->Lines, "WIN32_bios");# {  F0 p5 [  ]& e& r" f9 X0 R0 I
   Memo1->Lines->Add("");
' n* k+ n* A8 D! F}
6 O" n4 _. ?/ \  r9 |$ G* ^; H9 g! X- K! x% u) U
--------------------------------------------------------------------------------  ^. h* k8 `4 T9 K. K3 h# `

1 C. B6 p' K' T% D4 U& m6 L8 A8 A1 |WMI 可以访问的信息类型有:
' ^1 F+ u8 P, Y6 ~6 h$ t) A   Win32_1394Controller1 @" C+ y6 v' ~4 `3 b
  Win32_BaseBoard1 |4 h3 m- @+ x
  Win32_Battery, ~- z1 ^9 [  L* J4 e) N+ Z
  Win32_BIOS4 g) |8 n: t* C- U0 x- @& h. c
  Win32_Bus
4 r) o  R" F, N& z& h+ |   Win32_CacheMemory. \" H# g- X9 [/ z7 ?! w! l) t6 A
  Win32_CDROMDrive9 G0 ?* ^) L$ x
  Win32_CurrentProbe0 J1 {+ l6 r/ s+ e
  Win32_DesktopMonitor
! x+ }' Z% y7 z9 y   Win32_DeviceMemoryAddress! y  }  G; b9 u- b8 H1 n- n/ F
  Win32_DiskDrive
: N6 d2 k0 W1 u! k+ ]) {   Win32_DisplayConfiguration, V" w% N1 p+ \$ b1 P
  Win32_DisplayControllerConfiguration6 x7 D( i0 q7 ?& ~6 Y
  Win32_DMAChannel
1 [1 u" y6 A3 E5 j3 \) f6 F4 ~   Win32_Fan
5 q( e. w# e, y6 v   Win32_FloppyController# K+ t5 k* W$ o) I2 r2 w6 m
  Win32_FloppyDrive
) I5 }5 [& D1 ?6 D( k   Win32_HeatPipe
1 u. A0 e5 v1 ]' z' p: ^/ V) c3 l   Win32_IDEController
( M1 ~' j" Q& ^! J" Y4 ?5 O& s/ j) v   Win32_InfraredDevice
, U. `. ]8 }) w   Win32_IRQResource
! Q6 U) R# ^( \& s  d0 N   Win32_Keyboard1 p, O# m, x+ J5 _. I3 C. a* ~2 L
  Win32_MemoryArray- z# ^  ~4 X  T) W/ E3 M: [- d6 C
  Win32_MemoryDevice
+ L9 V5 C5 ?! D) o' H; J2 j2 W   Win32_MotherboardDevice4 t; y( N* w1 ?; I
  Win32_NetworkAdapter" _1 e% A- N4 I" ?" Y, z4 ?1 |
  Win32_NetworkAdapterConfiguration, H9 c9 {5 ?+ y1 |) B0 T
  Win32_OnBoardDevice7 A1 g3 Y  H" E, f% |
  Win32_ParallelPort
9 x* T! F: T# ~; H. n; X+ q0 `   Win32_PCMCIAController6 O' ~6 J. Y6 @4 ?: a0 ]
  Win32_PhysicalMemory
9 m2 \% l9 O( d4 \; O5 o* l   Win32_PhysicalMemoryArray! F( j7 o6 _( ]3 _+ W) Y; @# s
  Win32_PnPEntity
% y1 Z0 Z' {+ g& q( F( m6 B1 S   Win32_PointingDevice
$ E0 x# x4 U: V   Win32_PortableBattery) @( |  \+ l' G- Z. L+ e3 w
  Win32_PortConnector
& w; n4 d7 s- F4 x$ l$ T4 Q   Win32_PortResource3 D9 M( A9 Q- h
  Win32_POTSModem+ q6 _8 q9 j! P8 T' t3 K4 U- F; y0 a1 M# B
  Win32_PowerManagementEvent
, T+ @' q; B) o1 e( E   Win32_Printer
" ]! t1 G- o. a% `8 U& d   Win32_PrinterConfiguration
& l( s. E* E; ]7 U   Win32_PrintJob
  J9 p- e$ T, `* q   Win32_Processor7 |- f, ]- T3 q  K/ E# F
  Win32_Refrigeration
: w! M/ f. W7 G% R, ~   Win32_SerialPort
0 k6 E9 L0 b2 F5 D* x; s5 ~) k* H   Win32_SerialPortConfiguration
+ p6 X/ G8 U% J( S" X  t% C; m   Win32_SMBIOSMemory
4 }5 S% F  O0 T9 B& A   Win32_SoundDevice
4 p6 D" |( G  A* l   Win32_SystemEnclosure
1 ~5 o8 U# y! Y( x5 ]! U   Win32_SystemMemoryResource. d7 R9 W0 p( Y' I7 J! |8 z
  Win32_SystemSlot
+ d" h& d; f, ~) a. T, h: p. v: M   Win32_TapeDrive
  {6 T: }0 s2 J   Win32_TemperatureProbe+ J8 l6 r6 Z* V% ~' T9 a, o0 S2 x
  Win32_UninterruptiblePowerSupply
  z$ k; G- W$ r   Win32_USBController
8 F2 w. H, r+ t   Win32_VideoConfiguration  s  C3 g! @  r1 G# t9 A
  Win32_VideoController; o. Y0 ^/ `  C- r& N, L( ]
  Win32_VoltageProbe
9 B+ E2 F6 W, G* [; L. X1 ~8 ~# _
, u/ l+ z6 t, ?9 q& A以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-16 19:55 , Processed in 0.021267 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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