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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)' G9 g. n& @& o
" D7 y% q: j8 T' K' [, ]

  S- a& A' ?8 Q. \/ F1 u--------------------------------------------------------------------------------
0 a4 s8 I! h% BWMI: Windows Management Instrumentation (Windows 管理工具)6 T* b& j7 ~$ l5 Q7 l/ b+ N
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 J' M8 O3 C' R& C   利用这个工具可以管理本地或客户端系统中几乎所有的信息。( d  G! N% T& ~5 `5 Q6 k$ f% Z
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 & r; u: H5 P# U) b

1 X1 Q1 ^0 V1 y--------------------------------------------------------------------------------
( d" g, x- w  r# i# S% w0 C+ dBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 V+ d; O# H8 _- k4 g/ H

  f! R4 i& Y* T: Q9 x--------------------------------------------------------------------------------( H7 `$ q! X! B0 G
① 初始化 COM 接口:
# f. N+ }& @- Z+ a" S+ J2 Y  B   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- Y- r% K: W; V. ~9 n. E6 K
  这两个函数在 #include <comdef.h> 里面定义。/ \$ m& @8 K; n+ Z( r
$ t+ W1 u4 `2 H4 p2 o# k2 W- v
② 获取访问 WMI 权限:/ e4 M# x" o2 M4 ?: }
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ P* @5 c& Q' u# c( C* V4 M5 ~
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。' u5 p' N# Y  U
. T3 e9 ]2 \0 v! G
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
4 U5 ]# j' H9 i0 @. N' q, _7 V. A   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
4 B6 o" ?6 H, @. s# D5 P# A* f. L
$ _- [7 ^4 Q, v9 \) n$ Yvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
7 N6 {4 o, E" K5 S& z: y{
4 h, |9 C) D/ y  IWbemLocator *pWbemLocator = NULL;( p( z+ [# a' y
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
8 p9 o  s2 T% N   {8 U5 j5 B1 z: j' S# N% t2 S9 @1 \3 D# O
    IWbemServices *pWbemServices = NULL;$ [+ S, p" I# Q; ~+ |
    WideString wsNamespace = (L"root\\cimv2");( X: f# O& Y- R$ G6 |) [8 v! r
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)# i1 p9 {+ S! g# W
     {; C; x/ N3 }9 H/ }6 a5 X, p
       IEnumWbemClassObject *pEnumClassObject = NULL;
5 B: T+ Y7 ]  B+ N0 a+ I  E        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 S( A5 k6 c1 j1 A' r. ~5 R* x        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)3 E2 w% G( l) S: R6 S1 n; h
        {
: U; |7 `. X: b( k: W( v           IWbemClassObject *pClassObject = NULL;
) w* A1 x6 F* U: j  o1 p; P           ULONG uCount = 1, uReturned;
! s! E# D" b% A$ @+ }( f. h           if(pEnumClassObject->Reset() == S_OK)
; e2 z6 }8 g1 O7 @$ m* @1 E            {# p7 `3 Q4 Q  q" F! T
             int iEnumIdx = 0;0 T1 b+ k% b# @* E
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)9 J& c, E. B8 v! A, {' g
              {
/ L$ J6 ?% {# \& \3 C# v5 a                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
4 C  n, L! s; R1 W, Y1 G) t2 w2 N+ T3 R2 R" W- b
                SAFEARRAY *pvNames = NULL;) e" X' u6 t) g1 ~  j' q
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  v8 u/ _7 J1 i# @& f2 j: K
                 {2 \  q$ O6 a+ X; t9 s8 N8 t
                   long vbl, vbu;+ j8 T6 i& u/ h8 k
                   SafeArrayGetLBound(pvNames, 1, &vbl);6 w% z5 }9 C: _. m6 p
                   SafeArrayGetUBound(pvNames, 1, &vbu);
/ a1 Y* j% B) ?/ l1 e& L. g" n  U                    for(long idx=vbl; idx<=vbu; idx++)
! n7 ^' e: s6 C& l0 ?# A' W                     {
- |( B3 W: a; l/ i9 |                       long aidx = idx;) ~, c% d/ [  {) j- y" v
                      wchar_t *wsName = 0;* `  O1 u* c+ @7 j* k
                      VARIANT vValue;! W" D) M$ C, }  a8 E
                      VariantInit(&vValue);
# ?6 |' d9 K3 v8 B: n                       SafeArrayGetElement(pvNames, &aidx, &wsName);+ u" ]' M" e& P" K

1 S' p9 K) F3 T/ x% `$ ~, o                       BSTR bs = SysAllocString(wsName);
+ m" R% N1 W5 O$ F  |, }# v                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);1 V# D: q1 H' @7 Y) f4 _
                      SysFreeString(bs);
1 x1 i: E0 @5 N/ h
6 u9 u$ J2 `; q3 f; R1 W6 i                       if(hRes == S_OK)
: `) m( |7 n! v0 g+ H# J                        {. z, |2 E6 M( {4 Y( D3 @8 ?
                         AnsiString s;& G1 f+ M$ \: k
                         Variant v = *(Variant*)&vValue;4 Q* g! Z- H  w: N
                         if(v.IsArray())1 B0 q6 N/ J% T8 T: N$ F
                          {0 R0 O* F  n% C1 L
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! J( t2 Z2 n- e8 ~                              {
7 b! U' G/ a# q/ d                                Variant a = v.GetElement(i);
( L0 l8 h- p8 C- R0 [; U                                if(!s.IsEmpty())
8 H3 U$ K$ t- f+ P; U1 q3 ~1 h! w                                  s+=", ";5 y4 a4 m$ r" u0 L0 Z& ]( {
                               s+=VarToStr(a);
* M* m8 _9 A) f# j0 M6 j, H                              }% h* t' u& N* V
                          }7 b) S9 k; `3 i0 |! n4 G
                         else  x' M. o4 t+ g# m! ^7 h
                          {
! ~5 a& }; H8 W; Z                             s = VarToStr(v);- e3 B4 O/ ^4 C, E7 P
                          }. G. e. C4 [- R7 }' [& f
                         lpList->Add(AnsiString(wsName)+"="+s);: e3 {) S' M- C
                       }
1 Y0 Q) y5 M, G7 R
. i$ P9 F1 G# t6 k                       VariantClear(&vValue);
, [9 ]' C4 S0 d5 F                       SysFreeString(wsName);6 X/ R3 R" v- u# u" ~  [; n$ h, U( W" i
                    }3 x* F% O2 V) [2 T( `- A
                 }) t0 K$ J- f* n" o1 G% \6 e5 j
                if(pvNames)SafeArrayDestroy(pvNames);  C' B, V9 n  U. |9 Y1 O6 n/ ^
                iEnumIdx++;. i& ]/ f) n4 R! c- Y2 T+ n
              }
) J7 L3 f, k. O% x# C9 y: \            }
. Y: ~: Q! z# m+ I           if(pClassObject)pClassObject->Release();
1 z" C* l4 ^- E0 ?, z5 A$ c6 ~. V% V         }" |, ~2 ^' G+ z( [, }4 s
       if(pEnumClassObject)pEnumClassObject->Release();* a. _' y- P6 i2 a7 c
     }
