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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
, D# m. C5 Y, b: o* @* `# W& G4 f

2 k' f7 s" V4 n4 L" D9 @--------------------------------------------------------------------------------  [8 Q: x" y7 H8 z; b- \, c$ G& Q
WMI: Windows Management Instrumentation (Windows 管理工具)
' U) c% y) K. q3 N1 }: }: k3 }   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! L7 N) a7 Y7 F9 \3 s( T* I' C
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。! i. \* ?  {& F9 z
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . A5 S7 c/ L! n0 e( B9 Q6 a$ |5 h

: \  a- ^8 F: o9 @& K! X; l. t5 x--------------------------------------------------------------------------------- e3 Z9 D- D8 _6 Z1 x9 T
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) J' V$ p( I8 {! M8 T# m; X% N% \: N4 _0 R
--------------------------------------------------------------------------------6 \" k8 ]: \2 r" x, Y
① 初始化 COM 接口:8 K. j6 ^+ o, w% x# T
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
& X& W" n* h$ k  @, [/ G9 b/ \   这两个函数在 #include <comdef.h> 里面定义。. ]# l8 I! {8 d/ x) e. f

. ~1 Y3 K1 K# Y  s6 g) P# p② 获取访问 WMI 权限:  U3 H7 Y: w3 H4 x) S* n' X5 Y
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
  t5 A: A0 v; ?0 R" _   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
; F9 N9 {2 O' z# a3 O
3 {8 g, e2 h" |* w2 [  o( d2 l③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:- {; J# w7 N  ?2 j# O+ W1 f
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* a( Y4 E' x) N9 X9 s! N
8 l) _' [" Z3 Mvoid GetWmiInfo(TStrings *lpList, WideString wsClass)9 u) ~3 s8 x+ E! Q1 w! v6 W7 R  M6 @9 C+ O
{
. y. Q2 X7 q& |  IWbemLocator *pWbemLocator = NULL;
! o2 s3 z/ n: S/ e+ B% M/ r! Q  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)  f1 u0 m" A8 A9 B: Y2 Q% ]0 v& M
  {
4 S5 E! r2 v2 @) l6 P1 r6 r     IWbemServices *pWbemServices = NULL;
2 X: W* }) y( Q% A6 f     WideString wsNamespace = (L"root\\cimv2");
5 G% \/ d! W7 R9 S     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
! ^6 D0 S, J2 k/ r/ P      {5 F; n8 N, ~* C  u5 e0 }* v7 P
       IEnumWbemClassObject *pEnumClassObject = NULL;
- Y  s" [$ J7 o# ^3 p        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;0 G8 D; T2 a5 g" w7 z, T" Z3 G
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ J8 }  c6 n# c& ?3 W
        {1 p, o2 x' {3 J, a5 C+ y
          IWbemClassObject *pClassObject = NULL;& h! N: j: p; s8 T
          ULONG uCount = 1, uReturned;  P  g" @* ~0 n  T; L( k9 D
          if(pEnumClassObject->Reset() == S_OK)
6 q$ z  T. t/ p4 F1 ~' b& p            {8 h# m/ U  c; I$ L$ R1 T
             int iEnumIdx = 0;
% O) M& w$ g3 }4 e$ p              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)3 v- H; `" r0 n/ P: Z+ w' N5 S3 |' L
              {* v1 S+ g) W; _4 g8 l( t1 d
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
" z- E- g- L3 a! Z8 Z+ [3 `& n
                SAFEARRAY *pvNames = NULL;& ?% [  B6 k1 l5 o3 L5 N
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
3 f; H; x% Y& C* }                  {
4 q$ Y; A/ ?1 v" W                    long vbl, vbu;3 M" y; r' e: e! Z
                   SafeArrayGetLBound(pvNames, 1, &vbl);+ o9 [2 q4 x$ T
                   SafeArrayGetUBound(pvNames, 1, &vbu);3 g$ R  M3 j8 e; P/ r( n
                   for(long idx=vbl; idx<=vbu; idx++)
6 `- p0 j$ t* p  i# L- n: `                     {
7 G3 X$ p" R3 l- @7 d$ O# v+ E8 A                       long aidx = idx;
3 n9 x. a) O1 b2 a  H. \3 w) R. {                       wchar_t *wsName = 0;) z4 f$ r6 r" K
                      VARIANT vValue;
: r6 i. p; g/ A                       VariantInit(&vValue);, z1 L  z& D: x
                      SafeArrayGetElement(pvNames, &aidx, &wsName);; [" X( b; h, J/ o' f

- Z2 g8 I- \1 w                       BSTR bs = SysAllocString(wsName);
' H" [6 l6 M: ?: z3 U% h                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  q2 Y9 T) e4 _( Y" H                       SysFreeString(bs);
  j1 J4 y" s/ s) k4 w, q. |; l* K) f
                      if(hRes == S_OK)! c9 m' Q& X" t  j
                       {4 q% _/ z8 }2 A
                         AnsiString s;
. |7 l0 V' ^7 v' n; j                          Variant v = *(Variant*)&vValue;
2 H9 o! e4 r+ g0 l                          if(v.IsArray())
# L: w" ^' h: b                           {
, ~5 U* }5 i9 h/ Q+ k. S! l                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
  C0 P1 f: M' h9 n& a. }) M                              {+ O  w! ^$ }8 \* G; [+ t- |; Q
                               Variant a = v.GetElement(i);0 k5 w8 ^' J+ E1 G$ e4 L& G; @
                               if(!s.IsEmpty())
2 p$ H  J8 `1 Q$ T, b9 Z0 A1 ~                                  s+=", ";* e. a* A3 X6 R$ J( \# W6 n; D8 J
                               s+=VarToStr(a);
) `" q1 U# L6 d/ N* J$ }4 f                              }
# ?7 @! @! E- k6 N                           }3 ~5 ^, w: g. D: w, W
                         else4 I/ ]# B9 g! |4 ]
                          {
" Q% |# O/ }& A                             s = VarToStr(v);
( T. E' A' I$ c* q) c2 x* Y' R                           }: `* L+ b- F0 w5 z* m& }
                         lpList->Add(AnsiString(wsName)+"="+s);  `6 r0 Y1 h, V; C  D
                       }2 s8 J6 |8 \# Y9 R; c! @
1 n$ \2 K5 q  ~. q; m7 b8 |
                      VariantClear(&vValue);
* k1 c: O: E3 K. T9 I* `                       SysFreeString(wsName);/ N6 u7 Z" g( Q" L( S
                    }
  Z* a: Y' S& Q1 g" X8 _7 G                  }( [& P* X  F% w5 k
                if(pvNames)SafeArrayDestroy(pvNames);, I1 o) b9 j) v/ o- k- v: _3 @8 Q) I( c
                iEnumIdx++;) }+ l5 R+ q& i4 _
              }1 J; R1 V6 T% D' j( l4 |6 B
           }
