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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
% o$ q  N0 ~! l
. t" w9 H6 G$ H- M2 e0 D+ N; ~. d4 h( v
--------------------------------------------------------------------------------
" D# {* F- j  A  \- _' W& sWMI: Windows Management Instrumentation (Windows 管理工具)" K  ~6 W" z& E5 y" N
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 R! C3 R: e2 Q3 |/ k# P   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
7 n& y. A3 C6 K   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 {1 }0 |1 q7 u$ N
  y' O$ D, a4 b( A' [--------------------------------------------------------------------------------
4 T' x( V; h# g( g5 A& RBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
* o9 W; ]# b) X! [/ L8 e% m: @7 V7 G- d. ^! K1 G
--------------------------------------------------------------------------------) h  Z3 Q0 |, C" M: J
① 初始化 COM 接口:
- H9 K$ h9 W  `5 ^   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。! R( ~- V, \( X$ X
  这两个函数在 #include <comdef.h> 里面定义。
, e% H( _* K( ~+ _: E; n9 w4 O# K3 n* O% U0 u
② 获取访问 WMI 权限:
+ `" e% |6 }" I, p5 ^, i   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 F; s4 S; F* I( W- z  R4 u: y   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
& w6 {$ D- V; Z" [" Q$ X( V6 X, b. J
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ d0 h! t, h  a3 H
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
' u8 X: u& y. U( [* l% g/ q9 i9 w% X) H. u) `! N
void GetWmiInfo(TStrings *lpList, WideString wsClass)
* U- F4 v6 n+ c5 y/ b5 k, u{( ~6 Q: x# Y/ N$ s6 a! Q
  IWbemLocator *pWbemLocator = NULL;- N6 G, M4 i& L; y4 \# X. }$ I
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
4 ~& \- F- @8 A. L& _; D, ?   {
/ F9 h& n* j* K: e& J, H" d     IWbemServices *pWbemServices = NULL;
2 S- d8 \0 w$ h4 w" y2 J# ~9 m     WideString wsNamespace = (L"root\\cimv2");
2 d- l+ ^1 Y: v9 k     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 x% K" D9 m: I2 r
     {
0 s! [, Z+ h8 a; V( q        IEnumWbemClassObject *pEnumClassObject = NULL;7 D# o7 v3 o2 g) P7 C- I6 j0 P
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
. k9 R. G8 a* N) |  d2 @+ B        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
& S! R# m, M6 _1 y         {
8 `( g+ X. A- Y9 ?7 D0 J           IWbemClassObject *pClassObject = NULL;
& O5 p5 h9 F6 Z4 v3 Q' o  c           ULONG uCount = 1, uReturned;* h8 J) V5 T! E
          if(pEnumClassObject->Reset() == S_OK)! B& J4 h, w# ^* H3 ?* ~. q
           {
5 S0 u$ B7 W3 F              int iEnumIdx = 0;1 n5 Q7 |5 y% c$ m/ i
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)- B8 M6 b* C1 B+ h9 r2 s+ L" G9 E, f
              {
$ w' [$ r) r9 w" _) y0 G- l                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");: d1 R: U6 y6 Z# o9 I# w, k$ v5 h3 z

+ [& T3 k: o3 a: y  O                 SAFEARRAY *pvNames = NULL;( Z5 `+ |2 J. W8 O2 @2 \6 `. w; P
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 N/ c0 j2 j  C! n                  {
  Z0 Y2 d8 _6 ~                    long vbl, vbu;
8 L& O7 b- r3 ~                    SafeArrayGetLBound(pvNames, 1, &vbl);9 N4 ^6 h1 R7 N3 l: X% W
                   SafeArrayGetUBound(pvNames, 1, &vbu);* C1 l( ^) H6 m( }- P4 h9 ~
                   for(long idx=vbl; idx<=vbu; idx++)$ t5 c& F/ M- V) H
                    {
  R' y7 I: G* t  h  \9 H2 h                       long aidx = idx;& H7 I3 ?. {/ l  F& A; N
                      wchar_t *wsName = 0;8 O4 X' C$ l# r1 `% r7 v4 Q
                      VARIANT vValue;
8 d( j6 q5 I% c! W' O                       VariantInit(&vValue);
+ g. c' p& B& V' ^                       SafeArrayGetElement(pvNames, &aidx, &wsName);
- R2 e; \2 W; t+ I! q8 S
; l* M% ~( ?, @                       BSTR bs = SysAllocString(wsName);) r3 [# k% \4 ]
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 _9 j7 s  U, J+ q1 q; c0 V
                      SysFreeString(bs);
! a7 i: L/ w; F; H) r1 W5 N0 @. j
% s8 j7 ?3 k* y/ f9 o: X% k4 y+ h6 o                       if(hRes == S_OK)
! j! t1 d7 u$ g/ r. q* U                        {7 X) h: g5 J+ Y3 D
                         AnsiString s;7 c+ D; T  `9 ~2 G; l
                         Variant v = *(Variant*)&vValue;
/ U5 e3 O$ u/ J# S9 Z                          if(v.IsArray())
7 [2 Z# M: |1 O; P1 Y" t                           {
) ]8 G" o/ U7 \3 R; l3 d                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 V% Y$ c( Q/ \. ?1 @0 z5 C- m6 i                              {3 j: l+ y/ |1 H+ `4 F6 o+ q' J; U
                               Variant a = v.GetElement(i);
0 @* U8 z7 k8 ^: z8 ]+ `: h$ G+ L                                if(!s.IsEmpty())8 x) K' P0 b& Y) G
                                 s+=", ";  l+ Q9 Y! O' e# I" A' b/ P% n! z
                               s+=VarToStr(a);
  U' m! {! t2 N) t" f- p( X                              }
7 k8 `: u% C) K4 n; s. a                           }
* \9 N8 l% x% o) U6 E1 G                          else) ~# Q, a) j8 L9 |9 ?  q
                          {+ l. M1 ]- S2 M+ b+ V4 y6 C
                            s = VarToStr(v);' k7 r: ]) c$ R( ]. r
                          }
% E; c1 y) T+ y; l, ?. c! b0 c                          lpList->Add(AnsiString(wsName)+"="+s);* e' a: ?$ |6 Y+ |
                       }
. c4 L) l5 G& B: {: T/ s& y* b3 z- r
1 Z# _/ j, P6 l! z* }4 [; h                       VariantClear(&vValue);! k/ q+ |0 O2 q& r% {/ |! K
                      SysFreeString(wsName);
$ C# w& x7 n, K( T+ Y8 [                     }
9 N/ I/ _: L* x7 u$ x  O                  }1 B; ?, l7 m- w: R, G2 k2 i
                if(pvNames)SafeArrayDestroy(pvNames);
