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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者): F6 \1 b+ o: ^

* U% z6 N1 m' E4 f/ y) d0 e" i/ a/ n
--------------------------------------------------------------------------------" y4 \4 k8 y6 j/ d
WMI: Windows Management Instrumentation (Windows 管理工具)
; N9 L5 V5 ]: q) D4 Y0 b   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
5 {/ \6 P* J+ d" X9 @   利用这个工具可以管理本地或客户端系统中几乎所有的信息。) ~+ _+ `  l3 Z4 j- O
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . N, E/ f- ~( N4 J

1 @; @1 E- C5 e5 k0 e--------------------------------------------------------------------------------
1 R+ h, ~8 a$ c& q, t. N$ y$ _9 qBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面. E7 i* Z( ~3 m$ G2 u+ R3 k
6 _: q7 z, K$ z7 M1 V5 a7 Z
--------------------------------------------------------------------------------: Q' X, ~1 w8 w( t" [, \6 x; j- l
① 初始化 COM 接口:; f' `- J( u' N4 _. j& @  Y5 ~' U$ f
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; u7 C5 f/ d/ ]0 o3 Q1 K9 ~   这两个函数在 #include <comdef.h> 里面定义。
. F: R/ k: [' f
5 s) O- A/ h$ w' r% A9 ~1 k5 r3 }: ?② 获取访问 WMI 权限:9 W/ ?: S" l/ v$ l( U& N
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, Q* F1 @9 e5 C. f- i( ]( `( F% ]
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
- D: y0 {& g# E3 ~! T& _7 e; |0 s8 W( W2 q" x
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:/ X  v) I# ^) z
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
' V$ o7 I4 G& n( q" c' q* O3 |2 _. C) G3 g2 [% K
void GetWmiInfo(TStrings *lpList, WideString wsClass)
' T# t* j6 R  @" R{5 y" O6 h- m0 f- z/ i
  IWbemLocator *pWbemLocator = NULL;2 S! U% k* }9 X/ g3 e
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)0 y1 a9 o- M$ z% o- B  a
  {1 E% B$ T$ D3 l' O7 z, F% u
    IWbemServices *pWbemServices = NULL;" j& m$ b0 b9 X: r6 x
    WideString wsNamespace = (L"root\\cimv2");/ y2 ~+ }! {  _0 J+ a
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 r5 F# e$ [; f, ]/ C      {
* O! s: `4 T* T        IEnumWbemClassObject *pEnumClassObject = NULL;& W1 c4 M2 f( m
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 J6 Z- l9 h8 \. o7 W3 W) O        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)3 d  X- `+ c" d0 G  B( A% V9 V7 z
        {
$ T, {+ Q' u& c& u( j6 M7 J           IWbemClassObject *pClassObject = NULL;
! G' ^2 q, b# V! p. ?( M) k; z           ULONG uCount = 1, uReturned;" H( a1 t& [; A% f( u8 Y; G
          if(pEnumClassObject->Reset() == S_OK)' k4 ]4 H0 ~2 V% z8 h3 F
           {5 j4 z7 k! q9 A! `. V% d% q
             int iEnumIdx = 0;
; G% x3 h: x8 o. `) g8 `              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
; r5 ~+ j. E: A& ~: l, ^               {
, z$ E4 d, M# Y# B& p% P9 r0 l                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");) y. A0 ?1 y+ r, Q& v# F1 i$ g; \
+ ~+ y* W7 X9 f0 j! G* q. T
                SAFEARRAY *pvNames = NULL;) X  k- P+ W: f; F
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: Y0 z& s! q' C6 z                  {% M- Y& r0 y6 {; g; [+ d9 L6 J
                   long vbl, vbu;9 J9 L3 i; j. R6 O6 M7 X
                   SafeArrayGetLBound(pvNames, 1, &vbl);
. ^& f# Q* j# ~: N                    SafeArrayGetUBound(pvNames, 1, &vbu);
9 B3 y+ j% O* ]) |$ B                    for(long idx=vbl; idx<=vbu; idx++)
) E) |3 F& F5 `1 z8 e$ x* Z                     {
' d5 P" X/ c/ C) M  h# H                       long aidx = idx;
2 f1 B" C0 x8 l, T; c                       wchar_t *wsName = 0;
$ a/ |: [2 Q7 I- r8 _6 O3 A                       VARIANT vValue;
8 }7 f5 u  \4 P1 E: j                       VariantInit(&vValue);
9 q+ o, w! \% R7 T0 {7 z( q, \                       SafeArrayGetElement(pvNames, &aidx, &wsName);
! I* \' l0 p( t# y2 G: ^2 l$ C2 F# Z6 @% r  V5 T3 \+ K' _/ q+ s$ a
                      BSTR bs = SysAllocString(wsName);, H# @3 w/ V2 t. y
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);5 J% q7 W7 c0 e- y. Z
                      SysFreeString(bs);" P7 x# h% p. H' p! u( b+ Y" u8 ~) n

9 b# i0 G; @' W* x1 x                       if(hRes == S_OK)5 i) t; {) A% I* G4 e
                       {  n- Q, b7 L! H
                         AnsiString s;/ w+ b& r- ^( K$ R# ^! a( B$ q) G
                         Variant v = *(Variant*)&vValue;) {% O. [" l9 \$ N% {
                         if(v.IsArray())2 c5 f0 O- P( b: j! n+ r1 A
                          {
+ G4 Y. _  [1 ]" a* S; i) {9 ?1 P                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)- R! [$ [. |3 H- T
                             {; U) i5 L5 p7 v/ N- ~" ~
                               Variant a = v.GetElement(i);$ A; R6 t0 E) o8 [
                               if(!s.IsEmpty())+ u! Q$ a/ i/ }) O
                                 s+=", ";
0 V; s$ @. K5 C8 n/ c2 g* ~! B                                s+=VarToStr(a);
. Q/ r1 T% D- m  g$ L                              }
; f% f& h* G1 g5 B$ [' D                           }: F2 a2 Z+ B2 Q0 {6 O5 E. c
                         else
) A2 U9 p# I* G2 P) Q                           {0 e2 O8 g% O" S/ }
                            s = VarToStr(v);3 ]. z1 P. w, X# r& T0 o4 A& G2 |  m
                          }
, `/ l2 ]( h( S9 }% _7 u                          lpList->Add(AnsiString(wsName)+"="+s);. e* a, L1 ?" ~' D
                       }
