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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
3 i- A0 r9 `0 |  d, K: _0 H. m/ \7 S3 t+ E
# {  `0 w- Z6 r
--------------------------------------------------------------------------------
0 f8 _+ V( ]" Y: j+ u, `6 E  A) tWMI: Windows Management Instrumentation (Windows 管理工具)! M) e4 c( z$ O4 ~/ K& V" W: G! W# z
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
  H+ q+ \, X% Z, K4 Q   利用这个工具可以管理本地或客户端系统中几乎所有的信息。! b, T2 e/ A4 c# a: I
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& f6 _* {' }- M6 h' L( P! l) ?% g; X! R2 N3 d; V- T
--------------------------------------------------------------------------------
5 Y/ }( t7 P. b8 d; d0 ^0 h, T" V; ]BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( U9 \; ~* z0 a9 Q- z) O3 j) g% l1 z
--------------------------------------------------------------------------------, j( F( u% o& R
① 初始化 COM 接口:
7 H% t! f3 l) {) C   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。' V" ^5 [7 m7 K- I5 P  m3 Q0 j5 G
  这两个函数在 #include <comdef.h> 里面定义。
# ~8 X( W4 V. x5 P1 D5 b
+ R' ?' W! e- f② 获取访问 WMI 权限:
' e  |! @% D- H8 |2 N/ ^, {4 v4 q) h# S   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);! r$ E6 x; u. v& e$ f; g+ b5 ^# N
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 j% n# j: c) t" w8 N) ~! L' a: _. x+ H2 N  p2 b+ i& h( p5 P
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. _" \: p3 u5 v( }, _7 U6 q7 P   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。: M6 Y/ u. ~/ J7 M

4 S1 [2 q% g% ?7 avoid GetWmiInfo(TStrings *lpList, WideString wsClass)
6 \6 b9 X0 `6 ~2 ]4 o# x" Q8 F{
# ?: `1 x- G) g$ F; T2 Y) a1 N6 h  IWbemLocator *pWbemLocator = NULL;
( e9 G/ r+ {; g* y, d1 g7 y  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)+ {4 a8 q* ]4 _* s: i" P6 m
  {' D4 W1 d8 E  N# t2 h: ^
    IWbemServices *pWbemServices = NULL;* w) ^! Q7 j! t8 o! D
    WideString wsNamespace = (L"root\\cimv2");( k5 e7 ^: z* `+ r7 M
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)5 H. i8 @. }6 ^6 z
     {' z' s+ K3 F6 ~+ Q
       IEnumWbemClassObject *pEnumClassObject = NULL;
0 H- R8 u( B. |# v0 A        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;  l/ ~! V( S  [/ \, n$ t
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  _7 u  j) W7 v2 `
        {5 T+ _$ H2 f0 U4 Q+ ?3 Y0 d
          IWbemClassObject *pClassObject = NULL;
8 e$ y2 K+ W  S- M4 }           ULONG uCount = 1, uReturned;
# Y, z& C7 B6 x5 G. X           if(pEnumClassObject->Reset() == S_OK)
2 x% k0 s) `4 i( L            {4 {1 U0 z/ G7 L9 {, b7 V
             int iEnumIdx = 0;- d. b; V: X1 `
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
9 @* q: I& x' Z' h( j               {
* W5 F+ b5 |4 r; ]/ b* E5 B; e                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, Y% I  V; [2 v4 \5 ^* `3 L1 ^" Y  w6 ^5 A$ s! O
                SAFEARRAY *pvNames = NULL;, i8 }' L& V+ U+ p" ~' E  ]+ p
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)- y( {& q0 ~4 E1 ]
                 {4 E# u3 e6 x) X* ^; }
                   long vbl, vbu;) Z: o: c3 _$ W& _+ ?
                   SafeArrayGetLBound(pvNames, 1, &vbl);+ m: A$ C6 j& B( _# H% D
                   SafeArrayGetUBound(pvNames, 1, &vbu);0 y6 B9 h1 I- T5 p0 e* Q
                   for(long idx=vbl; idx<=vbu; idx++)/ @9 C: E6 E4 v7 a/ {
                    {
5 o0 x7 W; _5 \, C: v& g                       long aidx = idx;
' b% [# A. {. l( T# z. ]; p                       wchar_t *wsName = 0;, _, ?. ^! {7 O) S+ c
                      VARIANT vValue;* G# p& X  q% P3 g3 z* h* s
                      VariantInit(&vValue);
3 h- L5 L/ u! w- h1 p* ]$ [                       SafeArrayGetElement(pvNames, &aidx, &wsName);; b9 t6 _( v( r  l4 f/ @* y: x/ w+ w
% M. V1 Y5 M3 a: Z: s
                      BSTR bs = SysAllocString(wsName);4 w' \' R+ ]1 A9 x9 g$ f
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);$ w1 m5 h$ c; d! n
                      SysFreeString(bs);
5 Q* y: ?8 ]; H9 n" _0 U, G4 \* o, g4 a' ?  B! H
                      if(hRes == S_OK)
8 R  k) \8 q! ?0 G                        {" Q! r2 ?2 @* F  l" {
                         AnsiString s;
: E; b" a$ S2 ^; Y7 J$ Z/ t4 c0 p, v                          Variant v = *(Variant*)&vValue;
  H8 d5 R7 @$ J# h) N                          if(v.IsArray())/ T5 L$ h/ P0 ^
                          {
  |2 c  j) }- I& b; q; L; P2 A                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 B  a- J, W$ t  k1 \* q( `  A0 e! p                              {
9 H9 Q9 E% y4 s/ B6 u) {; A. w                                Variant a = v.GetElement(i);
: t" k# x) h& L% U6 f                                if(!s.IsEmpty())/ q  n5 k- R! @) ]/ U
                                 s+=", ";
: ]: M3 U, q/ P$ b: \9 F                                s+=VarToStr(a);
$ K% V' D' L  c% S6 ~1 A( ^" q                              }2 W$ ~9 y6 Q0 V' g  R6 i/ r
                          }8 l: i9 d/ U7 c5 x
                         else. Z  s# }, T% c+ g: G
                          {
; B% m9 ]* z# X. B/ M6 H( W                             s = VarToStr(v);6 g* ]( d7 @8 u# Q# ]" B: e: T  a8 i
                          }3 F; m1 e+ n7 z; L
                         lpList->Add(AnsiString(wsName)+"="+s);
% f& p% B( |$ T+ K. K                        }
0 G& b5 l2 L% F  y
6 M+ S( H5 _, O: U7 F                       VariantClear(&vValue);
0 x* N4 y: y+ \# f2 I6 ~& G                       SysFreeString(wsName);: u7 y: A: B$ Y- y" v9 a! d
                    }$ ~! A. t. u- S$ Z! h
                 }* j( z( Z1 D+ Z  d9 G
                if(pvNames)SafeArrayDestroy(pvNames);2 j7 p# m# e  `) F) p) E9 }' t
                iEnumIdx++;
/ d; l: A3 m5 I5 z               }8 y" J# c+ O* w  C4 |
           }" k. ~$ I' X9 j/ E/ z  f$ ]
          if(pClassObject)pClassObject->Release();
; C4 H( J0 a+ V9 q: M         }
5 P+ M) P! F4 J        if(pEnumClassObject)pEnumClassObject->Release();- q- p# R  ~/ b3 t# M1 m# }
     }