4 F0 v2 [3 S% f% o                 iEnumIdx++;
" ~/ o9 g( l, K$ D, w/ ?               }7 E4 F3 B6 y4 W9 @0 S) k3 ^
           }
3 s" r4 }! K( |. o/ W           if(pClassObject)pClassObject->Release();
: r: }8 z. E. |" j* @% r0 M" h" p+ n         }7 e0 m: |5 t6 Y4 @
       if(pEnumClassObject)pEnumClassObject->Release();% \$ _# ~% [$ M1 s! Q9 S5 L
     }  v# T7 G. A" P
    if(pWbemServices)pWbemServices->Release();. g0 R  L4 J5 l: ]' Q
  }
/ `1 t/ c& b" O2 W0 V7 i$ \  if(pWbemLocator)pWbemLocator->Release();+ X6 G7 R" z9 Y' m, N" @& G3 S
}
1 [: ~' ?; n0 S. p1 q2 B7 J- T3 F//---------------------------------------------------------------------------* S$ R' Q9 f5 r$ @- c
% p3 i! s1 A% E: H$ \2 S8 C  {8 }
// 通过 WIN32_bios 获取 BIOS 信息:
* p9 @  x9 u  h; b8 N) kvoid __fastcall TForm1::Button1Click(TObject *Sender)
6 ?4 w9 }4 e% s6 ^( B" u{
% E; R$ S4 b0 w% w* ^! ]8 e) A    Memo1->Lines->Add("================== [WIN32_bios] =================");, l0 J* \8 d- p
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
. Q0 g* {' {/ Z. R    Memo1->Lines->Add("");- J1 c2 n# L5 ~5 l2 D
}
7 S! ?/ j1 `/ z
1 F6 E$ D, Q% x0 b7 B--------------------------------------------------------------------------------
5 \2 ]9 L% r& p
1 H! f  h) ^/ j! aWMI 可以访问的信息类型有:: Y+ r1 T5 G: Z+ O/ g
  Win32_1394Controller1 x) Y8 d  V6 f- k7 B
  Win32_BaseBoard/ c0 }7 x) N: L1 s; _. e
  Win32_Battery' Y4 P3 j2 M3 i7 X
  Win32_BIOS
* g) x0 p7 I# ~( u( j5 b& \   Win32_Bus  Q  T: V# `! [. g. D$ J5 m; y
  Win32_CacheMemory