$ s2 a3 z4 `# Y1 ~) P0 z
* v3 Q" h) j" }" S1 f                       VariantClear(&vValue);9 r- O2 d7 h8 }6 g
                      SysFreeString(wsName);9 a3 u: |( [. [: G' u0 {& v
                    }* f  E+ B  }& ^0 [; C$ x6 z
                 }
! o+ D2 @/ c/ `7 C9 K                 if(pvNames)SafeArrayDestroy(pvNames);1 g3 F3 g) A! j7 c1 B7 b' G
                iEnumIdx++;" `# r* s6 M' J& w7 k
              }
  e, G3 r# \; |. P2 i            }
6 o. p8 J' G  L           if(pClassObject)pClassObject->Release();  g9 _/ f# \+ o+ L3 U% l
        }$ r- v: a: }& N+ T5 j7 J6 ?" }! N
       if(pEnumClassObject)pEnumClassObject->Release();" O6 h' A8 x6 M% q0 e" ^: p
     }: n2 I6 K& U7 G0 V
    if(pWbemServices)pWbemServices->Release();
/ x$ a& @& \8 K  c# A   }
" g' D0 j+ R3 B7 ?  if(pWbemLocator)pWbemLocator->Release();
, ~/ H+ I# N2 O}( E1 O8 a$ H2 a. J: u: V
//---------------------------------------------------------------------------
$ Q) V8 g) W% I9 R( r8 E$ N( n8 A/ V3 u+ X( j: V" }
// 通过 WIN32_bios 获取 BIOS 信息:9 d/ m$ C6 o2 Y
void __fastcall TForm1::Button1Click(TObject *Sender)
) \' z% J% k% j+ D{/ b! F4 f* ~& b) q: G
   Memo1->Lines->Add("================== [WIN32_bios] =================");# G5 [# d7 G1 C% V6 p% r* W6 z
   GetWmiInfo(Memo1->Lines, "WIN32_bios");4 A; Q( S- w+ y# X; a; t4 e
   Memo1->Lines->Add("");: w8 y" {& ?) U2 L+ A- z0 I% w% P
}
9 [3 u! S3 d; ^* P- |9 ]! P, |7 A& \& R
--------------------------------------------------------------------------------
# Q3 V0 P1 D$ [  B  j$ _, u) u/ U' E  y' J8 k8 G
WMI 可以访问的信息类型有:
' v  g! w4 `. J" f; B   Win32_1394Controller
& I9 K* L) o3 f. `5 Q   Win32_BaseBoard
/ U3 D: C" G  e- O1 P2 W' ~   Win32_Battery0 q- L1 a7 Y, _' d- `  v8 S6 R
  Win32_BIOS
& ?4 `6 r6 L- h   Win32_Bus- o  c7 g* C5 l# D  t/ M
  Win32_CacheMemory3 @: @4 u. ]8 Z. {# Z
  Win32_CDROMDrive
. Y+ ^, `* x( F9 G$ B   Win32_CurrentProbe- Q& q3 F: I( ?( Y
  Win32_DesktopMonitor
9 l+ `6 _, E- i; i2 a   Win32_DeviceMemoryAddress. ~$ o0 t4 |: G
  Win32_DiskDrive
8 r8 _5 x, O3 _. w/ S6 }   Win32_DisplayConfiguration+ e% a9 t% N2 r5 b8 U7 s
  Win32_DisplayControllerConfiguration
$ o7 u6 l* Z! O* F   Win32_DMAChannel6 U1 Z& t+ x( J+ E
  Win32_Fan# r6 Y/ M. Y4 f1 |9 e
  Win32_FloppyController. r* e; y# A: S/ K% B7 e
  Win32_FloppyDrive  m% {% w3 h; r; R- X
  Win32_HeatPipe
/ [6 k7 ^5 ]5 d   Win32_IDEController7 ]' \7 g7 V8 s7 K6 D3 U1 ?
  Win32_InfraredDevice
8 F6 X* B: }  O8 P   Win32_IRQResource
+ A: [: I% I! b, i( V8 I/ c   Win32_Keyboard
1 u( E4 k4 ]  `% O- t- H   Win32_MemoryArray# {$ a. U& o+ e, C/ J+ H% k
  Win32_MemoryDevice
9 _; W( ?4 v9 H$ R+ I1 Y# T- }   Win32_MotherboardDevice
5 w- V: V9 B6 w2 I/ b   Win32_NetworkAdapter7 o: N% y8 K6 U( ^; j
  Win32_NetworkAdapterConfiguration
$ C6 j) |% V$ E2 }   Win32_OnBoardDevice! B. u: l6 h4 [, ~+ N: @2 ^
  Win32_ParallelPort; L8 W8 g$ B; o8 o( O( D& R
  Win32_PCMCIAController
8 G* u/ V7 h7 q   Win32_PhysicalMemory
9 S" ~2 y1 ~& s   Win32_PhysicalMemoryArray
) M5 l" o" Q) w4 ]; o/ E   Win32_PnPEntity0 n9 T# d$ r) A' N0 R
  Win32_PointingDevice
; F) s& M( b4 P4 B   Win32_PortableBattery
* T  w( L& ~2 ?% |. u" Z   Win32_PortConnector
2 R7 W2 [; C+ n$ I  U) o' r   Win32_PortResource' ?& k% F4 \0 b/ ^0 j3 M
  Win32_POTSModem0 L. e4 Z/ a- p7 N1 c, A2 G
  Win32_PowerManagementEvent3 z8 d/ c  o% B
  Win32_Printer
" }& o) }/ r* ]   Win32_PrinterConfiguration/ a5 w; Z3 U6 z$ ?' f; j) c4 m/ k
  Win32_PrintJob) ^% }% t; m0 K0 Q! w; R
  Win32_Processor4 J! Z: u% p& O1 j  U5 D
  Win32_Refrigeration
8 }% a% g2 U6 w9 ?   Win32_SerialPort$ q1 ?: ]$ b$ i! w0 X+ h
  Win32_SerialPortConfiguration
8 X0 R$ \8 E2 U1 B5 }- z   Win32_SMBIOSMemory
2 \1 c7 J0 |& o5 P9 x# b   Win32_SoundDevice
1 c% v% \1 w- Y4 S% D) Z/ f+ i0 o   Win32_SystemEnclosure
6 u/ U) m; A% i' B4 A   Win32_SystemMemoryResource
/ F0 J; ?+ q: }& k7 f  W" P2 V- B& N   Win32_SystemSlot! v& y# y+ E/ M( M7 u
  Win32_TapeDrive; m* o( v0 Z: G& ~! B
  Win32_TemperatureProbe) N) O  d8 ?5 n4 {7 Q) x" C/ y9 \
  Win32_UninterruptiblePowerSupply( U" A$ }1 b* E# P
  Win32_USBController
* J7 V2 C; [$ x% l   Win32_VideoConfiguration: b8 `& h% C, J- w" q
  Win32_VideoController+ M0 T1 U) F* [. e1 b
  Win32_VoltageProbe" f- O  C# f$ v

8 `, F5 t  a2 v9 x; u以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 14:24 , Processed in 0.014898 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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