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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 q& {" b  O' B$ W) q
1 w3 q5 M$ h- |5 w
- ?0 g: o  A( F) j) f$ M1 u
--------------------------------------------------------------------------------
1 d. V/ a# a2 ?0 C/ VWMI: Windows Management Instrumentation (Windows 管理工具)1 g8 a8 k; h* y; R2 F2 n) s
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! t2 M5 s/ c' O# ~4 z( f' d
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。- Y4 r+ t; I, J0 N* Q
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. z/ l9 w. V5 Z* v( C! {+ Y) h  ^
* ]6 U+ w- V1 q, v- j: e--------------------------------------------------------------------------------
) |: ~6 @; _/ R- rBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
$ E0 }/ E3 O' p& e4 a: W7 e  M( T5 M7 Y
--------------------------------------------------------------------------------
8 @8 p7 I) }0 p; |- A① 初始化 COM 接口:
2 H% E- U" O9 ?8 e/ G3 ]   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
5 Y. P0 _. V. P# X   这两个函数在 #include <comdef.h> 里面定义。, C! L4 ^: k* i/ z
6 v/ t; E2 {) C5 A1 A0 x. E
② 获取访问 WMI 权限:5 P8 [) r  |; D7 {0 u- v
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ }) ^6 U' `8 Q- n0 H8 q0 U
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。+ Y) h' p+ U/ E& a2 [- _

) Y# g- c; T1 g- E' _) A③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
! l9 b; h% g1 b. q# i. _   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
  P+ {2 F2 D/ Q, h6 u3 X9 V+ y3 D3 H+ S# t/ h6 K+ J3 B+ Q% o8 M
void GetWmiInfo(TStrings *lpList, WideString wsClass)5 P) k( K! t# F$ e, |2 L. _
{
' i- u0 e, o# ?; j! _+ E  IWbemLocator *pWbemLocator = NULL;7 |4 H3 S1 \1 r4 `
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) o7 i- s' U9 v  A
  {2 O# \) y- X8 }; ~2 R0 ~
    IWbemServices *pWbemServices = NULL;
4 O7 s. J! Y: z0 Y! V; Q     WideString wsNamespace = (L"root\\cimv2");
# P4 V7 `+ x) A7 E     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
" }* T: G! @: {$ h4 Y) Q      {- ^: c/ F1 y5 }+ O, v& a
       IEnumWbemClassObject *pEnumClassObject = NULL;1 v& p/ K0 r; X
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;/ N3 O0 z6 J, I8 B( z( Z
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)4 Y3 f& E! t7 ~& g5 H" t4 r1 p  `% |( s
        {; e: o' m* y8 {9 N; T5 ]% @
          IWbemClassObject *pClassObject = NULL;9 s4 j+ B6 Q1 Z, T. Q
          ULONG uCount = 1, uReturned;$ a$ i0 }# E7 k7 ^, F5 R9 a
          if(pEnumClassObject->Reset() == S_OK)' R5 }* u- H$ F' d; C1 ~# U% e
           {  v& r9 o& b( |  R9 K  S
             int iEnumIdx = 0;2 f& x, X4 N) p4 r* _
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)6 z( k% P2 `6 F4 ?
              {* i6 b( S7 t8 b" a5 U) g* D8 l
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ {- ]  J! U- c/ Z& Q

) q  v( s+ u1 B                 SAFEARRAY *pvNames = NULL;9 A. H7 E' _+ W' R3 P- S' |
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
. ~# n/ m/ Z+ J( b5 A7 I                  {# w( J% [  G% J* U
                   long vbl, vbu;) z5 R8 k* S9 W* f
                   SafeArrayGetLBound(pvNames, 1, &vbl);
, F1 k( F7 i  Y9 Q5 _5 e                    SafeArrayGetUBound(pvNames, 1, &vbu);
# G- N9 W# m; \: b                    for(long idx=vbl; idx<=vbu; idx++)
; {, Q. z; t! R5 Y: ~( A) J                     {5 f: S) k. M- i! T9 U$ A  H
                      long aidx = idx;
7 v; q8 p3 e) q1 @5 f( h) u                       wchar_t *wsName = 0;
0 e7 x. U7 k' F: M0 Y1 g6 `1 T                       VARIANT vValue;
+ \* `* t/ y& b# Q3 ?. B                       VariantInit(&vValue);& x$ l  c- S/ J  `  |
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
- [; m1 [# T( g1 O- P# Y8 E0 I
& J5 J9 S  R* M' Y$ d% r                       BSTR bs = SysAllocString(wsName);
+ s: [0 ?# {  ]3 ~( I                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# q' b3 v6 c, k$ G9 k& Y
                      SysFreeString(bs);% j0 Y/ i3 V9 U6 w
6 n; E5 B- S: c/ k, R% M; ~7 P
                      if(hRes == S_OK)
; F0 K) h% L- J6 T% T' e! F+ s8 ]( V                        {9 \+ S& x  A- b! X- l
                         AnsiString s;
' u, p: L! i1 H7 w1 n1 \. L% C8 R                          Variant v = *(Variant*)&vValue;2 x* D/ B2 |5 `
                         if(v.IsArray())  y* f2 D5 H( }3 i1 D: @" O
                          {
* T7 d' U1 s. D  M$ _7 ^/ `' v                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
. D. _9 j2 I! ~& R                              {
0 |4 t+ ^$ v0 P1 q7 _                                Variant a = v.GetElement(i);: y0 F; x1 M5 v9 I; ^
                               if(!s.IsEmpty())
5 R1 w7 Y3 A% `3 i# S) R" m                                  s+=", ";
1 t1 j+ w+ A. `+ a6 L) c! G1 h                                s+=VarToStr(a);
- n- R0 ^  `" v5 }9 ^& Q                              }8 W! ?" G4 M4 k! P9 y
                          }
% n6 M0 f' h+ i! l: S: k& @$ v                          else
$ ^& o, k' T6 @6 B9 f* G) X9 d                           {' E6 W5 C" \: R! m4 `8 g
                            s = VarToStr(v);
% a5 J. q" z! h6 H/ ~; M+ |: O                           }
3 \4 P5 J0 u7 M" f  c& {                          lpList->Add(AnsiString(wsName)+"="+s);9 E) `+ _: P2 Y( @( c
                       }
, G& ?9 S* }2 a+ P: q4 o) g; W7 N+ v
                      VariantClear(&vValue);4 X! o0 [: v  ~! B
                      SysFreeString(wsName);
9 J+ t1 A7 l4 p                     }7 x- @" M* u0 U, J
                 }
# h# T5 V- C3 P* X6 O7 K- s4 \                 if(pvNames)SafeArrayDestroy(pvNames);
+ T7 ^- |* |+ m& E                 iEnumIdx++;
! Z9 U3 C" t% E  l1 O6 j               }
2 C7 k) N: G+ c" a7 B( U" W2 z7 M! _) }            }1 L( q# e4 S8 q; z+ V5 }5 p, F0 m
          if(pClassObject)pClassObject->Release();
6 j6 d' }+ z! L1 `. U/ G         }; K$ J. m6 \4 [+ X# w. B& @% u
       if(pEnumClassObject)pEnumClassObject->Release();& e& M# x* U" @5 C8 L& L
     }/ {% U& a/ Y. B+ A/ e
    if(pWbemServices)pWbemServices->Release();, h$ |: S7 {  a) C
  }+ H. S. n& |+ F0 U5 w4 S/ `" _, ^
  if(pWbemLocator)pWbemLocator->Release();
- ?  Q6 [. D! |6 P$ o}
+ S+ _! O. V  C0 A* F//---------------------------------------------------------------------------
5 P. i- `- i; n' ]) p) N: |$ Q. f/ g
* }& M& o6 ^5 L) Z/ o" F// 通过 WIN32_bios 获取 BIOS 信息:
0 _! u2 n' e4 |8 B% b, Bvoid __fastcall TForm1::Button1Click(TObject *Sender)
! b$ L1 e& T3 C8 F: f- O{% }$ H( Q9 z5 j
   Memo1->Lines->Add("================== [WIN32_bios] =================");
. W: K8 |/ H' C% j6 A" l' B" R    GetWmiInfo(Memo1->Lines, "WIN32_bios");, _' L: F6 Q6 t# B( o0 N4 L0 V2 F
   Memo1->Lines->Add("");
0 h' E# T% r8 s/ @7 M# j}
+ o0 }0 G" h: X0 i7 V* [
' v- {" Y7 C! M--------------------------------------------------------------------------------6 K) h: T+ c& m$ M, W
5 Z; j" Y8 w* \  h, m0 o
WMI 可以访问的信息类型有:+ ?4 W- ]' E2 J* n9 q7 t- Y
  Win32_1394Controller/ L' [2 ]6 F, Y) }' W
  Win32_BaseBoard