( f1 C9 H& G: P* N/ Y   Win32_CDROMDrive, r: h; j2 \' s0 [$ d# t9 a4 p
  Win32_CurrentProbe
" \( y( S( G( [% i  a   Win32_DesktopMonitor
7 w5 y. i3 z; N" m   Win32_DeviceMemoryAddress
5 O* O8 d% l! q& ?7 d7 a" y# g+ c   Win32_DiskDrive
$ V% @( [7 _' n+ S6 c   Win32_DisplayConfiguration( @8 o( H) U* Q+ W9 R
  Win32_DisplayControllerConfiguration
: t. j1 B6 N6 }, _- }8 E9 @7 q   Win32_DMAChannel8 w4 L9 p& l+ p% r( j* g4 X
  Win32_Fan
8 c1 H& w4 F& P* m3 A- ^/ B) r+ @8 m   Win32_FloppyController
+ l- R" G- D1 {3 Q: u- @7 q; n6 N   Win32_FloppyDrive
3 c% W1 N5 G2 U/ L" X; F   Win32_HeatPipe
- h8 i$ Q& @/ A3 v. @. C$ C5 O   Win32_IDEController6 U  ^& A- r/ H) \/ i! d9 d
  Win32_InfraredDevice) J. p. j8 G; ?0 r$ d8 _, |( o
  Win32_IRQResource7 R9 a9 c# ^- T
  Win32_Keyboard
; Z2 Z6 M6 i  H' g; x   Win32_MemoryArray
* g* A" O  X: A. r6 U" w" _   Win32_MemoryDevice
; m5 c5 \  {/ ^) }. J9 C$ k   Win32_MotherboardDevice1 Y, F3 _# _8 i* s  [4 a+ t+ y; S
  Win32_NetworkAdapter
# f) x! L- g9 @& v' s5 k! _   Win32_NetworkAdapterConfiguration
% \# T! a' P  O7 {6 j) O) v   Win32_OnBoardDevice5 F8 Y. {9 K- \5 m' ]  q7 N+ \
  Win32_ParallelPort: @; \1 w# I! _4 B& m6 H. T+ A
  Win32_PCMCIAController
8 k- U# S% z+ J) t% D$ Q4 d3 S   Win32_PhysicalMemory
, N3 \  \  A+ _! z. E7 Z' M   Win32_PhysicalMemoryArray$ F" x# R( B$ @
  Win32_PnPEntity
) @2 n' p! {2 I6 H- F0 S: t0 F   Win32_PointingDevice
0 F) b4 M* c- \- }( I6 U   Win32_PortableBattery
9 V$ ^2 S4 v5 ^9 ?3 m/ @   Win32_PortConnector7 e+ M5 }- z- b; U- Y
  Win32_PortResource% Y0 L6 d. R+ U! u' H
  Win32_POTSModem
! `/ @, S$ ~* u4 [   Win32_PowerManagementEvent
- B% t) u9 k+ G   Win32_Printer0 n1 @& `4 p, v% n7 I
  Win32_PrinterConfiguration
. U- G/ `2 x& l3 J9 x5 r; w: R. `   Win32_PrintJob8 J2 T9 s8 y, Z  p( W
  Win32_Processor
2 p  C) L# K9 E( h* }% i# B   Win32_Refrigeration$ K0 G* Z+ E$ v2 i
  Win32_SerialPort
; q4 e" U5 f4 a) a8 \- F   Win32_SerialPortConfiguration
+ y2 j( E4 X  w2 R% O' G. i8 u   Win32_SMBIOSMemory
1 p$ U! \) a$ f. m% Z0 w+ c   Win32_SoundDevice! k4 j. b8 [, B) C) v! F
  Win32_SystemEnclosure
- e3 }1 ?/ G  w6 q' l% G- i   Win32_SystemMemoryResource
2 D! T. r' B7 b1 U) r; u+ F5 j3 }   Win32_SystemSlot) A7 Z5 I) [) r6 d1 [
  Win32_TapeDrive6 M1 g9 ]2 c: S2 T: i: Z) x# f
  Win32_TemperatureProbe
( b1 c# Y+ W3 D" r+ x5 ~% z' K   Win32_UninterruptiblePowerSupply, \( X# s5 l, |7 \0 ]6 {
  Win32_USBController. W2 V# _0 U8 u8 E- x# v
  Win32_VideoConfiguration& Z$ L$ l# ]1 N- q' i
  Win32_VideoController0 I! A" h( I2 c8 k# [- z+ b% G* R
  Win32_VoltageProbe' @- T) S8 ]( _
* J- R: p2 k# `, F
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-15 08:41 , Processed in 0.020117 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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