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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
5 }5 s0 Z& |' I7 e: I" \3 t/ q) k/ |+ z* v5 p
8 T. Z2 O: c* J' B
--------------------------------------------------------------------------------
) h4 O" E; [1 b9 G) sWMI: Windows Management Instrumentation (Windows 管理工具)
  l& C4 r6 o, P   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
/ Y2 W$ ?, ?, Z# {0 M$ n; b   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
0 b0 K# |7 q$ ^! _   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 }+ A) e8 [% Y, ^: S! x- S! F( @5 C6 m0 N& Z
--------------------------------------------------------------------------------3 V" D+ e" N5 l9 G; U. e9 U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
/ u0 U$ l/ y9 n0 ?! a9 Z! c6 Y. O# A9 y$ f  |* g0 s0 c  L
--------------------------------------------------------------------------------
, q# A5 k( D1 [' Z! O① 初始化 COM 接口:1 {9 j! T9 l8 y" a* H" A1 T
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
/ C% j" m$ i- H5 ~3 y5 h   这两个函数在 #include <comdef.h> 里面定义。
5 n7 m6 V. F& `; b6 i
$ R% v4 U: n3 r$ ^1 H② 获取访问 WMI 权限:
9 x) B! S& ~8 E' n# S- f" |   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
+ U/ u+ y3 X* @3 g   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
9 `9 o8 g; y/ A9 ~" C
: v; u* T: }) D: @) g8 {③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:: c1 C* H, C" g- H# w  g  F3 e
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
% o2 W' E0 J" ?; W
2 O5 ^* M2 P& X+ d% Pvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
! [3 j2 J' L+ V* z% o& H% u{
+ ~* `/ p) ~4 b3 k$ g( j  IWbemLocator *pWbemLocator = NULL;" z5 Y: v3 x2 L8 z5 f; G
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)# U8 j& o3 ^+ Q0 j
  {
0 Z& Q2 n4 w! `5 b: p9 |     IWbemServices *pWbemServices = NULL;
* P1 X0 _8 }9 |0 x5 z     WideString wsNamespace = (L"root\\cimv2");
1 w4 u9 `0 ?: r* x( v8 g     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 P0 g" u/ b7 K
     {  @7 k. Q; A1 p# e* I4 ~) ~0 u
       IEnumWbemClassObject *pEnumClassObject = NULL;
3 O, @) U, `' k4 x3 k9 G" D        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;0 R0 q( v4 J* |1 |; W; f4 z
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
  _8 |. K% j+ Q2 M) J         {
% V4 j/ y" [" r6 l- {5 n           IWbemClassObject *pClassObject = NULL;9 I$ I* {8 a: c
          ULONG uCount = 1, uReturned;* N/ U0 Y; Z  E
          if(pEnumClassObject->Reset() == S_OK)
/ b8 O, L, i) _- I% H6 u5 s" {            {& c& p% W* [# @/ x0 m$ |. G
             int iEnumIdx = 0;
" E  X! _( l. G$ I$ d( t+ L              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)4 {& y$ E$ B" i" c# \
              {
5 c7 k0 l& ]' q4 v                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ T$ o& a6 y3 }* G
; x( r. ^2 h! c$ e% s" [/ \
                SAFEARRAY *pvNames = NULL;
& i; u$ k8 E- A                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ R4 J$ H6 V9 n/ ?" y                  {
, f3 g- ]" F$ L* q5 d$ f                    long vbl, vbu;- x6 W9 p% @* i- F
                   SafeArrayGetLBound(pvNames, 1, &vbl);
2 E; _4 S/ i# y9 `/ g* p' N4 u                    SafeArrayGetUBound(pvNames, 1, &vbu);
; n  D; f/ `% ~. l, m                    for(long idx=vbl; idx<=vbu; idx++)5 \  [  g2 q+ Y& g4 W# ~
                    {  U- g! y  M+ o, S7 x* {
                      long aidx = idx;
3 G8 }: t* O) z& \& i% v9 E                       wchar_t *wsName = 0;
/ o$ f; K" n2 [  |) c9 r$ m2 ]                       VARIANT vValue;! d3 Z, ?" u' o
                      VariantInit(&vValue);7 N2 U' V+ n5 g2 r1 h& `
                      SafeArrayGetElement(pvNames, &aidx, &wsName);! G, ^/ N3 N. u3 N3 x

5 o9 H  @. ]" N$ T; Y                       BSTR bs = SysAllocString(wsName);/ y6 n7 r3 B. A  q- t
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
* t( I, C  X* w( b                       SysFreeString(bs);
, m  I# y  ~2 n4 X3 n! |1 R3 w, m/ Y- _4 l& ?0 y- [
                      if(hRes == S_OK)' Z$ f; \+ r; @/ r/ }: ^
                       {" \1 m5 u+ ~1 k2 u2 J  l8 f
                         AnsiString s;5 J; b: k: k2 M! @( y
                         Variant v = *(Variant*)&vValue;% T! x5 i1 f$ v( Z
                         if(v.IsArray())
0 v- s5 L& u$ Y' _                           {% S, {. f4 z, e# C" Q5 j
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- i# V0 d/ {5 a0 d0 M, E- ?1 W                              {2 Q+ a& }; `6 Q) j
                               Variant a = v.GetElement(i);
2 t9 {9 m1 I9 ?. t! I- t! p% ^                                if(!s.IsEmpty())
" x9 ~  t! u( T7 Z5 c, [2 m1 U- Z                                  s+=", ";/ A/ n" s, O5 r2 H" u
                               s+=VarToStr(a);6 D; k0 l$ Q, k3 @
                             }
0 {, }- f# {% o: H! Q                           }4 x4 K8 s  h' a/ }) p; }' V
                         else$ l" \, o, m7 h! J+ h
                          {
. n* i- U2 e2 c: t                             s = VarToStr(v);
4 ?$ L, M, q* d' ^                           }
, t1 D! H: |- J# ]2 j. d; |                          lpList->Add(AnsiString(wsName)+"="+s);
; C  C" m" ]1 i6 u( o9 Z                        }8 q3 c5 b4 d) |  p8 c

8 d8 m3 ?% M" c                       VariantClear(&vValue);
, n. @& Y4 s% {7 y$ g9 f2 H8 j  Z* R                       SysFreeString(wsName);6 u6 h1 a! G" Y8 O* Y1 D, {2 B/ v
                    }8 a$ g; `3 Y' k! S( n+ n4 h, c
                 }
9 z+ A7 d  p- [& r* H. |% d( l                 if(pvNames)SafeArrayDestroy(pvNames);8 k+ G" Q: o3 L* H  J3 C8 P" w! w
                iEnumIdx++;
8 g9 \1 ]. C* A, H3 X- i# V8 }               }
4 @" {4 e! B) z            }/ S+ V$ H. e7 o1 R9 k* \) g: Q% ]
          if(pClassObject)pClassObject->Release();. A" k7 Y8 H5 Z8 J' [1 m
        }) I2 U' s: z' }3 d  ~
       if(pEnumClassObject)pEnumClassObject->Release();* g' X/ K9 s; O" q* Z
     }
+ y* {/ q" e" N- k# F: t* S: Y; w4 D5 W2 }     if(pWbemServices)pWbemServices->Release();
' S2 L* L$ ]$ k) N' I" r8 [   }
' k  i" n! m8 d+ v" b3 l' O  if(pWbemLocator)pWbemLocator->Release();
/ w. V4 [$ g, n" e  P) l# z. _}
* B9 T4 F, \' A' \( E1 E" U//---------------------------------------------------------------------------
0 L2 G$ E$ A$ E! c
7 x  m- m" V$ _+ j( d// 通过 WIN32_bios 获取 BIOS 信息:0 ?8 B5 `# H8 k- J4 a
void __fastcall TForm1::Button1Click(TObject *Sender)
* D- W4 }9 }7 r5 _( c7 r7 I{( b. Z8 A( p8 e% Y& A' \: ?
   Memo1->Lines->Add("================== [WIN32_bios] =================");- g6 L0 I7 T  ^
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
$ A$ i5 b! r9 e: N- I. I7 p    Memo1->Lines->Add("");) k4 l1 ?  M) g2 M; h% B
}0 w; D1 h* D' ~, ^! @7 O: g
4 G/ q; k$ c: `# ~+ q4 Y  M7 h
--------------------------------------------------------------------------------
7 h" ?- D1 p) k+ f* T/ u0 e9 T1 x* L( o
WMI 可以访问的信息类型有:
6 v- C6 l6 G: t& z5 `/ W   Win32_1394Controller
; p* [5 S0 f8 b- |   Win32_BaseBoard( ~% T1 w- j1 l- M- {4 `3 }+ {# G
  Win32_Battery6 V/ n6 U1 [/ ^. w( J0 n
  Win32_BIOS
5 V' K9 |9 \( Q   Win32_Bus
; S2 r7 A# C/ |& I  f   Win32_CacheMemory
' T  u2 q: h! Z2 b4 E% @  }1 v) d   Win32_CDROMDrive
" k+ M- J2 A  M! d% b9 Y   Win32_CurrentProbe$ b: a! a( e+ j
  Win32_DesktopMonitor  y% L% F- `) |6 }
  Win32_DeviceMemoryAddress
( x) V' j! o* W5 n   Win32_DiskDrive
8 E( f) {6 e* X  Y- d6 r   Win32_DisplayConfiguration) {2 H$ u+ j; L6 l, V6 a! _  O
  Win32_DisplayControllerConfiguration4 F* i+ j' F2 p  p0 [: a
  Win32_DMAChannel3 h: U; s! A  q, c+ \) w
  Win32_Fan
% g, Z) U# H9 I2 f   Win32_FloppyController# N3 ^" ?- Z  X8 q3 @6 B5 `( g
  Win32_FloppyDrive
. H* V% o4 Y/ i* i7 N$ k+ h# |   Win32_HeatPipe! t. B: B, O% D/ V  m
  Win32_IDEController# p, S/ |3 Z4 E* Q9 [9 v8 u( G8 z# p
  Win32_InfraredDevice
) L' N, `3 u; x) j3 j- j3 L   Win32_IRQResource6 z( z/ r4 a9 u6 b- y4 b
  Win32_Keyboard
) g. x7 L, A0 @% B4 y  i- O9 g   Win32_MemoryArray
) P# i8 Q3 w5 z   Win32_MemoryDevice/ x1 w6 x# J+ q
  Win32_MotherboardDevice$ a7 Z! D3 C, `2 \0 i% m
  Win32_NetworkAdapter9 ^& p4 R: Z( W
  Win32_NetworkAdapterConfiguration; g- R  d) _/ Z5 P/ o4 G
  Win32_OnBoardDevice/ G1 t. s* A, s
  Win32_ParallelPort2 ^1 J& l$ u# k9 Y/ |
  Win32_PCMCIAController% X9 {2 P" `* i5 g
  Win32_PhysicalMemory: M: k2 v& H. g& K9 M! U2 t
  Win32_PhysicalMemoryArray& l8 L" b7 [4 E$ S, E) C. ?
  Win32_PnPEntity( S* _; C/ Z* [' O
  Win32_PointingDevice
% `& z# N$ u" y! Y1 k, }; W$ R* ]1 K   Win32_PortableBattery
$ G  ~$ T0 s/ {) M, c; q3 }   Win32_PortConnector
1 u8 ?2 L7 [: [& S7 T( i8 f   Win32_PortResource
- p: F' b; u+ l0 _4 I   Win32_POTSModem: I* f1 U; k  ~& O5 x1 J
  Win32_PowerManagementEvent
( J# k' Q; e& Z   Win32_Printer
2 A5 s  ?5 w: ^0 K' l8 |1 K   Win32_PrinterConfiguration
7 l8 e8 |! x5 U+ l& A   Win32_PrintJob
! K/ W. d( u8 `0 T) P# Z   Win32_Processor
6 w4 s# ^! d, ~   Win32_Refrigeration' Y- N1 N/ Z* I8 C1 o
  Win32_SerialPort( @0 l% T$ H# R# [5 S+ F9 f3 ^* z3 s
  Win32_SerialPortConfiguration
7 ~( z4 W5 d% `' Y( f   Win32_SMBIOSMemory
* j$ K0 M! N% r: [4 s   Win32_SoundDevice9 ~3 ?2 j, a0 M) F0 M7 K  D5 @/ e
  Win32_SystemEnclosure# D7 I/ ?* S! J/ h
  Win32_SystemMemoryResource+ i9 ]" k, H; p" X: k+ {3 X
  Win32_SystemSlot. {9 k; g  t: x: f, s0 E" j
  Win32_TapeDrive5 H6 I, t! y: b: ?  P( m
  Win32_TemperatureProbe
, z6 T3 [* n8 x' ]) x7 a9 P5 C   Win32_UninterruptiblePowerSupply2 M- [; l" j0 n& T' W) |8 p
  Win32_USBController6 T$ S1 B& B, a* T: b& \8 X
  Win32_VideoConfiguration
  T9 h) F4 M( u0 X   Win32_VideoController( ]' G( y' O, H# @
  Win32_VoltageProbe8 l6 j4 q! n0 h( _( T' f0 u

+ z. H/ M, t' W" z5 V# H以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-30 14:10 , Processed in 0.019195 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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