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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 G- n4 G% |3 c3 V7 w4 p* h9 I
% G! b# J# }& {. \* S2 E0 o
' P4 Y* s4 z: S$ e
--------------------------------------------------------------------------------$ @0 ~  L# Z& }* V2 W
WMI: Windows Management Instrumentation (Windows 管理工具)+ d5 v( A4 a9 Z  J; f8 X# h  W
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
, s# y* z: A7 t4 M   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. r1 f6 S3 d9 X- s$ V: |5 ^   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 & \  o$ z9 u! B

3 x8 z0 o, C, D& [' M; F3 `--------------------------------------------------------------------------------
- e& w! _" P# a: t# pBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
: U- f3 e' t( J! A  v! ]  r- n5 p! a: F
--------------------------------------------------------------------------------
7 ~4 r) U7 f, r6 c: N: [① 初始化 COM 接口:
) z2 Q1 \/ {4 ]" G5 z" H: l+ o4 E   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。3 O3 l7 Q1 k! i
  这两个函数在 #include <comdef.h> 里面定义。$ I. ]6 w1 K' L; Z% k
5 n$ G1 F6 H9 N8 K
② 获取访问 WMI 权限:& ], W7 Q" D) C: t0 Y- c6 x  R
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);3 X+ \- x3 b. r
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。* {7 R9 p0 j2 w( D/ p5 I

& o' B% o) j' W5 j③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
8 g% N3 M: v1 H' y' v   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。, y( a% a$ {- `7 I' b! y3 R+ {/ Z
* ^; x- A2 }5 Y4 D  I) \
void GetWmiInfo(TStrings *lpList, WideString wsClass)5 o6 ~/ O( \0 o( S4 K4 h
{5 H' ~1 s+ u0 \9 `0 a' }
  IWbemLocator *pWbemLocator = NULL;
, E" q0 n- e6 ]5 d0 K  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( t& i5 C. D0 \# ?; P$ x$ G6 L1 B   {* O! t  N- Q  h6 E
    IWbemServices *pWbemServices = NULL;% c2 s6 r" ^, ^3 B' Y; D
    WideString wsNamespace = (L"root\\cimv2");
0 @: N, a& w1 `; I; a     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
. `  i2 L' M( r3 h0 {. \" [      {9 K5 X; l  X0 ]3 V
       IEnumWbemClassObject *pEnumClassObject = NULL;% o" I) k# D# _( O2 B
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 @( U1 {1 d! y9 k' k% S+ Y, s& Q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)' \) z9 C, W% J" Z. l4 @
        {
5 [$ j! `3 {3 K$ T6 V; b           IWbemClassObject *pClassObject = NULL;
& [/ Z9 l* p$ Q/ v& v4 t           ULONG uCount = 1, uReturned;8 B- O! _2 P6 F# Z8 g
          if(pEnumClassObject->Reset() == S_OK)
/ a, X9 p& z( V8 F            {& g; L- o5 P5 R0 ?6 V5 g
             int iEnumIdx = 0;5 S/ E2 f/ a- w. d- w
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)8 A: A  a5 q+ G' ^7 w# S% u2 Q
              {
$ a/ {0 A+ j' R1 r3 u8 U% A                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");# _+ c0 E, Q, E3 Z& E0 o

; c; k$ R; j) s& j! c; T$ ^) V                 SAFEARRAY *pvNames = NULL;: w# E7 @3 L, \( T2 _
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: W! C1 U7 T3 L* z* C6 g                  {
1 ?/ ?& c4 |. o" ]; ?3 ]                    long vbl, vbu;* G+ `1 P# {0 l3 D9 a+ s
                   SafeArrayGetLBound(pvNames, 1, &vbl);
2 u: l( S( ?4 E' z5 L) X                    SafeArrayGetUBound(pvNames, 1, &vbu);9 B% M7 y; F% N( b. _+ ^- d
                   for(long idx=vbl; idx<=vbu; idx++)4 R) r$ k2 U1 H  A# ^
                    {( [! B, R+ [7 y0 E3 y( _) U% X8 r
                      long aidx = idx;
$ r7 y: F  f( Y2 z" l8 s                       wchar_t *wsName = 0;- H5 f1 o/ n# ^3 u; N2 @6 B
                      VARIANT vValue;
) @% q* c; }  ^8 M! T                       VariantInit(&vValue);
0 Q  J$ i% J4 y9 u0 D0 `" }                       SafeArrayGetElement(pvNames, &aidx, &wsName);; W/ H0 w1 c5 p6 X- h' ]' j
" e! E# ]6 V. v, `* r
                      BSTR bs = SysAllocString(wsName);( G9 t. m* ]$ m4 S5 v0 _& h$ _, g
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);( c* x0 q- p7 x1 Z
                      SysFreeString(bs);
- _* A* S' o( j) u5 _6 R" F' }" F& Q' Q! \# Y, `, Z
                      if(hRes == S_OK)
4 ^7 Q' ^+ u$ ^7 B                        {
3 l$ b/ H2 D! L  y                          AnsiString s;+ Q' A0 m" Z; A8 g) l
                         Variant v = *(Variant*)&vValue;
) M) N2 K+ Q4 y) W. O                          if(v.IsArray())* M+ a; F. C) K; r; |1 m
                          {" w9 |7 h; W# l* K3 ~8 v
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! W9 x; L9 Z: D% j! y                              {* R" X( t7 X" s2 Z
                               Variant a = v.GetElement(i);
6 w! M/ s! \% n$ V+ S4 l                                if(!s.IsEmpty())
- i( X. l2 ~# n) d: q+ w                                  s+=", ";
# K  j; t0 d* L                                s+=VarToStr(a);
* [: w! E4 D8 H7 ?. U& V' k                              }
; P0 i8 y) k. e3 ^                           }
; r! w) q& S; ^9 L, }                          else
. o3 ~, _! e0 @5 u+ Z                           {! L8 w# L6 A( [' \& @/ O/ p4 H
                            s = VarToStr(v);( I# P* }* A! I/ x9 C4 P% Y4 E# D
                          }
: i5 ^, t4 w) w1 m  K8 V9 J2 s                          lpList->Add(AnsiString(wsName)+"="+s);8 F2 Y8 q, K& ~6 a4 B
                       }
. {; j, c$ p$ y( }/ z
. r6 t1 l, `# k0 n; j                       VariantClear(&vValue);6 @1 w) d- {6 i5 z0 c( ]9 N: K& M' }) T
                      SysFreeString(wsName);* a5 ?7 J9 L  n( v8 S
                    }
4 j% y2 G0 Y, ?; ~, |& b$ }                  }: v% R- ]" |. a/ e6 [! k( q5 b
                if(pvNames)SafeArrayDestroy(pvNames);
0 k  n$ m3 m* w1 J6 g9 L                 iEnumIdx++;+ d5 _& ]5 ]3 ?* I' D  n
              }4 T/ `( _, Z5 ?. E3 Y2 e
           }
. P. m4 k4 \: J/ d. U6 x           if(pClassObject)pClassObject->Release();
' M4 f9 D5 c3 H3 @         }
* [! h" Q# Z4 D4 B7 i# R        if(pEnumClassObject)pEnumClassObject->Release();% t+ ]$ O9 i' @( q, {
     }+ V% M3 Q2 H! I) {% l
    if(pWbemServices)pWbemServices->Release();
/ ^" ?* O8 f) ^6 H! s% `6 L1 y   }4 A! r9 T; Z* N3 Z; ~5 d% H' X1 _  v
  if(pWbemLocator)pWbemLocator->Release();
( V3 \( g0 {1 u1 L}* E7 z( U# g* C. N- B* a4 n. Y" L' [
//---------------------------------------------------------------------------
6 e* @9 O3 \- R* N! m
5 M* W# K5 L/ _$ |// 通过 WIN32_bios 获取 BIOS 信息:
, u- `3 ?9 u! ~void __fastcall TForm1::Button1Click(TObject *Sender)  W# p) q. O+ m5 L4 J
{2 c& q9 w! p7 I1 A
   Memo1->Lines->Add("================== [WIN32_bios] =================");
6 S. S& l* m- d- t9 u/ l) H$ `    GetWmiInfo(Memo1->Lines, "WIN32_bios");5 \4 K: ]! T# r% C, q& i
   Memo1->Lines->Add("");6 M+ {, \# T' b
}# x8 H; c, I6 o7 J- O
% u/ I0 M& x/ a; S7 W
--------------------------------------------------------------------------------
$ I7 y! ]: J+ U2 c/ T
2 E3 J0 q+ r4 n# BWMI 可以访问的信息类型有:0 t- \  c% P2 K
  Win32_1394Controller0 b# k0 j: o5 \. U5 ?6 o" L
  Win32_BaseBoard& s: N! c! a0 G3 w+ o: `) q
  Win32_Battery/ ^7 E; `) b2 s& [! r
  Win32_BIOS5 B1 f! |; t: [5 I
  Win32_Bus
, t  {0 V7 O5 s0 J   Win32_CacheMemory
/ O. O; {1 P6 y) y" ^# h+ _5 f   Win32_CDROMDrive
9 _+ V% p( @8 e9 e2 P' E   Win32_CurrentProbe. i0 m. ?) c4 \0 G% B' x) Q3 D
  Win32_DesktopMonitor
/ m4 k5 ^! E2 P9 C   Win32_DeviceMemoryAddress8 T8 X7 Z+ o6 H. ~% `$ U8 p
  Win32_DiskDrive$ s9 A6 P8 F7 l. W7 j
  Win32_DisplayConfiguration
$ Y2 a, L% x& l& n   Win32_DisplayControllerConfiguration( [- ~) W7 @2 Q/ h! P% k  \; Z
  Win32_DMAChannel5 }& x. l) t8 k4 }/ g  i
  Win32_Fan
0 a2 ~* E1 _/ H- x3 G   Win32_FloppyController# P# @1 w2 r$ m/ b
  Win32_FloppyDrive
% f1 o. b/ |/ S' E  a   Win32_HeatPipe0 G8 L! j! z/ i  g+ {  K4 ]
  Win32_IDEController
+ _- G2 \6 n" H5 i   Win32_InfraredDevice2 V& {8 p* s6 y9 W0 Z* L7 W# z6 j
  Win32_IRQResource
  r, _0 i6 l2 e# w   Win32_Keyboard
* b5 M5 y8 R0 Y0 e   Win32_MemoryArray; a/ Q9 {! H( z
  Win32_MemoryDevice
) I# h& X: j5 P& s: E8 j   Win32_MotherboardDevice
) _) a9 W- e6 m5 [8 ^   Win32_NetworkAdapter; P. M& v& Z- @
  Win32_NetworkAdapterConfiguration0 z* q' j* r* J5 D
  Win32_OnBoardDevice
4 Z$ r# i9 f+ O- p   Win32_ParallelPort
' S0 H+ N8 b. ?/ x; U   Win32_PCMCIAController
  m" z: b0 j% F9 P, l- g   Win32_PhysicalMemory: i  [( ]% a% X3 J4 O5 n6 Q7 I
  Win32_PhysicalMemoryArray
$ B3 q: k/ q2 g/ M   Win32_PnPEntity# H7 n! R% r- }" U
  Win32_PointingDevice5 p0 a& F& R1 ]9 t$ u/ o
  Win32_PortableBattery. q$ C! p2 h& p/ l5 A
  Win32_PortConnector
$ e* g) [/ Z  O+ o0 _0 Z   Win32_PortResource
/ q( T) @. U, J7 A# i; k" L   Win32_POTSModem
, }# M9 ~. r3 q" Q" C3 X, M   Win32_PowerManagementEvent  K  o" J0 R/ o1 W
  Win32_Printer6 M5 a" ^4 X5 P$ N: `
  Win32_PrinterConfiguration8 V) X4 K; V! Q: S; [" O8 v
  Win32_PrintJob
4 z: u# N  f% l   Win32_Processor
# B1 P/ P" z) Z/ @# u   Win32_Refrigeration: c5 `: Y  l+ f* u* o0 M3 J; u5 ]
  Win32_SerialPort& Z1 m0 y9 X' Q0 w* K" l
  Win32_SerialPortConfiguration
- N( t+ {" ]2 g7 O5 u: Q& d   Win32_SMBIOSMemory$ ?, [$ U# Z2 {- V& K/ A3 }
  Win32_SoundDevice, F, t$ Z. n" J( \% H4 s, q6 v3 v
  Win32_SystemEnclosure
$ I8 Q6 @6 [" l2 c# y6 d   Win32_SystemMemoryResource
* \& |% h. s. _# K) `   Win32_SystemSlot! Q. J& q: j8 r% l/ k
  Win32_TapeDrive. |; K4 z! D; P6 {
  Win32_TemperatureProbe
. j1 ]9 E* I: }( Y   Win32_UninterruptiblePowerSupply( @! ]3 e. _. T! N" M. K7 X  h
  Win32_USBController
& v" |8 C# a! t3 p) J   Win32_VideoConfiguration
; |) I" S/ o* g   Win32_VideoController
# ~) f( ]* V! X" [' C- ~   Win32_VoltageProbe
* S6 Y8 c% [  A0 R( H% J/ W4 s
% I% [4 d% W# n& c% c# D: w) j以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-12 01:10 , Processed in 0.022218 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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