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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 a2 v% R9 s4 r2 k* J

7 F7 G) ?6 z4 k# u3 j
, u+ F  E. w. @/ |! j--------------------------------------------------------------------------------! K6 M, t* o. v0 D2 L$ I
WMI: Windows Management Instrumentation (Windows 管理工具)
, f3 A' o& D% t+ j5 {" i+ T   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : u) h! v, `8 _4 n
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
% ]: i; V5 q: q9 w" q   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 5 s1 Z+ V4 w4 `' o2 P
9 W/ d, @2 Q! J/ ]1 G- J" B. }
--------------------------------------------------------------------------------) H! ]8 j  Q+ l1 N
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( B  L( S2 }  |7 u6 G  l- L% {
- |- p7 c- i$ l" E$ N4 P) H! h--------------------------------------------------------------------------------" H: j2 e6 ~" H+ x
① 初始化 COM 接口:
5 d+ M# H) ~2 o, g: C; c- O( g8 v   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。5 M; X! U: t% t  h8 ~
  这两个函数在 #include <comdef.h> 里面定义。+ m$ O7 o5 d) S* T2 O2 p
% N8 T2 p$ o$ K; p
② 获取访问 WMI 权限:
" A, U% J! e. _$ k: b/ w" [   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);2 b  \1 F9 Y# |8 N+ c2 R+ S% T
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
5 G7 a8 Z; V. V# W
' I; o. C! D& {7 f5 j③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:7 F, R; `; G! O/ Z
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。5 K* N* l7 q# X7 \! L

% Q; `  V4 Q4 P/ K8 rvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
) L# p0 Y: o8 h5 R& j{( }$ H1 _' r  [% g7 U' ~
  IWbemLocator *pWbemLocator = NULL;: o* o( J" v; Y
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)% l2 r4 u0 ]8 y  g' |
  {
4 I1 m( g# }4 Y4 ]     IWbemServices *pWbemServices = NULL;
! |* Q* }/ U  X  M4 }     WideString wsNamespace = (L"root\\cimv2");
% ~# y# \# H- v     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
# \; ?# o) @$ }, d8 ?/ H      {
' M) L, O% ^+ p2 e( D        IEnumWbemClassObject *pEnumClassObject = NULL;
2 w* z) E# T* B% o- q2 p        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
2 @# o5 M/ d, j% }4 N/ J        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
2 n8 U1 r( g6 t9 e% {) ^         {9 S5 [  W6 B& y: {% ^5 Y
          IWbemClassObject *pClassObject = NULL;
5 A6 o& {+ {& n1 K% v( R( K: m           ULONG uCount = 1, uReturned;
# g# l. k$ ~0 _           if(pEnumClassObject->Reset() == S_OK)7 V+ G/ j! }( l. o0 I9 Z: Z0 R# O
           {
' E3 [: n) o- s5 T2 R; n              int iEnumIdx = 0;& Z1 s1 Y( A9 g' A# b$ t
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
4 ?, E$ N7 A) Q               {2 U. p" ?, h5 q) `) y9 _7 J
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
! b; w  N) M9 u, ?5 A- ]" d* M6 c8 U: A1 I
                SAFEARRAY *pvNames = NULL;
( C5 |% m, G1 L( ~# c- A( I; N. |                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
6 U" D, {4 c+ \4 z5 R$ w8 b9 @                  {7 x( W! |# X) T3 U" h4 V1 I
                   long vbl, vbu;
% P, H) H) ?/ e! F                    SafeArrayGetLBound(pvNames, 1, &vbl);
) k6 A8 B0 w1 Y  [4 Z6 b$ b                    SafeArrayGetUBound(pvNames, 1, &vbu);1 x! o/ y% D$ }; Q
                   for(long idx=vbl; idx<=vbu; idx++)
