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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)$ b" d3 Q) i3 E! R4 [9 _
* A! I7 s7 P4 H+ b

; o, F: M9 n6 }3 e0 f--------------------------------------------------------------------------------
7 `2 n# }' y% i  d7 v( o/ fWMI: Windows Management Instrumentation (Windows 管理工具)% @7 w4 {" C& T# \: }8 A8 h
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
# N. |: S7 O" @  v   利用这个工具可以管理本地或客户端系统中几乎所有的信息。8 K$ M& j2 f2 l. \5 a( a
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
, d( E  \" `4 k$ s( |
  j) z* `. E- F& h8 G--------------------------------------------------------------------------------' G9 g  r+ G' P; z1 R3 a/ |, S4 k1 D
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
. o1 ~& E! v: u
, j  H: s1 d% p" a" t, {* S. w--------------------------------------------------------------------------------
: @8 d6 R/ ~& M4 G( y! C- ~( P① 初始化 COM 接口:
( M! ?. Q7 d( Q$ o; b2 `5 T( H2 u   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- t# z: m; T& X5 ~8 m8 R
  这两个函数在 #include <comdef.h> 里面定义。  L! G( |1 d8 I- s3 _+ \

2 W6 `) J# N! Z8 R  a② 获取访问 WMI 权限:
( @. U' R$ Y( W   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
  f  c- h5 h8 ?   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 Q4 {$ N- ?7 c; Q
* a8 K- B) m, {③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:- F' w. G4 v- z1 d, Q" q
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。' p4 z; |$ Q' l' R+ r5 l  z
& `8 j* U' M  \- {2 n" \
void GetWmiInfo(TStrings *lpList, WideString wsClass)7 g; ~! O/ V# v( w
{  o" ~$ a9 L; |3 U
  IWbemLocator *pWbemLocator = NULL;
0 K5 G: z& [; }  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' z. D( @! Z5 q/ O% x3 l9 G& g0 ]
  {
2 E2 V9 t5 K6 B6 N3 j% i: b7 ~7 L     IWbemServices *pWbemServices = NULL;
! o6 H; ~% J0 a9 y" @( J6 Z% G     WideString wsNamespace = (L"root\\cimv2");
. N+ E1 ~: e; L+ `( z     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
+ B& \* _5 g* g5 C4 y) [: Z% q      {
8 p4 a% Z5 T: [0 K/ o        IEnumWbemClassObject *pEnumClassObject = NULL;! o2 e/ d: q8 q: D% o$ x
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' k* U) _5 c: @- N# f) X0 e        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
- m% g3 g% w7 p3 t5 ]" n5 K6 E# m$ s         {
/ @8 V+ Y  n4 ]4 |! y: ^           IWbemClassObject *pClassObject = NULL;/ A0 w$ o# T1 q4 H+ E1 n/ k. u2 W
          ULONG uCount = 1, uReturned;
9 {, x) l. t* z) I. p           if(pEnumClassObject->Reset() == S_OK); r6 I! ?, _% L, U: m2 k' l. i
           {
" Q; @0 H  f7 `3 t; J: m6 l0 E  K2 `              int iEnumIdx = 0;, G4 t2 K9 B% ^* x- t" w! Q: P
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)4 {7 l1 ^- V3 W5 y
              {% u- E3 F, U9 S% [" g
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");5 z$ y" R* h  y6 _* l: ^4 b

0 X7 R' \; O8 t                 SAFEARRAY *pvNames = NULL;
/ K4 [: Q4 w8 e0 t2 z9 v2 U9 X                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 {- t, H) m0 x                  {
! @: g, `8 q* I. S8 T" x$ |                    long vbl, vbu;3 C1 M) C' h- f! e( l2 R
                   SafeArrayGetLBound(pvNames, 1, &vbl);. e2 d1 _2 i3 r, L  ^
                   SafeArrayGetUBound(pvNames, 1, &vbu);5 A+ ?) \  d# H6 [
                   for(long idx=vbl; idx<=vbu; idx++)' M3 ~% E7 D1 L- a- M
                    {
" |& }8 D8 R( g' @                       long aidx = idx;
" f+ _  F9 D4 S7 t& T5 M% m* `                       wchar_t *wsName = 0;4 g. k: U9 X# R5 Q; r: W9 p. C
                      VARIANT vValue;
- r/ T' _0 ]* K, ?+ C                       VariantInit(&vValue);
+ H' b' v* N- J/ e                       SafeArrayGetElement(pvNames, &aidx, &wsName);7 |# T1 h. o5 E
- Y- U0 o% T- F" s9 M
                      BSTR bs = SysAllocString(wsName);
: V* X+ ]$ Z5 ]! H' ]2 B. p                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
/ c0 I' d" s; B& Y' W% n9 J                       SysFreeString(bs);
. u0 X# E: Y, b/ q$ v" ^; x1 S4 `( E' q' ]7 r* _6 o
                      if(hRes == S_OK)9 Z) u. F( C$ J9 B$ W% b
                       {0 B; ?. {! f, `) R9 ?) x$ ^% I. r
                         AnsiString s;
2 H; {. l$ D4 ~3 {. N4 y# M; a" F+ R, ~                          Variant v = *(Variant*)&vValue;5 X$ A8 t- g( h0 i- F% _
                         if(v.IsArray())
; {  T) |! E/ l' s                           {6 `- U% o0 L# L3 `2 w+ U
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
* ^, s' \) t/ x! ~0 n                              {
4 X. ^+ w  P6 N, ?: ]1 W+ d2 Z                                Variant a = v.GetElement(i);
2 l2 T3 {& Y# G" y) e, _                                if(!s.IsEmpty())
) V9 B: e1 D! T' {                                  s+=", ";% x- x. y* n( x% i" p
                               s+=VarToStr(a);* T) p( e; N! k. l, l& H. t
                             }
1 O# `9 e$ U. }) t3 [                           }
; P8 N! v8 D! L1 I' B                          else
7 V( J( M' m' F+ o2 {                           {
9 W1 h5 E9 p" q: ~7 ?' H3 T                             s = VarToStr(v);
; K* m: y# e6 }                           }) Q- z% F% u$ h/ `
                         lpList->Add(AnsiString(wsName)+"="+s);
0 b$ r$ o, a3 o6 j) W5 \* H+ D5 C                        }
7 t* X3 @0 A( h9 O& \  K$ N' F: @( L2 e9 {9 Q' ?4 n- O7 r
                      VariantClear(&vValue);$ E, w; m0 S" r! P" |
                      SysFreeString(wsName);- T) L4 U' z4 h, G- S5 X! m& a! [
                    }6 `; q( o& W& y( O3 ~( ?% l/ K
                 }0 R; K5 i0 H8 |9 k1 C/ t3 z2 P
                if(pvNames)SafeArrayDestroy(pvNames);9 u* r: D" p2 K. P8 o3 ~
                iEnumIdx++;
. e, V2 ]" H2 G' `               }& M( c, c: x) C9 F. ~3 A  ~
           }0 b- L7 @& S1 ^) X8 \: w
          if(pClassObject)pClassObject->Release();2 N& h8 h& o3 U. @
        }) e1 g/ G% |& y) T& m# s1 t1 g3 J3 L% r: R
       if(pEnumClassObject)pEnumClassObject->Release();% h) L7 D% a" L+ O5 H2 I% p
     }& i  i  W2 K) J3 U: H9 k0 q* f
    if(pWbemServices)pWbemServices->Release();3 S+ `& _7 V) N2 G2 d- q+ Z* j: k1 |
  }4 g' a% Q- e. ?7 H& D) e( M) D3 J
  if(pWbemLocator)pWbemLocator->Release();8 z0 ?: F6 L0 w+ U
}
2 t2 b7 s9 T2 J//---------------------------------------------------------------------------
5 @' d  {" S* l  T9 A1 L# ^3 e# R! s7 a: f/ h
// 通过 WIN32_bios 获取 BIOS 信息:
" ^  R  g8 G5 Q' N. qvoid __fastcall TForm1::Button1Click(TObject *Sender)" ]$ ~9 k5 P, v. x- ?8 r; y
{
; R/ C# f2 C. Q# {: X    Memo1->Lines->Add("================== [WIN32_bios] =================");8 n9 m# i4 J( |: T4 R
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
$ k# s( v) u* f0 B0 D4 A* w& `1 ~    Memo1->Lines->Add("");5 u2 A. J4 C* z- M
}# w% m" f* S. ]+ a" V