# V- B( L) n- |" u' n     if(pWbemServices)pWbemServices->Release();
# a5 `8 u% L: q9 w8 b7 a; P   }
* L8 O$ |9 P+ H+ q+ E( ]  if(pWbemLocator)pWbemLocator->Release();
5 h" d2 a  E  s' L7 P}
6 G* I3 d7 a' b. s+ _' l//---------------------------------------------------------------------------3 }7 @0 Z. }* z& N
9 W) v- o( o) d- g  J1 Z3 j
// 通过 WIN32_bios 获取 BIOS 信息:* l# r- d( L; S  n
void __fastcall TForm1::Button1Click(TObject *Sender)
9 w, _7 R: {2 A9 c/ v{& P7 R; q( R3 E! Q% ~$ `3 p* w3 Y% D
   Memo1->Lines->Add("================== [WIN32_bios] =================");
  O+ G% Z. T& Z    GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 `8 \% y- \) k# c    Memo1->Lines->Add("");6 Q3 K) X- a  w$ ^4 q5 l0 `2 X
}
! V  G2 o$ N2 X7 P1 ?$ e9 J# A: n/ ]# a  f
--------------------------------------------------------------------------------' l9 b, F" n9 S- i1 e$ {0 `

5 P+ ^' e4 t1 L; f: KWMI 可以访问的信息类型有:
/ _( {1 I5 q! l6 P# e   Win32_1394Controller
. j, `, s  c1 b# Z   Win32_BaseBoard
% c4 T9 ^3 v8 i2 {   Win32_Battery" a) u: a( k# r* ?8 l0 F
  Win32_BIOS
1 n+ K8 I5 W4 A3 Z. }( L4 S1 u# K   Win32_Bus
0 [4 ?* ?8 b4 }6 c$ J   Win32_CacheMemory
% I! ?& X" u  J( k4 ?. V   Win32_CDROMDrive
9 j6 S3 Z0 \: C/ D- Q& V) C   Win32_CurrentProbe
, F4 d- W2 I' v- x' ^   Win32_DesktopMonitor/ ?' ~% i2 A0 U# k% q% c% W4 r
  Win32_DeviceMemoryAddress. `4 D3 Q" G$ e) N' B
  Win32_DiskDrive/ k8 U  P. D8 S2 r
  Win32_DisplayConfiguration
, }+ l1 i+ r+ c/ S* p% s4 {   Win32_DisplayControllerConfiguration+ `1 _5 C% f  G2 q
  Win32_DMAChannel- _% O8 ~' {4 b8 O5 i9 u
  Win32_Fan* h9 m8 t* Z( n
  Win32_FloppyController  u% p! _" b: L0 U3 F* c
  Win32_FloppyDrive
9 [, V( r( q) B+ [. \   Win32_HeatPipe, D" [# c* y# S7 P; M2 T2 |7 z* U( h
  Win32_IDEController
8 i- P0 o: h1 ?$ i% |/ u   Win32_InfraredDevice
- D: E9 ?" ?  F- }* F$ a8 S, a; l   Win32_IRQResource4 k# {% _0 I/ V8 k5 o; O6 V
  Win32_Keyboard& v/ z: x8 s6 G9 M- G/ ]* J# k" X$ E
  Win32_MemoryArray
+ {, x2 u: V9 t0 {: b8 P" Q& N   Win32_MemoryDevice* P8 C( _& m: B; `* a
  Win32_MotherboardDevice
' x8 g* O4 P7 G7 }7 G   Win32_NetworkAdapter" |3 L+ v: P' T: A% y9 W
  Win32_NetworkAdapterConfiguration6 K+ v. J4 s' D- n1 T
  Win32_OnBoardDevice
4 d+ R5 w- t5 w5 d   Win32_ParallelPort
3 h7 K& P; c" A6 A# N$ `! P   Win32_PCMCIAController- z/ K+ x. ]% R0 f2 ]: F4 R
  Win32_PhysicalMemory* h+ a: f- s9 |1 ]
  Win32_PhysicalMemoryArray9 l" s9 h5 D* [8 y8 S
  Win32_PnPEntity9 {; W& B& e9 E& `; G5 H7 x- H
  Win32_PointingDevice# U5 d8 U3 I! Z) B* W( l
  Win32_PortableBattery
: |) Q3 M9 `6 ~: n- ]   Win32_PortConnector
) z. H+ i% _; g: g   Win32_PortResource/ X" X3 ^# `1 D* u  A' i$ U" ?
  Win32_POTSModem9 E% c" D  g& w4 v3 M" j
  Win32_PowerManagementEvent
3 h  @4 v3 w( a& E+ U1 M% ]0 m8 c1 s   Win32_Printer6 T# n+ w/ I6 M# G# M
  Win32_PrinterConfiguration: N/ z; M3 G$ X. Q
  Win32_PrintJob! X2 ~. u5 s* @  f7 v0 b; o
  Win32_Processor
4 {+ u7 o6 a- v0 d' F2 P   Win32_Refrigeration! E) l/ [6 o& A) t2 m
  Win32_SerialPort' r9 R6 p6 N+ G( s* C. ?( o
  Win32_SerialPortConfiguration
' h6 p1 _( {% y$ F; _) C# K$ a- F   Win32_SMBIOSMemory: v8 Q+ Y! T0 S( o
  Win32_SoundDevice4 R/ n3 Y  C, {6 \; ^6 d
  Win32_SystemEnclosure  i1 u% F) M& `+ Y8 r# {
  Win32_SystemMemoryResource$ B5 ]9 z8 [7 w! \/ H: b
  Win32_SystemSlot: y: m6 i& Z1 `% z/ [+ P
  Win32_TapeDrive) q' _8 `: ?: f% V! k  |
  Win32_TemperatureProbe
$ {! s5 [1 c# o7 X* l   Win32_UninterruptiblePowerSupply
2 n8 b1 ?0 t- l( `6 ?   Win32_USBController
4 o0 |6 J! z* k2 ?. Q0 o# l1 h! R/ `- {   Win32_VideoConfiguration
% z3 D- @1 v% Q% \" t  k* p. I   Win32_VideoController
3 p7 L! ^; [" ]. @) g8 y% }/ l   Win32_VoltageProbe8 S1 E/ Z. k0 m9 F, O9 T: m2 T

5 T! u7 }. k$ v& U" c) l6 W3 N以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-30 11:37 , Processed in 0.018973 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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