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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)9 N$ g, Y  ?2 e8 X. u5 `
1 @9 h& G! ~& Z+ B) N# \

; M. G4 z! ]8 j% |" [6 E--------------------------------------------------------------------------------
2 O0 g9 f. l; BWMI: Windows Management Instrumentation (Windows 管理工具)* U" g2 b& k" p+ Q
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
  _3 E; ]6 I' ~   利用这个工具可以管理本地或客户端系统中几乎所有的信息。  g3 C: J% j. L* H# c% y
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
  K5 K7 L. e  O, B' Z" X  a1 Q+ w- I8 v
--------------------------------------------------------------------------------( ~4 a6 ?- D! g& A0 s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面5 r% Y) Q9 X, A5 G) I
5 J  o) r7 G  ?- Y- m
--------------------------------------------------------------------------------
% G9 |. x- I; P! B4 k, k① 初始化 COM 接口:
) M/ e* G5 e7 ^) W# [5 ?   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。% [' g: o! B; u: K1 F# {
  这两个函数在 #include <comdef.h> 里面定义。8 w' f, Y0 r9 b/ r  j$ X2 p

& n1 }* n/ r6 R) M$ {② 获取访问 WMI 权限:
* o! n& ^/ x0 ?$ {  w- g   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);: T( j% D7 `3 q7 d
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。- b. q: _  B* [5 ?5 p5 l

6 I6 F7 J% R* O" d$ X; G③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# m) J! E. T7 D% y4 z5 K* y8 |1 j) u   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。& p7 Z# l1 M3 l4 v1 s
, p" [# ]; F4 Q" k1 ]
void GetWmiInfo(TStrings *lpList, WideString wsClass)* }2 \9 h; G& v) g+ ]
{
* f$ p+ B' ]& C7 u1 }* z9 X5 c  IWbemLocator *pWbemLocator = NULL;
! N$ W% ^) d- Q* R3 l4 N3 e  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( B# i5 |, @9 H2 O/ v9 R   {  v* K$ H4 V1 h+ P% T  N8 z) W- a& t( c
    IWbemServices *pWbemServices = NULL;
6 f1 n% H+ k* J     WideString wsNamespace = (L"root\\cimv2");
3 w2 h5 K$ b/ l% E- P     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)' ^6 F0 ]0 x; h7 w0 x  q
     {, H0 K) r' X3 m- a0 q9 _
       IEnumWbemClassObject *pEnumClassObject = NULL;