7 h: f: f5 E. ^; R   Win32_Battery: B4 H' t1 p6 b& d4 }
  Win32_BIOS
& i) a) l5 S2 G+ g1 e! `# n   Win32_Bus
, l3 w6 Y7 L% [0 z5 `3 I: S   Win32_CacheMemory9 j/ r, k: k9 ~& s# [
  Win32_CDROMDrive
- }2 a9 T1 b: l   Win32_CurrentProbe
/ W0 U: q+ s  @9 w2 O   Win32_DesktopMonitor+ z' g# j' h: ~6 Q3 g
  Win32_DeviceMemoryAddress# a9 D2 l. N! i! w% z
  Win32_DiskDrive! N2 V! O$ m; l( u* s  \
  Win32_DisplayConfiguration, c8 b8 A2 y( E4 N. z& k5 e& E
  Win32_DisplayControllerConfiguration% b' J$ `1 R. `
  Win32_DMAChannel' r& W* ?$ p1 K% u, U
  Win32_Fan
6 k2 p9 N# a* z/ ^% G) p   Win32_FloppyController9 \( q8 }3 g" }  d2 G
  Win32_FloppyDrive4 p8 X- g5 q$ z, ?, M1 H; ^# v
  Win32_HeatPipe) P" L( w7 v& O& ^8 L
  Win32_IDEController
* ^7 b$ h& Q8 E4 G) A% a   Win32_InfraredDevice0 [" n/ G, b- a
  Win32_IRQResource
7 o2 a: B+ V3 V) V6 \: Y   Win32_Keyboard* a2 F4 Z* m2 [4 P  `
  Win32_MemoryArray
7 k5 b! z  T$ ~# F; n; V* U, h" q   Win32_MemoryDevice
# ~1 F4 h3 x0 e- j   Win32_MotherboardDevice/ D+ r+ K! i" Z4 I( F
  Win32_NetworkAdapter( v# I7 j* M; @4 [
  Win32_NetworkAdapterConfiguration& [9 o% F$ H9 S: ]3 d8 b* X. k  q5 l
  Win32_OnBoardDevice/ R* O6 H+ N, a8 ?$ N0 `
  Win32_ParallelPort( S( R) ^) ^* ?7 E2 {" p/ C9 B: s
  Win32_PCMCIAController. q- g! Y3 A$ Y
  Win32_PhysicalMemory
! r$ V. @9 l5 }8 o   Win32_PhysicalMemoryArray
  y1 p7 ?5 C1 f   Win32_PnPEntity: n1 M. r# Z3 H7 f
  Win32_PointingDevice! J( s( ^* \; X- Z
  Win32_PortableBattery' S. l# c$ N7 L" t
  Win32_PortConnector, T. s- [$ K6 c
  Win32_PortResource
+ |# f4 x9 ~" [- ~1 }   Win32_POTSModem4 u& b' Q8 W- X. q
  Win32_PowerManagementEvent
% B( g  [- l. T; `- I- Y% d   Win32_Printer2 I- E2 w2 @) c1 _+ X; t
  Win32_PrinterConfiguration
- b+ c6 e  w7 `+ Z% a, h   Win32_PrintJob
  M& R* {* O4 E: d   Win32_Processor
. x- ?5 g+ y/ f+ @9 p9 X" `4 {9 K   Win32_Refrigeration3 J( h: s4 l0 L& a* m% t' ~, X
  Win32_SerialPort; _) L. G" y( ^: f8 X2 l: J
  Win32_SerialPortConfiguration
, y% d  X4 W: i   Win32_SMBIOSMemory% A) f# d& T% s0 v) e( {$ |3 b
  Win32_SoundDevice
3 \% ]  X* K& N- G   Win32_SystemEnclosure2 `3 E( l) G+ S' F5 g* o+ ^
  Win32_SystemMemoryResource+ Z7 z+ U5 a  [: S: Y% k& i
  Win32_SystemSlot! T( p2 Z1 V( b% \* M9 R
  Win32_TapeDrive
* ]& X2 M& U. j$ ~8 [   Win32_TemperatureProbe( Z3 g6 q, h4 c8 L% L
  Win32_UninterruptiblePowerSupply& v; e8 v" U& ?' S9 _; ]7 {
  Win32_USBController
6 r: ]- Y( }. g. |5 U   Win32_VideoConfiguration: y5 d' |* g9 x$ {# s; j* O
  Win32_VideoController
( H* B6 x7 Q7 `" d   Win32_VoltageProbe* A3 N  d" c$ f

/ ~. [0 R, m/ F; ]5 v以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-8 01:25 , Processed in 0.016974 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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