% ]6 a9 b; C1 @5 G9 k& J/ v     if(pWbemServices)pWbemServices->Release();6 t+ z# b  v6 O  K( S
  }! j" n% a4 e, }/ R7 l
  if(pWbemLocator)pWbemLocator->Release();
* g$ y8 e" B4 C' n}
$ `* H4 e0 t& b) R9 a- V& P8 h//---------------------------------------------------------------------------" o1 \+ A' [5 M; x& `( D- Y9 N) i
7 p8 m+ |% e( ?
// 通过 WIN32_bios 获取 BIOS 信息:- O: `- i& x7 u8 {8 A2 V
void __fastcall TForm1::Button1Click(TObject *Sender)$ a' a* r5 j" K. C3 R
{
/ D  Y; _+ I7 I6 K9 r6 S    Memo1->Lines->Add("================== [WIN32_bios] =================");
. R# ^' j+ k2 _    GetWmiInfo(Memo1->Lines, "WIN32_bios");4 `; a$ V) ?  f5 G" r2 U7 c
   Memo1->Lines->Add("");
8 C+ T+ O) w6 Z) f7 J+ \; q}
- m3 R+ b  q& A
. Q6 y$ @2 j( e; s( h--------------------------------------------------------------------------------
8 A' K0 g- M9 D/ x+ @7 L8 F) F5 ^  ?, h* \1 G  V$ p) _
WMI 可以访问的信息类型有:; }- P* k6 Y/ }. q# g9 I! X4 D
  Win32_1394Controller1 V4 k0 s/ C/ }  \2 ]
  Win32_BaseBoard- E& t% d$ Y( m. ~$ W6 `$ I0 y# S6 ~
  Win32_Battery( ]3 {% R5 ]! M5 w5 N/ d" l
  Win32_BIOS
7 e, |$ T5 E8 q   Win32_Bus6 ]  X+ X8 a& Q8 g
  Win32_CacheMemory. g+ k( P2 `8 c3 C9 l3 V3 D* n. ^
  Win32_CDROMDrive
- b" ]$ O9 [+ F7 r   Win32_CurrentProbe
6 v- }* H/ m. e3 X$ F4 Y   Win32_DesktopMonitor
% K3 ]! I$ K5 A" \( m) l   Win32_DeviceMemoryAddress8 v; w7 @  s; s7 \* l1 y) x
  Win32_DiskDrive# Z, e9 s; w/ A
  Win32_DisplayConfiguration