9 O% Q# N! U7 e/ U, t! w$ D/ D- [2 Y        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
& G6 N, \, q/ x) U' ~        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
, k: z) A7 @/ ]2 z% _! @         {! A' O. I( W5 L5 E
          IWbemClassObject *pClassObject = NULL;; E9 e+ R& r1 O3 ]+ M, \$ H
          ULONG uCount = 1, uReturned;( f$ ~* ~' \6 y# T$ E7 f
          if(pEnumClassObject->Reset() == S_OK)) A, z& \0 H' ?
           {' v' U1 _, W( r: [. m/ z2 m
             int iEnumIdx = 0;7 U" F1 _* z; ?# B& O; `( b  a  G
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
; S, P1 y/ x8 D3 k: O               {: |5 o  ]1 K% Z) y4 Y+ Z
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
  t' g( F! [  |1 p, h+ [' |5 B2 t( P  k
                SAFEARRAY *pvNames = NULL;
$ a" T. p. Y- q1 F: J) n% t5 |. B1 E                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
; _8 J6 |2 {- @) S' A                  {
3 i9 H, a) P) r& o6 O$ [! F                    long vbl, vbu;0 l4 R! F& ]( K, F5 _; R
                   SafeArrayGetLBound(pvNames, 1, &vbl);2 r' u& V2 y) ~1 i
                   SafeArrayGetUBound(pvNames, 1, &vbu);
2 o8 O0 V( P% y! x+ A6 z" U                    for(long idx=vbl; idx<=vbu; idx++). t' u( H) U: [9 Y  ]  a
                    {) V  f" Q1 @3 h' f( M8 F
                      long aidx = idx;* l2 n9 k8 ^) y1 y1 E
                      wchar_t *wsName = 0;
+ w3 ?; i5 j' {: L                       VARIANT vValue;
0 r- U) e7 L) b1 @% A$ q* T* A2 a                       VariantInit(&vValue);
0 n- ]$ u, c2 M5 ~( ^2 V                       SafeArrayGetElement(pvNames, &aidx, &wsName);( s% i" |+ T+ }9 H0 d3 u
' L: C5 `8 }" T
                      BSTR bs = SysAllocString(wsName);
3 S% g, R" f1 L5 g: s                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);. h- {: p" Q! g
                      SysFreeString(bs);8 k& g* N, u3 `' ]# G3 p4 z

# }. i) v1 `* r( h6 I. a                       if(hRes == S_OK)
% E8 `, ]2 t; O8 J% T% D                        {
# s8 B* j! V- P/ b6 s: t4 M                          AnsiString s;2 F9 }& t1 v# @, E: [9 \, j
                         Variant v = *(Variant*)&vValue;7 V9 O2 a  ?: f- T* s
                         if(v.IsArray())3 B7 ^  ^$ P, C8 F) }* N5 A9 p2 r
                          {
: v% b+ l# q& w, e                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
+ p0 q4 w8 E( Z- m                              {
0 _0 V4 j: y* t( P                                Variant a = v.GetElement(i);3 r3 D5 q! M7 \, Y% `
                               if(!s.IsEmpty())
8 b) z4 z' A5 ]: i& G8 e! Z7 w: d                                  s+=", ";+ ~, [+ {- G% {2 i9 k) C
                               s+=VarToStr(a);
2 Y' b% v# |* k7 k% {" @                              }
4 M- O+ h8 L, U! Y' l- E                           }
, H# P: I+ ^7 j  Z# w                          else0 J* i+ |5 ~2 Y3 ?& @" e
                          {9 C, E9 G& @4 A4 K
                            s = VarToStr(v);
, a( k  L* z. s- T4 q1 d7 v8 N                           }' x& w. s; Z+ m' d3 @
                         lpList->Add(AnsiString(wsName)+"="+s);: V9 C% h4 }0 X5 f* Q0 t% A9 D1 j, d. l
                       }+ A8 `4 g- [' [$ i" C
" B2 ]1 \) s+ v
                      VariantClear(&vValue);: P" j4 I; E, T7 U
                      SysFreeString(wsName);7 ]. I9 c5 G# Q4 w# a5 |$ y/ O' w
                    }2 z; [% \- X* S5 q, s4 ?! l; V' O- s
                 }
; E' O  S7 k+ G                 if(pvNames)SafeArrayDestroy(pvNames);' S: @& z: |9 A
                iEnumIdx++;
" V' X8 {2 K6 i; W! W0 [4 L# {- v               }2 \. e" L# q( N3 G& v( F
           }1 b) S5 p7 K4 g/ ~
          if(pClassObject)pClassObject->Release();
  P6 ]4 B5 }' t; P         }. @2 ?  m% F8 }- O* C( N6 T( A
       if(pEnumClassObject)pEnumClassObject->Release();
: Z" S1 L1 |7 j5 g& b, s      }- A. j* W) _2 {/ h5 b( x. L
    if(pWbemServices)pWbemServices->Release();
. n# c, U, a' g5 ]4 Z! d   }
0 d; U. ?6 h* W" U# n  if(pWbemLocator)pWbemLocator->Release();
& ~5 O. G' H* z+ E}* V1 `( V8 m( a* z
//---------------------------------------------------------------------------
0 u" P- [+ T% }( g3 C' V5 I: s/ ?' p: j
// 通过 WIN32_bios 获取 BIOS 信息:
( O- N2 b  U" S, s2 ]void __fastcall TForm1::Button1Click(TObject *Sender)& U" k5 Z6 {0 {% n) w( \) N7 U
{
* A( K8 z0 I7 x3 I' c  A8 M    Memo1->Lines->Add("================== [WIN32_bios] =================");
4 n0 h3 {% N; M. ?- f0 ^. `: u$ p    GetWmiInfo(Memo1->Lines, "WIN32_bios");
$ P* s3 I  X7 s$ \    Memo1->Lines->Add("");
" z/ D  h2 D7 F}# A8 {) A. @. o9 u' c

1 d0 R$ u; K+ t6 B1 c1 D3 W- w--------------------------------------------------------------------------------
' a/ |1 F7 A0 `& ^5 r' v3 j
9 J$ \9 c& H8 c# nWMI 可以访问的信息类型有:
) W3 f9 W# B+ l5 {   Win32_1394Controller+ T. `0 c5 ]. _. W. X# D' k
  Win32_BaseBoard6 }! r: M* F6 m- _  L1 U
  Win32_Battery
/ y( }. P  r% z) n7 n, Q9 U! g   Win32_BIOS, ~1 c" O# K" s$ J$ Z/ L1 o( C" k
  Win32_Bus4 U# ?5 }" p% A9 z$ O4 Z
  Win32_CacheMemory! v+ A/ N; F% V- p9 `
  Win32_CDROMDrive  n' p$ Z2 i; I$ \- H
  Win32_CurrentProbe
1 u. d$ E1 s3 B  U3 r   Win32_DesktopMonitor" b6 m" F  c) z2 _) _2 d7 [8 ?/ i
  Win32_DeviceMemoryAddress
2 R# ]9 _9 e" T5 y% b7 Y- a   Win32_DiskDrive
0 T. O, E  }/ c! N  e   Win32_DisplayConfiguration& ?1 R: U+ M! I5 H  }! ?1 I; m
  Win32_DisplayControllerConfiguration
# I) \% I, Z3 X' E, A0 R8 h   Win32_DMAChannel
) F% N( w2 ]$ l! S8 [" ?   Win32_Fan9 B- P: f: w  P! _7 f
  Win32_FloppyController$ s5 w/ W$ C; L! d* _9 Q0 }
  Win32_FloppyDrive  O+ R9 X, ]/ ]9 e. Y, A9 S7 D
  Win32_HeatPipe% Y! x7 Y9 q) T) _- ^, t
  Win32_IDEController
* D: c9 l8 X+ T2 f' Q  U   Win32_InfraredDevice
0 H/ }0 c5 B" R( l2 e   Win32_IRQResource
4 C) l9 T$ U( q& H   Win32_Keyboard
4 u0 o, Q" b) e' L( o   Win32_MemoryArray
& w- V+ T8 V7 Z+ i   Win32_MemoryDevice
* N6 O7 G9 W+ A: g7 U0 p) V   Win32_MotherboardDevice& K3 h* ?% P" ]: n) O. ?0 P
  Win32_NetworkAdapter  E5 F6 u7 G) g# q9 x" m
  Win32_NetworkAdapterConfiguration
2 x4 H5 s$ f! K# ^* K4 d, Y   Win32_OnBoardDevice, u( i0 P/ G' }6 t. Y! V
  Win32_ParallelPort
  o+ h1 l% v# j' D6 M  c8 A   Win32_PCMCIAController
; f0 q; q& u9 k& i4 a- {/ }3 a0 H   Win32_PhysicalMemory4 ^1 O3 d) B' N- F' Q7 `4 A# s
  Win32_PhysicalMemoryArray
% F% q2 x  h- w( C   Win32_PnPEntity0 V+ `+ P& j1 X. d
  Win32_PointingDevice
6 P- j/ v1 f- |. u7 r3 D   Win32_PortableBattery
( [/ y% V$ `1 D5 v2 {" _   Win32_PortConnector
. o( E- B+ }2 A3 s' L5 ?( |5 t& G   Win32_PortResource2 M9 ?5 w+ u- k' B: ]' n
  Win32_POTSModem1 H# c# |& S$ I7 D
  Win32_PowerManagementEvent
0 z: K. h1 Z: j$ _1 n' I   Win32_Printer
8 D( q* z6 N7 r* M% m   Win32_PrinterConfiguration) A' [+ D7 L. f9 X9 k; K
  Win32_PrintJob
; z) q+ Y, E2 _# G" H' e% s   Win32_Processor
/ d$ h) d) c8 M' U( Z   Win32_Refrigeration/ L* b1 l. ~+ e9 O
  Win32_SerialPort5 C* ~+ Y+ C8 k' w# i
  Win32_SerialPortConfiguration
. f+ R5 ]! i: C   Win32_SMBIOSMemory
; a2 u* ?9 b# ^9 Z. G   Win32_SoundDevice
# t9 d6 n# E7 P. g9 \   Win32_SystemEnclosure8 p$ z2 p3 e5 h1 Y
  Win32_SystemMemoryResource: [" k+ ?- k9 f! K& V- x
  Win32_SystemSlot
1 a- y2 d' d2 ~' o; k5 b   Win32_TapeDrive1 ^6 n) I# S* l+ e
  Win32_TemperatureProbe% C) K) L/ l, K' e" A
  Win32_UninterruptiblePowerSupply
; w- ]2 N+ ?( \' B" l3 D   Win32_USBController
: }' Y9 @  J0 Z$ V* y2 P   Win32_VideoConfiguration
; j2 C% N$ V4 m" v8 }   Win32_VideoController
; g  C3 e, m7 w8 g) `/ i1 J   Win32_VoltageProbe
+ T, k( E4 N  n  q7 C7 G4 _% O& ]/ `2 n/ b; T! ?& J
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-20 11:45 , Processed in 0.021262 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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