- ^" X" t4 g& m, g# r9 p--------------------------------------------------------------------------------9 p  Y' K3 ^% }

; }$ {  ^7 B2 TWMI 可以访问的信息类型有:
% `$ f( e4 G0 {: j# X   Win32_1394Controller
2 W- q) D$ F0 k4 P. v# |   Win32_BaseBoard( W/ X& g" F- j0 o0 L+ R8 @' S
  Win32_Battery5 m* `' p) [& h6 V2 E# [
  Win32_BIOS1 t$ v; d: \3 z; E6 I0 q  A+ M
  Win32_Bus
1 V5 z9 j/ R6 z' X6 S+ g   Win32_CacheMemory
" Q; @' k3 O3 @7 [' V8 r) E$ \   Win32_CDROMDrive
( e$ w! Y2 v  O- C, z: Z   Win32_CurrentProbe8 `8 k0 N! l# _7 {! Z$ H1 i
  Win32_DesktopMonitor5 T5 B6 Y+ o- X
  Win32_DeviceMemoryAddress
, }4 B3 H% T3 l$ F5 r9 l- t, M   Win32_DiskDrive
/ B& H1 ?. s- F+ g8 |   Win32_DisplayConfiguration; u2 _; S) m! R: v% H
  Win32_DisplayControllerConfiguration; i; |" C  \/ S; G0 Y. ]& I
  Win32_DMAChannel
( T5 @* s9 V; v9 U  y4 R/ U# ^/ B   Win32_Fan
. X$ [- F* B, L   Win32_FloppyController( Q* U( ~7 @6 e% J
  Win32_FloppyDrive
* \* K; B& x' B+ O   Win32_HeatPipe! B9 C) e0 w8 l/ W
  Win32_IDEController5 w8 n6 M: j; P3 N8 \3 t9 |
  Win32_InfraredDevice
& ~% ~" S+ m% g9 X9 {+ C   Win32_IRQResource
( D- }3 E7 K" A+ Z. h   Win32_Keyboard
1 L. r' w4 k4 e% D1 Y0 w   Win32_MemoryArray
6 ?) J  a7 N" n% X   Win32_MemoryDevice; Q+ E* c- j' G) I2 ~  `/ ]8 N
  Win32_MotherboardDevice3 ]/ J. H7 j. n) @! E. g
  Win32_NetworkAdapter: x6 m" p1 r3 Y; Y, k
  Win32_NetworkAdapterConfiguration7 H8 r: }$ D( ^7 R& {8 A
  Win32_OnBoardDevice* I5 b( p% F1 R& p
  Win32_ParallelPort
  {+ q9 P7 F. F  `) O   Win32_PCMCIAController4 q% d) }2 B4 d. M2 x
  Win32_PhysicalMemory
" `8 v5 U9 [; t) C- I+ P   Win32_PhysicalMemoryArray8 H& @' z, V' T4 d
  Win32_PnPEntity
% r: W( d; w& ?: A# I   Win32_PointingDevice* H$ p7 Z* t2 ?, u- w# H
  Win32_PortableBattery9 w2 D0 F7 Q1 W, f& P7 l& S: q
  Win32_PortConnector8 X6 ]0 S) `+ g% y6 m) m9 A2 _! l
  Win32_PortResource
) G. b0 c7 e& S   Win32_POTSModem
, ?" ]# \' G/ w   Win32_PowerManagementEvent8 e( f9 y6 w1 u; N5 T4 B% L
  Win32_Printer
# P5 q$ y) N; i   Win32_PrinterConfiguration) D9 l3 P9 ?; r+ Z
  Win32_PrintJob6 F3 u# T! D: i% T( q
  Win32_Processor, z+ G7 i, B  {% M! ]
  Win32_Refrigeration
- R' L" i& G* B7 {) Y- t$ g   Win32_SerialPort
8 o3 s1 ?! V4 U4 E0 |! a: V   Win32_SerialPortConfiguration
! D: `9 Q# W$ q9 i. R2 m: M   Win32_SMBIOSMemory; u7 k3 b8 X$ x8 f
  Win32_SoundDevice
6 j* A8 @6 x* [: ?2 c- I   Win32_SystemEnclosure. n3 ^0 O9 O/ V, h$ [/ [7 f* }
  Win32_SystemMemoryResource
8 D) S- l: g1 G   Win32_SystemSlot
0 ?- j" R2 m6 y6 K; W9 X1 a& a   Win32_TapeDrive
: J7 {' f4 g4 p& y- ]1 x, n   Win32_TemperatureProbe
, ], z4 \( @; }$ b% X   Win32_UninterruptiblePowerSupply6 c+ m7 D! }5 o5 l; K
  Win32_USBController
" W5 i0 S  `+ S" q5 G   Win32_VideoConfiguration
# o2 E% y2 P" l# H, R7 D8 I   Win32_VideoController- L  ]" l9 \. y! A4 l
  Win32_VoltageProbe
$ n4 G2 R5 B! n1 ?6 D) M, C
9 Y3 v- M5 l: ?, V3 ?- f# }以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 17:35 , Processed in 0.019240 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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