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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)9 U% n- X1 U! E- o7 `/ B- z

* |. ^9 Z; F! t; V4 Z5 Q( K/ u& {7 M1 I
2 r' |" G" S* Y1 n% I; R. \--------------------------------------------------------------------------------
. \+ K/ m4 V7 N3 y/ ^5 D  UWMI: Windows Management Instrumentation (Windows 管理工具)  h/ w5 ^6 H" k4 {6 I) f! h
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ) o. E' I7 J1 D1 {, F5 }7 A+ n
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。+ T8 c0 _: [& R6 q, S* I2 g# s$ U
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 |. h* `3 h5 h" a. o, ~( Z& P. Z: N

" D% h3 p0 B. `! a--------------------------------------------------------------------------------# s/ B7 L" O; E) W7 g
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
6 D# I* V3 {" A1 Q0 F( W4 o! O- `3 C4 N% H
--------------------------------------------------------------------------------( F& X+ r- a4 z9 \/ j" J
① 初始化 COM 接口:
+ ~" t- l4 P* M  b' Q: h" L   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 X3 g: l9 g6 b9 L% Y' X  M
  这两个函数在 #include <comdef.h> 里面定义。' X! m6 ]+ u# ]' t2 A4 `5 Y
& D$ ^) ]2 Y' [' B3 T' [
② 获取访问 WMI 权限:: N2 u, ?2 F5 L1 w# v0 r
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
+ X* N( T! H! @3 b+ k2 r   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
5 X: ~1 t- F9 [; {5 h' u
0 g, a2 ]; Y3 R9 I3 ?③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
  i8 n7 H8 n' }5 B" e6 n   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" F% V8 ?' p& v) l" }, \- M
% t8 }. a- r: rvoid GetWmiInfo(TStrings *lpList, WideString wsClass)8 {1 L( n2 @1 D
{
2 g4 ?& L& i+ X5 ^7 ?6 W" f  IWbemLocator *pWbemLocator = NULL;& b4 Z/ ]+ |  w7 ?
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)( G$ ], p6 p, M& o
  {: @9 m- ?' E7 k* f" B) w
    IWbemServices *pWbemServices = NULL;
$ l. g7 z" p  y- t     WideString wsNamespace = (L"root\\cimv2");
. c- h8 X- |( ]( q9 T: F  {     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)0 T! E$ C' G. s( d1 g; I* o: F
     {
# B; d, f- K( {        IEnumWbemClassObject *pEnumClassObject = NULL;. b& Y4 j1 E# R) I; |( w8 [6 J' U
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
: ^0 b* P9 f3 r0 S3 B' F/ i# |+ D        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
: `0 Z7 a; c8 g( B% z" }( `" X- p         {
# S6 q% D5 k, M2 g& m$ U9 v, r           IWbemClassObject *pClassObject = NULL;4 r, {9 F  ~  n! x
          ULONG uCount = 1, uReturned;
, o6 M! ~) W8 p+ B, [9 H( b; E           if(pEnumClassObject->Reset() == S_OK): }% M& L3 g2 g
           {
! ?$ o* {, [! N: q* Q8 j) |# k              int iEnumIdx = 0;" I& a4 A8 Y5 z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK): x9 Q0 `, n* r
              {0 R* A1 _: H; W
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");' H0 T- b* g3 B( S# t

6 E+ I9 z3 K2 C# j+ n/ G                 SAFEARRAY *pvNames = NULL;
3 j$ a5 n: ]- V, K1 F                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" v. u0 X, b5 k* K+ T2 ^- V                  {0 L. D4 K9 P2 X+ p
                   long vbl, vbu;
$ {6 d  @/ p0 k* s  g. w: b% _                    SafeArrayGetLBound(pvNames, 1, &vbl);
9 A0 |6 l% Q! ]$ l- t* `0 \                    SafeArrayGetUBound(pvNames, 1, &vbu);8 V: f" a6 e* ^' ?. ~# Z& X
                   for(long idx=vbl; idx<=vbu; idx++)* X+ n1 _* _8 _+ K: |
                    {- c7 E4 |9 V* c
                      long aidx = idx;5 h! D+ c/ x% i4 N8 m7 {
                      wchar_t *wsName = 0;/ C0 e+ |4 F. W
                      VARIANT vValue;8 F+ k  ^! c0 K6 S  p7 U+ c' B
                      VariantInit(&vValue);
9 ^7 w9 x3 ]* o( i5 {6 O1 L                       SafeArrayGetElement(pvNames, &aidx, &wsName);# U2 W7 S' p5 Y
4 K" z' D7 h1 {0 N: _2 {$ A  M
                      BSTR bs = SysAllocString(wsName);/ O! W& }+ C, m- V
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 H: h+ D# c, C; t; X                       SysFreeString(bs);+ A/ `# w) [# C) }
0 r9 f( C3 |9 G, x/ D" n
                      if(hRes == S_OK)9 O1 y/ J2 U2 o. Q! r8 B/ y
                       {% t6 P/ V# z: a6 |! D: F, j8 ~
                         AnsiString s;3 g0 _8 |  R4 F# Y* I. ?( K
                         Variant v = *(Variant*)&vValue;4 A- u! Q, `% \- L/ P& f% R
                         if(v.IsArray())- R0 g0 ~% u6 c7 F! f
                          {3 h7 |- z8 I6 ~$ Z0 P- X* R
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)8 a8 _6 I9 j: g9 m$ t
                             {8 w0 |0 [( H8 Q& o6 {  G3 k
                               Variant a = v.GetElement(i);
. S  D. A$ k$ o/ G7 s' Y                                if(!s.IsEmpty())( ?9 B9 @- W" K
                                 s+=", ";
; A6 _; S7 N3 b                                s+=VarToStr(a);& b3 e9 n$ s1 _7 ^( ?5 o
                             }1 M* i& F( ?) r* w8 J' n5 G% \
                          }" g! S  Z, y4 p9 @) J# }
                         else) n0 h9 M! }7 V
                          {# q5 z! J6 }3 }2 G" e6 |6 h
                            s = VarToStr(v);
5 K) A/ p: L% }5 @) D. e2 m, {; b" Z                           }3 W9 ^/ A/ q' V; `2 ^0 \
                         lpList->Add(AnsiString(wsName)+"="+s);! X4 P( O1 b% ^: w" y) Z
                       }
1 n! |9 W7 b! g0 M0 @- @+ c) R# k9 `
                      VariantClear(&vValue);/ X9 c3 p+ e( u) x% P9 B
                      SysFreeString(wsName);
$ W" y1 c$ _: z7 J# J) K                     }
; z- A. ^- B/ d4 B                  }
, P8 x9 M, e7 M* d" L" k! G                 if(pvNames)SafeArrayDestroy(pvNames);
7 d1 }7 j: W8 @- q0 L                 iEnumIdx++;
7 m7 T1 d+ Z/ _) t8 l4 x               }
3 D0 }' \' E1 j" W  d0 I# I- H5 A            }
6 X2 ~$ N6 D( V- \( Z1 e           if(pClassObject)pClassObject->Release();6 u5 v+ E" y- K/ A+ m# ]
        }" D9 |( }+ F& s+ K6 L7 l: e
       if(pEnumClassObject)pEnumClassObject->Release();" _) e5 i# z& g+ C0 @, u
     }
8 n/ M8 P" Z2 q0 g% q; b     if(pWbemServices)pWbemServices->Release();
% x! }9 H8 a" r5 N) _4 @, }   }
* a1 s0 ?  ?/ Y" }8 ^  if(pWbemLocator)pWbemLocator->Release();) @2 N7 F8 `! A# _5 e
}
; P& f1 r' |( ~" E. t/ ]//---------------------------------------------------------------------------  j) H2 b$ U6 R# G. J7 m, Q

% G1 y" s8 {5 h6 O1 W" ?7 Q) K// 通过 WIN32_bios 获取 BIOS 信息:
' r1 \/ k6 k: n1 R) ~void __fastcall TForm1::Button1Click(TObject *Sender): \3 ]$ d" z6 Q* _) G
{6 C% c$ X7 {* {0 a. \$ a6 Z  H3 R" s
   Memo1->Lines->Add("================== [WIN32_bios] =================");, ?; n' P7 r0 ~% Y/ r% v9 A
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
; {0 o7 S2 e( ~    Memo1->Lines->Add("");
% M0 [7 ?$ z  ^8 d}! R, i* y* u& ~5 `2 b, p; L& ^' [0 f

$ q1 V% k' O! p5 V' m! ]1 k--------------------------------------------------------------------------------% u, l* s3 [3 U% b3 m: V1 v- W
% Z1 P: x' \7 k3 \& h5 E8 i
WMI 可以访问的信息类型有:) Q$ m7 l4 e% v. \; ^
  Win32_1394Controller
6 y& {0 V1 v) r' g. l. _   Win32_BaseBoard0 m2 [5 |$ I. S3 w2 n0 G) z
  Win32_Battery6 h6 I' K2 W' q
  Win32_BIOS
% L  x4 P( |3 I! y) |. ]8 Q9 N2 @" ~   Win32_Bus
7 S: q5 j7 y) I* P( |; T. ], J   Win32_CacheMemory
% w* e  V* [- e0 K8 m; E" _% f$ R   Win32_CDROMDrive3 e6 z1 }# y. o1 Z% X+ b
  Win32_CurrentProbe
1 I3 @) U# I; q! @2 F9 c7 a( p1 _   Win32_DesktopMonitor+ n4 g5 _* ]5 P  r' L" k
  Win32_DeviceMemoryAddress- ^' Y- G9 F, k2 d# u; B" R
  Win32_DiskDrive
6 Y& A. r2 ]. N* D   Win32_DisplayConfiguration
+ h3 i0 f4 E. u) q* Z   Win32_DisplayControllerConfiguration0 c& @- t7 E$ P8 N; T
  Win32_DMAChannel  Q8 t! L' G+ m# S  y8 t0 z/ w
  Win32_Fan6 x& {: g" F7 F( y7 ~
  Win32_FloppyController
" A  L6 b& B5 x# A  n0 i   Win32_FloppyDrive
, g; O8 c) K) z. j# M7 E7 X! ~! C2 b   Win32_HeatPipe
, ^2 h$ `7 m& R1 J9 X   Win32_IDEController
& o. P9 Z% x8 |" b1 H   Win32_InfraredDevice) {6 H' @- n. ^2 O  B8 Y+ Q
  Win32_IRQResource# a) B  C- y( K4 c7 ~7 g: {
  Win32_Keyboard
8 c! z. r4 z+ \9 `+ s   Win32_MemoryArray
6 s+ m# E. O8 J- T   Win32_MemoryDevice
  ?3 B( T0 G# W/ ?   Win32_MotherboardDevice  K5 ~. X9 X' R  O0 [# F
  Win32_NetworkAdapter7 G9 R/ v: R5 j
  Win32_NetworkAdapterConfiguration
" Z8 v3 i) L  s3 ^( X  ^& F8 A   Win32_OnBoardDevice
% l; P( ^+ b2 ^# |' i; [% U   Win32_ParallelPort( e: L- v; w, `; H0 Z  n
  Win32_PCMCIAController
: P( c8 L, b. g* U; F0 g: R   Win32_PhysicalMemory
0 Y+ z$ c: n+ J- q  z/ `3 Y   Win32_PhysicalMemoryArray; ]" _( g5 X0 G2 Y
  Win32_PnPEntity; B) E6 Z# {' p% z* ?
  Win32_PointingDevice; \7 ^& Y+ K/ K- p5 c1 Q
  Win32_PortableBattery* w, A4 s  ^; A: t
  Win32_PortConnector, T8 }! ^( @8 r
  Win32_PortResource7 l9 X6 l+ s) ~9 A1 S# v* q! l0 i
  Win32_POTSModem
5 \! _/ F2 G9 I( G+ y1 z3 z: {   Win32_PowerManagementEvent! S9 [3 K" {: y% s8 W, q
  Win32_Printer1 O( i/ N7 p0 @
  Win32_PrinterConfiguration; f/ r* |* F4 ?
  Win32_PrintJob
/ {6 _1 ]; X$ c  B) _   Win32_Processor
9 j) L! l' T* p9 M# N' b   Win32_Refrigeration
' A/ a/ [( V1 X5 t1 h" b   Win32_SerialPort
9 S$ c0 c  F  u! {- m* v   Win32_SerialPortConfiguration  _% `% s" \. _4 e
  Win32_SMBIOSMemory
8 L" j  q6 B  i6 U7 i$ V   Win32_SoundDevice
# f0 Y; G5 K/ o" H* j5 ~, r   Win32_SystemEnclosure9 t. b5 Q( O) ~4 K
  Win32_SystemMemoryResource- F2 W+ A$ a  V0 s+ D
  Win32_SystemSlot2 @8 c. Z$ `$ }6 s- A) e+ ]
  Win32_TapeDrive5 Q: F, Y5 G3 H: X/ z% t% V
  Win32_TemperatureProbe
) G/ S" G9 i9 Q6 b/ X0 X1 t   Win32_UninterruptiblePowerSupply
+ |. k2 Z, l* N4 F   Win32_USBController6 r+ r6 v. h8 F6 x) i7 w9 D
  Win32_VideoConfiguration
4 l$ Q) Y$ A5 }6 g6 M" R   Win32_VideoController( N2 O$ ^) ^8 J2 j& E, G5 p0 A
  Win32_VoltageProbe
, M" j+ _7 m% T' b8 A+ H( B& v  Q! A* }0 i$ ^$ R3 k+ H( ^3 K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-5 03:16 , Processed in 0.019828 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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