" j9 M4 j) i! ~2 W  U0 u+ X/ H! v           if(pClassObject)pClassObject->Release();
* |& W( z, g6 ?) l2 v) O0 v; ?         }
5 ?  y. R0 p7 V        if(pEnumClassObject)pEnumClassObject->Release();
6 m% J4 G3 I! L, N- C, ^      }9 y! V9 s$ l9 j0 e
    if(pWbemServices)pWbemServices->Release();/ W! W' i: X% h- _. w
  }
) g8 m4 L$ ?6 b$ |7 g% W  if(pWbemLocator)pWbemLocator->Release();5 Y2 V9 a0 _7 Q5 B9 f0 ~' u
}
0 I% v: P- x: B//---------------------------------------------------------------------------5 @7 B4 E: i. t# d
* u; r' N" S# D
// 通过 WIN32_bios 获取 BIOS 信息:% {/ Q& ?/ w. a5 }! @8 c* e, E+ w: W
void __fastcall TForm1::Button1Click(TObject *Sender)* v& C. G$ K. W. z7 R
{
+ K, E! u2 p+ `1 G    Memo1->Lines->Add("================== [WIN32_bios] =================");; e3 l, T0 w2 z* w( X  I
   GetWmiInfo(Memo1->Lines, "WIN32_bios");0 y; O) `' a* {% P7 z4 l! V
   Memo1->Lines->Add("");
( _7 T  a' m/ j, S2 Y" w}
. {* I( |3 m1 H. ~7 t7 M/ F; c# T6 \! i
--------------------------------------------------------------------------------
* D5 ^3 Y* w8 z+ x* f  |
# F8 {* b6 C0 C" f' a, @; ~* }! v# xWMI 可以访问的信息类型有:4 L. J6 d# l& J: J3 }
  Win32_1394Controller* I! y) Z3 R  A. X, D0 v
  Win32_BaseBoard
" J. ^* i9 B; a, z   Win32_Battery5 d6 p: `& S& R) J: E* R$ |
  Win32_BIOS
* W0 @9 z: A6 {   Win32_Bus
# ]8 T* y9 @: P   Win32_CacheMemory
. h) b- t+ @, z; C" l! W- w) J   Win32_CDROMDrive
+ G' o3 ?! j; l9 [! l9 k# |- W   Win32_CurrentProbe
) |9 Z+ u  N5 K' f# W   Win32_DesktopMonitor: c& W. q$ s' u, r
  Win32_DeviceMemoryAddress. n5 {8 S- H" O  g
  Win32_DiskDrive
( b. \6 K8 G4 }$ V0 M! @   Win32_DisplayConfiguration
9 n* t# G9 K3 O% Y# X7 f: G   Win32_DisplayControllerConfiguration
7 Q4 L! f3 C( N   Win32_DMAChannel6 z1 R. c) w" y5 N7 D
  Win32_Fan2 x# P) u  p  ]; w5 P+ S  e  i
  Win32_FloppyController! _4 H7 ?4 p5 r# z4 H
  Win32_FloppyDrive
9 Y5 Q; }/ u) ~  q8 Z/ t' q( ]  O, T   Win32_HeatPipe5 m/ o2 A3 |+ ^/ x9 z
  Win32_IDEController
7 K& [, N" e4 a   Win32_InfraredDevice5 {0 ~$ \. i% i0 \
  Win32_IRQResource! P3 S7 L9 G5 {( w, c; P
  Win32_Keyboard
$ D$ x' f9 ~" Q9 l& i! k9 {   Win32_MemoryArray
& A$ l% d# e* D   Win32_MemoryDevice7 u3 h4 P8 n% E. L6 F8 e; ^
  Win32_MotherboardDevice
- W& C; k& ?' H6 R   Win32_NetworkAdapter
3 y3 C9 R' U) d" {2 P  [   Win32_NetworkAdapterConfiguration
) Q7 U4 N/ e1 c. y8 J1 u$ ^   Win32_OnBoardDevice
$ l+ \" _  {9 C, b# d   Win32_ParallelPort
& @% Q" T! v8 H# b   Win32_PCMCIAController+ B6 J$ A& k4 A8 N- w  t
  Win32_PhysicalMemory
4 O& O9 ~9 B# I5 Z   Win32_PhysicalMemoryArray& H( X$ J  `+ A; c1 D
  Win32_PnPEntity6 A+ B5 V. V  Q$ G% m; \
  Win32_PointingDevice3 X/ A- s8 M9 F6 N+ `0 N
  Win32_PortableBattery$ k, N0 R( Q, |
  Win32_PortConnector. V' r1 @: c: A
  Win32_PortResource
8 g  ?# v/ C4 g   Win32_POTSModem
8 U% P* K( e2 V. Q   Win32_PowerManagementEvent- d# b* E$ j1 Z: H6 \
  Win32_Printer
2 `; }; W8 {5 J9 v1 c0 g* z   Win32_PrinterConfiguration
2 ~7 P5 W5 i2 p% r$ X1 v8 q   Win32_PrintJob1 X9 k5 m0 h% V5 t8 [$ i
  Win32_Processor
8 Q" H0 Z& f3 ]   Win32_Refrigeration; \( X! E' ?7 }9 o' D0 q
  Win32_SerialPort
" H- O3 n2 D1 e# D4 G6 v% F  N) O   Win32_SerialPortConfiguration' I! v1 R5 s  w  T* ?
  Win32_SMBIOSMemory. l8 |4 X: _% {( h( H: R
  Win32_SoundDevice$ Y9 S7 f  B3 k7 _- L6 `
  Win32_SystemEnclosure
; G/ U) T! D  p, \! C   Win32_SystemMemoryResource
2 U9 M2 g, u: a" G   Win32_SystemSlot2 W% X9 h* h+ s. n# u" k
  Win32_TapeDrive5 P+ R, b# L; p! b% ^7 I
  Win32_TemperatureProbe
/ h- }& d4 `! G, d+ {   Win32_UninterruptiblePowerSupply
% T/ e, v6 t& K6 f% a% q5 y; F6 a   Win32_USBController* y# Z9 n! u1 e
  Win32_VideoConfiguration
/ S5 a; v5 p+ I  F) b   Win32_VideoController3 P* w' @  l# l. B
  Win32_VoltageProbe
* O0 g# q$ S5 B7 Z( Y% m3 l* y) M* V+ h* z# w3 N
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-18 16:35 , Processed in 0.021082 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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