1 j) I3 |; t" \" {) b; U                     {
7 x) `/ u# x, Y* }7 n8 }: Q                       long aidx = idx;
1 @* A6 N6 X( G) K6 M1 x                       wchar_t *wsName = 0;
* p% u! o3 z- g                       VARIANT vValue;- l4 C4 @. ^0 k; [7 @% I
                      VariantInit(&vValue);
+ P* r2 O  F- n  o0 X) U' H; _" v                       SafeArrayGetElement(pvNames, &aidx, &wsName);
$ e; h5 Y/ C& t9 F; o" W
" W- w/ s; ]* Q$ o9 Y; p* T2 O                       BSTR bs = SysAllocString(wsName);6 C+ }$ v2 {; G5 |
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 K4 K( J' v2 }+ s. l                       SysFreeString(bs);: M( S; N( v1 w9 x0 s
  g1 D1 _# @) S
                      if(hRes == S_OK)
2 D' r! S1 C" B5 {" y3 T; [& n                        {
: K  j  ?4 S6 I4 F% S                          AnsiString s;4 |, ]( s6 [& [
                         Variant v = *(Variant*)&vValue;0 V) E; t3 e9 [, c% A
                         if(v.IsArray())" R( |  y# D2 P
                          {2 I( `* n7 C" C2 H/ _
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)" a- Q/ J) F- a' l' W) H& V3 s
                             {3 Q# s/ e  j! r4 o" H
                               Variant a = v.GetElement(i);
1 `% \% H# K" r  M" \& Q5 S# n/ C                                if(!s.IsEmpty())2 D; J) g6 B5 d2 `* Q! y
                                 s+=", ";
* U% [9 J, j7 F9 ^: ~; N# d                                s+=VarToStr(a);3 F8 }% @' T/ v' ^+ T& q
                             }
4 ^0 o8 O* e2 ?) @) Q: ^# B                           }
8 m2 T& X; X; ~( G5 }                          else, p% D  z! \, e- T- v+ P* ?
                          {6 [- o3 U0 X3 S$ J9 b$ q' _2 k0 `
                            s = VarToStr(v);
/ J3 ^( X' f. W# n                           }
2 A" m; N. f2 `$ O                          lpList->Add(AnsiString(wsName)+"="+s);4 E) ]) Z! j3 @( m( K1 g
                       }6 o/ b5 U5 G, _9 k) y
* b  `: P# F  }; _
                      VariantClear(&vValue);/ K$ O9 e1 Q2 u0 ~
                      SysFreeString(wsName);
% y0 p- s0 H$ y$ e' s                     }
. P/ |2 K* t7 R5 O6 L                  }
, c6 x" j4 Y1 g% \+ Y                 if(pvNames)SafeArrayDestroy(pvNames);
. T3 s( H% o/ b/ q( ~# B2 M                 iEnumIdx++;
0 w6 y* B7 I4 h; S; c9 j0 _1 I4 Q  `               }: L$ |6 a; J! r& e
           }& s  _& Y+ h, N/ a" o
          if(pClassObject)pClassObject->Release();
2 T9 b' c" e! {, o: V3 Q* o" C         }
8 c1 S; I8 Z# Q. U  M6 n        if(pEnumClassObject)pEnumClassObject->Release();4 t& G7 e- ?1 `; w6 z
     }
- J: a# v* ~) i3 ^- D     if(pWbemServices)pWbemServices->Release();
/ l* @: z+ ^& m7 E   }
+ N& _9 F* V7 ]' o% n/ d, T- {  if(pWbemLocator)pWbemLocator->Release();
0 L+ M% [# {6 R5 K: I7 U* D% n}7 A) o7 b4 D+ C- x! g! y; x
//---------------------------------------------------------------------------6 R9 D, q7 u1 f5 T1 V
' }0 ~& M& ~0 K9 d
// 通过 WIN32_bios 获取 BIOS 信息:' _9 J8 x" ^9 ^9 b2 K$ y2 o' {
void __fastcall TForm1::Button1Click(TObject *Sender)
& f; }1 m6 J8 a# j{0 j# g* @6 a: ^! l" b
   Memo1->Lines->Add("================== [WIN32_bios] =================");
  Q' I! _; f- `) t/ ?" E5 i    GetWmiInfo(Memo1->Lines, "WIN32_bios");
