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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)! I3 k0 F/ c* P2 h6 }- @' h

: ?5 C- B5 U9 o/ k+ f8 D
4 V0 X# W0 ?% S0 v. W$ r--------------------------------------------------------------------------------3 C* ~( K7 o" h& w, T
WMI: Windows Management Instrumentation (Windows 管理工具)# k% x! _9 N  l' d! E
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 8 x' V* T( z/ \* E8 f6 E0 l) Z
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
( L  i# Y4 K' s   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
9 _  S' H  |2 c2 `
2 M1 _5 I8 v0 @--------------------------------------------------------------------------------7 N) {0 H% M5 N- ]# K% x; j
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面' h0 i' y7 E8 d' v

( u8 M7 S- v! r- o--------------------------------------------------------------------------------
) w" `+ i5 p1 v& P! E① 初始化 COM 接口:
6 \1 @) v. k4 v3 Y6 E% o   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ p3 w5 U7 T* L' y
  这两个函数在 #include <comdef.h> 里面定义。) y1 M9 B) R, O6 {# N

! a5 `5 z2 ~6 Y. |- q② 获取访问 WMI 权限:5 W& J8 J; u3 l3 `4 H5 \/ \$ b
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
% c+ l/ O+ A0 q8 E& W  o7 w   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 f5 E4 c2 _6 f) V0 u& w0 B9 ]2 {3 x' p
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:! s; N( V" ^! q- ]
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
7 x. l9 {1 L) G& h5 S- R( l" o8 ]1 v- z. V5 Q; ~7 G/ i
void GetWmiInfo(TStrings *lpList, WideString wsClass): F/ n. B. B4 k6 ~
{
6 R, L* Q; X; K  IWbemLocator *pWbemLocator = NULL;
0 A& v& |3 k, }# _  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
; W7 j5 E5 R+ J( w   {
5 Q2 Z+ c6 a; F5 l/ G     IWbemServices *pWbemServices = NULL;1 ?% M+ I7 l$ F0 p( S2 F4 R1 {$ k
    WideString wsNamespace = (L"root\\cimv2");
: M) p6 H: I* `; ]7 g     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
2 n* j! V: }) ]; H- A, V      {
- D- k9 b( @6 A* A. k        IEnumWbemClassObject *pEnumClassObject = NULL;
8 j' I- C! S' [; r1 b        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;2 D! ]8 G5 W2 F! [
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
& x+ \+ m2 |1 x6 h         {3 q8 Q/ Y! G% ^* G
          IWbemClassObject *pClassObject = NULL;! {4 o5 q; ?# ~+ N
          ULONG uCount = 1, uReturned;
: h* h* g, l; c  e           if(pEnumClassObject->Reset() == S_OK)4 H( c. C, Z5 I, F7 d  R( r( y/ O# x
           {
9 R' n8 @2 [9 a" z$ s" ?4 P              int iEnumIdx = 0;
3 Q9 H2 d% J0 @* l/ ?4 k              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)2 T; K- b& |$ f$ B8 E
              {7 y* Y7 F/ ~$ F9 ]
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");* H+ A4 S4 x5 d5 }

' H  i0 l  a% b9 q& B0 A. A& l& y+ Y                 SAFEARRAY *pvNames = NULL;- v# j" R  s! M& G+ C
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ k: [- X$ W! n* E
                 {
5 [+ I9 t0 N+ @" Z                    long vbl, vbu;" k% H3 Y. I/ s# r( [* D$ I
                   SafeArrayGetLBound(pvNames, 1, &vbl);
6 N& A) h9 `( ]" j) Y# g) Z4 B, u% R& s7 p                    SafeArrayGetUBound(pvNames, 1, &vbu);  d5 ?6 v7 K! b( N$ X+ b! w
                   for(long idx=vbl; idx<=vbu; idx++)
% j# {( x3 s1 G! x                     {- W1 J: M, \4 i# c0 I1 n$ t; R4 z
                      long aidx = idx;
* {) C6 w$ ]8 f4 R$ n0 R                       wchar_t *wsName = 0;
, S; c$ A9 x; Z7 a8 M. }- I: {                       VARIANT vValue;
. v! A5 e# J+ f7 B9 L' x. _                       VariantInit(&vValue);
; x6 L# ?' F, m' |" r% v                       SafeArrayGetElement(pvNames, &aidx, &wsName);
3 A1 U/ {$ I2 N; E0 i7 C5 }* |
, E8 n" K1 F+ X8 `, G8 f1 p( `                       BSTR bs = SysAllocString(wsName);9 x5 v8 a2 \* S. Y, j
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
7 R4 D0 T# K: }3 _- U                       SysFreeString(bs);
: w4 B( G, H) {, K& g* ]
) M7 ?3 w& @2 S4 H# f1 D                       if(hRes == S_OK)# `- }  i0 u0 K# w& _
                       {0 o& j8 b" x0 ?+ E" U
                         AnsiString s;
5 y2 w2 D* K5 A& {' |                          Variant v = *(Variant*)&vValue;+ m2 ?, S7 r( l6 K
                         if(v.IsArray())9 F$ \5 X/ d" P: M2 h: t
                          {
: O# Q9 ^2 z' V+ R                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)4 }) S/ f! D  }! ]8 z
                             {3 W! X" g, t0 z% O2 t2 i2 x
                               Variant a = v.GetElement(i);
5 g, u# W: R0 _6 u! N7 Y                                if(!s.IsEmpty()); o& x5 [7 }7 J/ L/ M2 q
                                 s+=", ";
$ _0 n! }+ Z1 p, N                                s+=VarToStr(a);
1 v0 I, J. T& k# C" Z  [  a1 Y. M                              }
" ~* e' i2 c- j. n, M; J                           }* {  Y6 H; X2 G, \8 G, J# u1 K
                         else
& w% b. ^  g  E- o6 [( e/ R6 R                           {1 n% m  }& T, O; i& h) Z  \7 _
                            s = VarToStr(v);. ]$ _8 J2 W2 U4 u- v
                          }
$ a9 q8 b% s+ I. s- j' V                          lpList->Add(AnsiString(wsName)+"="+s);
* Y8 Z. t7 j9 g7 ^1 |0 k9 r; F9 b                        }
# B0 ~% n' L7 n% F+ @) m" w# r/ J3 R( [  ^
                      VariantClear(&vValue);6 g' X5 [8 C' b5 D  K2 p
                      SysFreeString(wsName);
1 ^6 ]" S% z7 R5 ~1 u2 [# e$ ?                     }
& x5 I: V3 Q; x0 u$ f8 X* u                  }/ e4 b, l! V8 w- ^
                if(pvNames)SafeArrayDestroy(pvNames);3 C9 s  l' f$ N! T
                iEnumIdx++;
! }* F9 p9 C  }7 R1 `1 \% I" I               }! j7 ?- b4 Z- @4 l
           }, ?( g9 z# E+ H9 U$ v9 |: z
          if(pClassObject)pClassObject->Release();
5 A: {3 [. Q3 v& e5 c         }. Z2 y9 P6 E7 L0 m) x! r0 b
       if(pEnumClassObject)pEnumClassObject->Release();+ b+ U) I- n  K- H
     }
. p+ q/ i0 H4 g  E2 l# C( w: S     if(pWbemServices)pWbemServices->Release();+ n0 ]. W/ y  l' v* d
  }5 v- G3 U! Z! S" o8 S+ S
  if(pWbemLocator)pWbemLocator->Release();; d( ?+ F1 @" a) q8 K) W4 [
}
& z' u# z7 v% T) Y5 ~//---------------------------------------------------------------------------
% d4 q  |/ ~- |' V4 n# w" c
4 Q0 w) a7 }) z6 {/ B// 通过 WIN32_bios 获取 BIOS 信息:
, F4 D; P8 J" G) Q- u, K) Pvoid __fastcall TForm1::Button1Click(TObject *Sender)
: ^6 X' a( }. o5 o1 T{
0 B  _( a6 N; m8 E1 m6 y    Memo1->Lines->Add("================== [WIN32_bios] =================");3 h! k: z+ W; V1 x' H
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
( R) Q3 ?" H- j) `7 @: n    Memo1->Lines->Add("");
8 i; V4 J( U4 z0 c}
9 S( {# t) r- t$ T3 o9 W9 }3 q7 O  ?7 ~9 Q3 v2 j# }7 q
--------------------------------------------------------------------------------3 x4 C9 w! ]3 f) o

# V# H6 f4 D" L& i/ q8 `$ ~WMI 可以访问的信息类型有:
. P% k' ]9 y  Y+ n$ B   Win32_1394Controller
6 w3 z3 }! R3 V: b( T6 b   Win32_BaseBoard% {! i4 H" D/ W% Z; B
  Win32_Battery  T" I% k% I( {+ S: x- J
  Win32_BIOS9 G1 z! ^9 z: S" |' n
  Win32_Bus
$ A. A! r8 s# I( J5 n" ]   Win32_CacheMemory
* _' A3 P" m4 Y6 t, ~$ l   Win32_CDROMDrive
  j. w5 W% l- O3 s8 W   Win32_CurrentProbe0 c) t. \/ {3 A8 @$ t
  Win32_DesktopMonitor
4 i8 ]4 u8 R% z; c7 v   Win32_DeviceMemoryAddress7 E) N7 ]# D8 y
  Win32_DiskDrive. L7 i% s" F# P2 D
  Win32_DisplayConfiguration0 ?( f2 x, ?* j, h2 n( N& z. h
  Win32_DisplayControllerConfiguration
% H; @3 i0 ~+ s   Win32_DMAChannel
# F! w; [. [; Z9 r' b: J7 f  Z) Y   Win32_Fan
, K2 `( L. p- u: {5 q- ~   Win32_FloppyController
" v" Z' ?1 H2 z! u; A   Win32_FloppyDrive
4 q: ~$ o* l; F  f. X   Win32_HeatPipe3 [/ `& U3 L7 A( c0 x$ w4 f1 F' @
  Win32_IDEController0 ~* O$ y! x; r
  Win32_InfraredDevice
/ ]' Y8 d; N! ?% E1 z# w: G& h   Win32_IRQResource( N, o" B* c: d
  Win32_Keyboard  x' {* b% t# ^  s+ ~4 |! h/ T
  Win32_MemoryArray
8 i# v* f( D) ]- l6 Y+ w   Win32_MemoryDevice4 y! N8 T' d6 G
  Win32_MotherboardDevice
! i. t2 T  y2 L* _   Win32_NetworkAdapter9 I$ h3 |( i3 n, n5 q- e
  Win32_NetworkAdapterConfiguration
- i! {* X( E6 P# ?/ H   Win32_OnBoardDevice
1 S' }# h4 f5 ]4 U( Z5 q1 N   Win32_ParallelPort
) m0 |. b9 ?5 v" M   Win32_PCMCIAController$ ]8 a& _0 Z9 R( h0 h! P5 G
  Win32_PhysicalMemory
& N0 ?, T! \9 i7 |7 H   Win32_PhysicalMemoryArray" w1 o9 `6 `% w4 w9 S$ ]7 u
  Win32_PnPEntity, f* y5 B4 M2 ?% _% N& q
  Win32_PointingDevice9 |  r8 J5 ^7 P( C" O1 X+ H
  Win32_PortableBattery# H1 d9 j3 @8 ^- b6 ]$ f: `* J
  Win32_PortConnector
- P# S3 I: V2 H1 t   Win32_PortResource* W, ?  C  _2 [0 ~% `
  Win32_POTSModem
* n$ o& {3 G! }$ d. S   Win32_PowerManagementEvent
; S7 @& _; a9 M% I; [8 N/ W   Win32_Printer, G5 y0 K0 H. q; f
  Win32_PrinterConfiguration6 `; ]7 A# ]7 P# X. V  }
  Win32_PrintJob
0 M( z5 A, p) x8 ]1 g4 K2 t+ |) w   Win32_Processor9 l2 S/ r! s. Z8 t& R
  Win32_Refrigeration
. H$ g" U7 I4 j% N3 {   Win32_SerialPort5 J+ |2 n! ?( l, \6 S. d8 [
  Win32_SerialPortConfiguration
1 {4 o: N  \* A* x$ S4 l9 U  `! O   Win32_SMBIOSMemory
0 ?$ l# r( ^1 U8 G8 H7 R8 s   Win32_SoundDevice
: f3 k" |, ?) `. T5 S  B& o   Win32_SystemEnclosure  N: v9 {) M, V# p  J6 b
  Win32_SystemMemoryResource# F% ?& F! X( p; M
  Win32_SystemSlot  S! S5 A6 F/ y% a. r5 g" P8 O/ c
  Win32_TapeDrive5 ?6 e: @& S% N9 y: H
  Win32_TemperatureProbe
% J$ O( t2 q+ Q; W% t1 Q1 n( d3 O   Win32_UninterruptiblePowerSupply
3 p2 o4 w  T$ ?. p8 q4 Q   Win32_USBController
; g6 ~6 [, n6 @6 M$ g   Win32_VideoConfiguration' ^% Z; S! j6 ]
  Win32_VideoController
2 p( r' C+ j6 }1 ]$ e2 v; i   Win32_VoltageProbe
( B# X. I- m; j6 U9 R2 }
1 y! c! p+ G8 a" p- E以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-6 02:10 , Processed in 0.018156 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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