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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)+ P5 u4 M# R+ @4 j2 o$ I- y2 u

2 {) S+ t" k# Y) K* g
+ Z) e+ ?: o- O$ v--------------------------------------------------------------------------------% Z2 Q% d0 s- T# i
WMI: Windows Management Instrumentation (Windows 管理工具)
, Z+ W8 m; `1 S% R( k6 H   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
! t. \* Q/ j. u) ^3 y7 Q2 A   利用这个工具可以管理本地或客户端系统中几乎所有的信息。+ t  O, u% x4 [# l, j$ }
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 * S. g, Q) Z- n( Y, Z7 o

4 k$ A3 z- w) D0 l3 C--------------------------------------------------------------------------------# e! y" O' ]. ~
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, e- |* V! C5 T0 @* C9 n
& k8 V% U6 e. Y--------------------------------------------------------------------------------
' B& g( T) ?+ ?, ]① 初始化 COM 接口:: ~5 Y) a* e4 p
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。# x+ z1 p+ a4 j9 \) }( x
  这两个函数在 #include <comdef.h> 里面定义。- n( N1 D: X& |

0 Y& U! |% |+ D( ~② 获取访问 WMI 权限:! y9 o. w0 j# i. L; c
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
  J! [- e- k& R; z   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
6 s$ r3 d& d8 R! P! B* ~; B
/ l! h/ a$ M% z/ f. Y+ z6 }③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:3 ~) c5 a$ c0 \* c$ \3 x
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
3 _2 R/ n# r6 }- |# q$ c0 l
8 w, I7 d, b5 T+ t0 v" Fvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
! p, h$ l- W/ N4 V$ D  a{
: ]( H  j$ s2 m1 c6 N) A4 n  IWbemLocator *pWbemLocator = NULL;
8 D% ]5 j. n; [' }9 w9 ]- C* |  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)8 ^$ P1 S1 R: f" c/ K
  {
( V5 N1 z8 Y) w! [     IWbemServices *pWbemServices = NULL;' H, h3 L. j5 l; T. a# n
    WideString wsNamespace = (L"root\\cimv2");2 m: z4 [  e- r1 w+ p& X* S
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 }6 z0 h0 x7 t" h      {0 I( v7 T$ V. W* L7 G2 P
       IEnumWbemClassObject *pEnumClassObject = NULL;
1 C4 `4 U3 N7 Y+ p        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ Y: S; @3 t% O7 W6 L' I" e        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
" @) u3 v0 @1 C8 ^% |; U0 s* q         {
: _) m+ a! X, x7 p8 N/ b           IWbemClassObject *pClassObject = NULL;4 h+ J- k/ R, U, t, p8 w
          ULONG uCount = 1, uReturned;" Y  Z2 {6 F2 j6 }* D
          if(pEnumClassObject->Reset() == S_OK)$ e2 d) r+ H) f0 t
           {" e+ u, u; ^$ g
             int iEnumIdx = 0;( P5 K0 a- s" t$ V. Q0 k! Y
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
9 S+ c' r' v/ f% z6 E0 Z7 P; j               {
( u2 N! d) r4 g0 R, O& \                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
' N# |5 d; Q# L7 I1 n9 V  P+ r6 R, }4 n2 v+ ^; e7 c9 y: j# {
                SAFEARRAY *pvNames = NULL;
+ O; t- L* u7 D: a                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 {  S" w; b  |9 M+ b+ x! w                  {1 L+ A2 d0 g' S& h& }
                   long vbl, vbu;
" r4 E) O: w- s+ D+ f3 v6 a7 @                    SafeArrayGetLBound(pvNames, 1, &vbl);
/ g# @( O2 p7 e% F8 X                    SafeArrayGetUBound(pvNames, 1, &vbu);; m" Z# T4 _0 w4 o0 u. m2 A1 `4 h8 C$ S
                   for(long idx=vbl; idx<=vbu; idx++)
" ^. H) z# Q2 b+ q4 C5 N9 W                     {
. R+ q- ]9 R0 C; @5 A                       long aidx = idx;1 e6 L( C2 ~9 d* o- B8 \
                      wchar_t *wsName = 0;& ?6 Q  c/ l* G7 `: V1 a) j
                      VARIANT vValue;- n: n1 @7 c& N& F6 I  A' T
                      VariantInit(&vValue);
0 r# z3 d, w( u: h! @$ v6 M; l                       SafeArrayGetElement(pvNames, &aidx, &wsName);3 M# m- E" u: p$ e* I$ D- T

# C. o" G& `9 Y+ d9 m* z. p0 n                       BSTR bs = SysAllocString(wsName);
4 Z+ g0 v; O, m0 v/ v: |                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
5 N8 s' \# N$ D9 v                       SysFreeString(bs);
) e7 \) a( A! k. L9 j: M: {/ ?/ N0 k! B
                      if(hRes == S_OK)( h# T# r* A" F3 N  y
                       {% x/ L) `: u2 r  v4 `: e2 k
                         AnsiString s;, |; h0 u5 ~1 t! X/ f. {8 ^
                         Variant v = *(Variant*)&vValue;
! o+ H  ^% Q) s* I, G9 F+ @$ k                          if(v.IsArray())$ _6 @9 X1 l8 ?' D, J$ u9 I
                          {
7 x9 u7 o# o' ?; {7 F9 D) q                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
9 d: j( O9 k/ S                              {$ S3 m/ y  y! J* y  g- L
                               Variant a = v.GetElement(i);
4 j7 f7 {) h+ \- [" A, f                                if(!s.IsEmpty())
  e7 |  C1 E: W6 L/ @                                  s+=", ";
$ o: n8 e9 P. W$ ~$ @& V* i, n+ }                                s+=VarToStr(a);
8 K: s4 L; m6 i# L' V. G4 V% q                              }. |5 d* W! s# E( i/ W+ }! G4 a8 n" G
                          }/ s2 c( X2 Q9 [) p
                         else$ S# e( `" c/ N1 N7 a  c+ j3 R
                          {
4 P" j4 ^' L" k2 f3 r7 \. g                             s = VarToStr(v);! X7 K8 A- L$ |* i4 p
                          }
9 h, Y: k2 @4 {$ C+ P+ ?                          lpList->Add(AnsiString(wsName)+"="+s);* c- ]: H2 b& a" `0 t% T
                       }
$ a6 E5 Z' Z1 ^5 @9 ~! \* X
* d* t/ H  U6 P' k' A; W; q1 z  b7 `                       VariantClear(&vValue);
" y/ N& C0 ~- f                       SysFreeString(wsName);
* x& W2 V. S0 x# G4 X1 w                     }- ~# [8 R. O8 [3 M0 }& n6 _/ O' ~7 C5 |
                 }
+ x; F: u) n: L                 if(pvNames)SafeArrayDestroy(pvNames);
! @' G6 Z: M. o5 i                 iEnumIdx++;
. [6 i. J! R+ _; t% U/ V8 R* k$ M               }  T- |! ~1 N: A0 q9 J
           }* G3 I9 z1 ^. P: \
          if(pClassObject)pClassObject->Release();' F( Q( K! o+ i- N$ Q% H+ ~
        }
& a& t8 y; K/ s8 y        if(pEnumClassObject)pEnumClassObject->Release();
( I& G" K* {/ E      }/ h; `' B2 ~7 s7 U0 K
    if(pWbemServices)pWbemServices->Release();
* K9 d. i. ~3 L   }  K1 t0 P! D: @! I; _$ {3 D! ^
  if(pWbemLocator)pWbemLocator->Release();* e0 v* O" ?, W/ S: R5 v
}
, _' V. D% y, P9 r//---------------------------------------------------------------------------7 U4 k4 s: B0 O3 H
4 O! n: U5 }4 d4 n5 g
// 通过 WIN32_bios 获取 BIOS 信息:9 w0 ~# q! B! n, s# E
void __fastcall TForm1::Button1Click(TObject *Sender): f$ z3 p) b7 |/ B& I1 p. {7 n
{
; r0 x/ p! r! L2 q# E4 Y    Memo1->Lines->Add("================== [WIN32_bios] =================");( M/ k* M5 W* Z7 f6 Z
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
/ _( f) |- x2 l# {. x- k: S    Memo1->Lines->Add("");5 o7 n  K5 b+ A8 C) L! F6 \: K& p2 V
}
6 E+ {; @8 {& R6 a$ {4 ^
/ _  L) Z4 }/ q$ y2 P1 v--------------------------------------------------------------------------------
* ]+ }3 O' o  Q  y; r& r! N) ]' X# x4 c: ]
WMI 可以访问的信息类型有:
- V1 \, s1 x3 W' o# F( u: O   Win32_1394Controller- P2 h8 s: C1 o4 x) u# Z
  Win32_BaseBoard
/ `$ d4 W  o6 _$ t, n7 t# h* Y1 [2 Z   Win32_Battery
8 Y2 _# k- f( A  f   Win32_BIOS
6 W9 b$ u; Y9 W9 D7 ~   Win32_Bus+ p& O- g1 m! l8 {
  Win32_CacheMemory
. b: M) @/ B4 M$ C6 z   Win32_CDROMDrive! d6 B4 C+ k; q# N" O
  Win32_CurrentProbe; ]; o3 J" l8 l* g0 N
  Win32_DesktopMonitor& v* X; v! d: @' t
  Win32_DeviceMemoryAddress% y' v1 W3 `0 B& Y* `
  Win32_DiskDrive
3 B/ O& ?/ D/ ?+ J* H3 d8 q   Win32_DisplayConfiguration; A' L* i( O& X
  Win32_DisplayControllerConfiguration; Q/ |0 v3 m  ^5 h  O! K1 y9 R* `
  Win32_DMAChannel
$ k7 u; V, ]6 z8 v# m8 N) {& c   Win32_Fan. W1 F1 q& \+ r3 o
  Win32_FloppyController" n( Q; {' N: v1 G' j
  Win32_FloppyDrive
! d' W& O0 Q# x   Win32_HeatPipe
2 N5 ]9 R# f5 _) e! X0 G   Win32_IDEController
' v3 b3 L! E; J2 u  v8 O+ M   Win32_InfraredDevice6 J% _+ l5 z) ^
  Win32_IRQResource3 ~( K+ S' h+ O* i% q" n
  Win32_Keyboard- ?4 R. I% x" b! p/ B4 r4 B; O
  Win32_MemoryArray
6 i! @: Q% O3 F6 W( N/ s( F1 P   Win32_MemoryDevice
  w5 M9 H3 O0 {: L. w   Win32_MotherboardDevice! l- Z5 q- a7 s( W
  Win32_NetworkAdapter
5 @9 @3 Q; d9 [& Y% I& J   Win32_NetworkAdapterConfiguration
( O) V; H6 G; H/ m& X   Win32_OnBoardDevice
+ L5 v" K+ Y9 e5 b, ?   Win32_ParallelPort: A1 [, R5 @- S$ D8 n+ @& x
  Win32_PCMCIAController
3 T* a+ Y7 @& S% r3 I   Win32_PhysicalMemory
5 G5 ^3 U2 T. U% [' W& `   Win32_PhysicalMemoryArray; `1 k5 n# ^4 V- Q
  Win32_PnPEntity
5 Q* L& {- O2 {   Win32_PointingDevice4 G0 F5 f- P- K; R1 F. z; A
  Win32_PortableBattery0 l4 r: ]6 t' u- ~
  Win32_PortConnector
/ F8 A; c" q* m/ a) P& n   Win32_PortResource
1 Y. ?; |4 B9 t! S   Win32_POTSModem
4 V; p/ l: n" v/ b2 u   Win32_PowerManagementEvent
; P: ^) S/ s* X   Win32_Printer& O! e% e8 r  t) w* L. B
  Win32_PrinterConfiguration
6 \: n/ ^: p; t* Y   Win32_PrintJob
5 N, U3 ?$ w# I: N- |- P- @   Win32_Processor
4 R# b7 l+ @2 N& P9 Z   Win32_Refrigeration
( Q) O2 N5 T* S3 T  n3 g7 r4 ]   Win32_SerialPort
0 k3 K: `+ F: |1 m   Win32_SerialPortConfiguration( z4 D4 j. \9 h) @
  Win32_SMBIOSMemory( {* m, l- N+ G/ I
  Win32_SoundDevice/ \( c" {& d+ B3 b
  Win32_SystemEnclosure
! U* e, e& m2 v  v3 k   Win32_SystemMemoryResource) C2 S# p" A  ~- G" r4 U/ H
  Win32_SystemSlot- p: n4 h2 V; G: F
  Win32_TapeDrive
1 ^% E+ ~& g3 X# |1 T   Win32_TemperatureProbe
3 N% V: e8 d# M9 h# `" q+ ]   Win32_UninterruptiblePowerSupply8 k9 Q8 k( D3 z4 W% w4 x. z! n
  Win32_USBController2 d6 w+ c* n2 @! @% E# d& A
  Win32_VideoConfiguration8 w3 L$ Y7 ~8 r) `- q& o
  Win32_VideoController3 n( |/ w& I% `) [9 o4 J
  Win32_VoltageProbe+ I6 k$ _, i$ q: p" `

% M9 }' `$ u' p4 X2 \) y. t以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-20 08:42 , Processed in 0.018179 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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