. }+ N% W1 k2 \, I5 y4 o/ C    Memo1->Lines->Add("");' r5 R$ k; z) T
}! C. _: V, G( ^: a4 l( Z# y- d

( z* D% b9 X" i! S+ a! \--------------------------------------------------------------------------------% n* z; j+ [. {% `( X

  ^1 T' _) E3 S: hWMI 可以访问的信息类型有:/ C  ^0 H& m% M, k7 a" B3 V8 @" v) v
  Win32_1394Controller
& L! b( o. a! ~" o   Win32_BaseBoard5 m2 i# l& E1 s5 q5 n
  Win32_Battery
  m* Y$ y5 s7 r) X   Win32_BIOS
5 h, ~' c" Y; [9 O) x   Win32_Bus8 R' c! p: t+ z) b% G# P( h
  Win32_CacheMemory5 f% M6 P8 O( Y% Z8 `* F& q! b
  Win32_CDROMDrive& Y3 a" w+ H6 W
  Win32_CurrentProbe0 X$ a( R& \/ P4 E
  Win32_DesktopMonitor$ }# n  n3 ?5 n9 g9 V* ?
  Win32_DeviceMemoryAddress7 @( w& J; x. d
  Win32_DiskDrive+ p2 D0 x3 j1 Y% S0 j, J
  Win32_DisplayConfiguration) C( K' F5 O% W, c- j% i
  Win32_DisplayControllerConfiguration
# `6 d  S! C" l9 V   Win32_DMAChannel
9 a& Z6 {. ~9 Z& o7 D: R6 l' _3 n   Win32_Fan1 S2 S/ l8 I! U- N+ `
  Win32_FloppyController( s+ h3 C8 K1 w
  Win32_FloppyDrive9 m  z3 B; w5 K
  Win32_HeatPipe
: L; }# O1 N( }1 R8 {+ I1 a   Win32_IDEController
7 X+ {% }. r# e8 }0 ?   Win32_InfraredDevice2 c$ e/ D( ^& N' F" Y
  Win32_IRQResource
1 X) x& J, f: ^1 N0 _$ o   Win32_Keyboard3 H  C# X8 [+ m. E" ?( w0 S
  Win32_MemoryArray5 W- r( b/ J2 _: q/ C
  Win32_MemoryDevice. o) {* V$ H) }+ {
  Win32_MotherboardDevice
' I6 I0 W, S0 Q$ z# o   Win32_NetworkAdapter& y. F2 u( W! H- H
  Win32_NetworkAdapterConfiguration2 e' X- ?2 N, k6 h" b
  Win32_OnBoardDevice9 {, l' c7 s* M: Q! V  A. d
  Win32_ParallelPort" P: H, K( }3 a! H
  Win32_PCMCIAController
6 u* \4 M" z2 K. h   Win32_PhysicalMemory
0 b" H* ]$ q1 \/ N2 P   Win32_PhysicalMemoryArray0 h" B, L6 H3 ^: c" F# P
  Win32_PnPEntity
2 c$ {$ w  o, D, }2 W9 N0 M$ Z   Win32_PointingDevice
4 Q' [1 R  b8 _' y   Win32_PortableBattery
; p; E2 G' y( d- `8 k  b+ a) R; x* L. ?   Win32_PortConnector
' p3 s9 u; g4 T9 L" L   Win32_PortResource/ ?! L" D/ C) |5 h
  Win32_POTSModem
7 j/ I2 m4 z+ R! F. t; ^6 [   Win32_PowerManagementEvent4 n1 H6 V4 r) ]
  Win32_Printer
+ u. ^; I! o: ?& o   Win32_PrinterConfiguration
/ G" B7 @3 P/ M, O) m, e9 k   Win32_PrintJob8 g+ }$ `- p0 F6 l
  Win32_Processor8 A8 [7 Q: o) p1 S+ {4 s
  Win32_Refrigeration* d2 X' Y: g0 C8 v+ ?
  Win32_SerialPort' p! j8 G. e2 c; q+ Y  C2 t" c
  Win32_SerialPortConfiguration+ D* Q/ v4 H  B% @7 {
  Win32_SMBIOSMemory
9 _5 Q0 _. A5 s+ K   Win32_SoundDevice
" @  [7 r1 B/ w- k+ B5 k0 Q8 ~& \& I   Win32_SystemEnclosure. e0 L% {' u6 B3 ]0 {$ [+ c8 h
  Win32_SystemMemoryResource4 P% \' V  k. j( M4 Z; |  G/ Y
  Win32_SystemSlot
7 ^9 D$ ~4 G! H; Y   Win32_TapeDrive7 C& T7 w! U2 w1 Q. Y: K' B
  Win32_TemperatureProbe: j8 H! X! G+ f  z; O8 \
  Win32_UninterruptiblePowerSupply# ^- ~; A! S; U9 `5 O4 u
  Win32_USBController: E' @# ^$ r/ Y5 [5 X
  Win32_VideoConfiguration
* J" x7 D, t+ u$ S1 M4 e   Win32_VideoController& O; x4 i6 s2 d7 S! P
  Win32_VoltageProbe) f: Z& E3 \+ K* o" L) w  a
" R& c+ G! G* ~* f
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-18 04:02 , Processed in 0.019174 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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