7 n9 O, O. V7 p   Win32_DisplayControllerConfiguration4 v# g; v$ x8 a  l! i+ U, X3 B
  Win32_DMAChannel1 l+ ~9 `5 @/ c" d/ i
  Win32_Fan
/ O% U9 {3 s+ w7 L: X  ^   Win32_FloppyController
. u) U( N* h4 i3 Y   Win32_FloppyDrive
" o* f$ g# Y8 a   Win32_HeatPipe
% ?1 h. a( |) ?7 l; Q; Q/ i   Win32_IDEController5 I+ `; p/ Q  a8 d
  Win32_InfraredDevice% G5 _3 h+ d9 ]% ]6 v0 K
  Win32_IRQResource. x& m7 K, B& A6 C- e, Z
  Win32_Keyboard7 @$ B6 [& E4 J& Y# L0 o1 w
  Win32_MemoryArray' D2 z+ ~0 }! }
  Win32_MemoryDevice
+ `# C1 n$ o7 g/ m0 A: `   Win32_MotherboardDevice
$ Z: C! o2 N$ I/ @' h* t3 M, a   Win32_NetworkAdapter1 a- r( Z" m; t* P+ V5 J5 v# Y
  Win32_NetworkAdapterConfiguration
$ j- a* m" @- n/ }! ^7 |$ S   Win32_OnBoardDevice0 h; ~$ \" D7 k( f% K
  Win32_ParallelPort5 y3 `4 y$ `* b/ Z* {/ s
  Win32_PCMCIAController
$ v' O' N, }  t! O9 T" |1 m0 _   Win32_PhysicalMemory
" _8 `% M) a1 n7 y   Win32_PhysicalMemoryArray
3 v. U+ t0 {, u   Win32_PnPEntity
7 S' ]: [: Z) Y( \& ?9 F   Win32_PointingDevice
6 u4 v# N1 u. y; k   Win32_PortableBattery
. w# D' T% m* A. ]   Win32_PortConnector9 k2 o4 |( W, }& }
  Win32_PortResource  \9 q1 n; |, x/ h
  Win32_POTSModem3 T/ }. {' R; _% T
  Win32_PowerManagementEvent: c8 @2 x5 t# @1 |  L) F9 o% i
  Win32_Printer# V: ~: R  H5 B: B
  Win32_PrinterConfiguration% q5 N) I  o# Z+ a+ w5 x
  Win32_PrintJob; d" P6 l6 K" T9 A* \8 Y+ p  Z% V
  Win32_Processor+ H2 w1 w/ F; K
  Win32_Refrigeration
" ?' f0 U4 y( ~   Win32_SerialPort
  @3 `* b3 h% B% |9 [. z   Win32_SerialPortConfiguration+ T  a* h: g9 ~$ z; R7 a
  Win32_SMBIOSMemory0 v" j: ^4 q+ H  M: |! m
  Win32_SoundDevice. T  ?4 k6 v9 q: a  m2 W/ {
  Win32_SystemEnclosure  ~. v% b4 b7 ^
  Win32_SystemMemoryResource1 H: R" d. T3 x7 M- f
  Win32_SystemSlot$ h3 a+ I8 f, }$ w8 m
  Win32_TapeDrive
$ W( c5 {0 M/ H( _, b& l   Win32_TemperatureProbe/ w0 f2 i; b) X! n' i- k! i; J3 {5 b
  Win32_UninterruptiblePowerSupply
& d  O7 O) D; a+ C   Win32_USBController" W0 }& Y- c3 e% ^* [/ Z9 A
  Win32_VideoConfiguration7 c. W4 E( ], I# O* Y
  Win32_VideoController% R0 b4 w! D0 v+ y
  Win32_VoltageProbe
8 ^6 C: K5 ~) b7 _! y. [; Z( w
1 T. {) v% a8 |0 M以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-8 20:29 , Processed in 0.018839 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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