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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)0 k. q8 A! J8 H5 m. P3 n

4 N7 F4 s) v3 ?( W/ N' X" Y3 c3 g! c: }: l4 a+ P/ _
--------------------------------------------------------------------------------2 w5 Q: J7 u5 j8 `( g
WMI: Windows Management Instrumentation (Windows 管理工具)
5 w/ z# r9 z3 V. Z- H3 o$ L! I   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& |4 ~' X) {& }, \0 E   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. W5 S9 C4 R  Z1 m   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
6 h. Z3 B7 }5 V% c9 }4 \" S! z: X4 [8 X) \7 G; c6 ]6 }* U
--------------------------------------------------------------------------------
( E" a" ~' q; s: B; m8 DBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
  N  C9 f0 d8 z6 C# p4 z
4 C: d: E2 G. d9 y+ _--------------------------------------------------------------------------------
: d  R9 y+ Q6 }① 初始化 COM 接口:! {, d0 k4 ~, Q' g
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
' |! X2 d2 N( d; W   这两个函数在 #include <comdef.h> 里面定义。4 W: {5 k# J( h/ C% @$ N, }
! `5 L% e7 t% D/ c
② 获取访问 WMI 权限:3 ]5 u  d1 I3 _4 i
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
) Y" R4 d. {) p! a* x9 ~   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
  x  y0 c' m2 `* M/ K  k, ]2 _
/ b7 \5 ^0 ~: t1 k③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
8 {+ w% I$ N: ]   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* D' Z# I  ?  P

2 \0 e: P$ s) a" z* ^void GetWmiInfo(TStrings *lpList, WideString wsClass)
0 I& h  i: p; n6 C9 N& C{
! @4 q9 y4 s5 _7 [( W# f" c  IWbemLocator *pWbemLocator = NULL;
2 U9 ~4 d7 W0 Q4 D  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK); ?5 e, l2 i' H1 K/ z
  {
- q6 L% F0 u+ u/ M7 W" l     IWbemServices *pWbemServices = NULL;
# @1 |& G+ q; `6 m4 \& L     WideString wsNamespace = (L"root\\cimv2");
4 a$ i# F. v4 C7 [# Z4 N     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
4 o4 s2 N( J- Y      {
1 X% A8 s3 T2 I  K+ t) L/ h) _        IEnumWbemClassObject *pEnumClassObject = NULL;& O6 f+ A/ R! @5 V' s& x  V
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
( T8 Q' M8 x5 v4 k( |        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  B- A4 T! k. H2 P# ?) ^
        {
) M+ ]$ {. N( S: o; o           IWbemClassObject *pClassObject = NULL;
, D! \" i8 S* {' |6 D1 U! w4 r           ULONG uCount = 1, uReturned;' O$ i: ^- _$ [+ ?, d/ ~4 d$ i
          if(pEnumClassObject->Reset() == S_OK)! d4 U( F/ ]" X; {2 T
           {+ q; T1 s( g: K1 p2 ~
             int iEnumIdx = 0;; h$ d  X) a" B+ S7 M: Y
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* \/ ]: `% h- w& C               {' L( a% A1 ?% @! T. _! f
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
* i+ K. c7 A1 H! D
( h* l' t7 L) @4 a                 SAFEARRAY *pvNames = NULL;
# B2 m) j* q, K( E# X, x                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)! J) h: V4 f& F4 T
                 {
4 n" S- ]) |/ N5 W; v& O( j                    long vbl, vbu;
: o+ q- \5 `. V                    SafeArrayGetLBound(pvNames, 1, &vbl);& u; N1 s5 m8 m- B& E0 [) ]6 e
                   SafeArrayGetUBound(pvNames, 1, &vbu);
/ j; C" @1 L, [% g3 M5 T9 n                    for(long idx=vbl; idx<=vbu; idx++)
! S+ E; k$ C% ]6 `. l                     {
; f7 h7 K" _% E2 w                       long aidx = idx;
! G9 f5 H; g+ H, G0 c. y                       wchar_t *wsName = 0;, ~3 G. l( i# L+ f
                      VARIANT vValue;% Y* g2 j1 Y/ N3 P( y  p
                      VariantInit(&vValue);
6 u5 v! z7 Z6 M3 u* Q: G                       SafeArrayGetElement(pvNames, &aidx, &wsName);6 |( {  b* S% |, ?
* X9 w9 [  {; a" k! _5 b
                      BSTR bs = SysAllocString(wsName);
% B% U& G" J2 D, M1 w% H5 L" U- b: E8 {                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 O+ M: T  v  ?/ T
                      SysFreeString(bs);
# m  L: ^- R7 K+ C. I1 V' b. Q* E# n( _& l1 {- j
                      if(hRes == S_OK)+ T4 d4 e2 Y# B' O+ G
                       {% b7 _" V: K; P: {/ n& e( B
                         AnsiString s;5 H* ~% e/ R% |1 J1 H
                         Variant v = *(Variant*)&vValue;) t+ u: X0 n( `9 J
                         if(v.IsArray())
4 D' [8 V& n8 C' x8 A                           {
9 o& ]) d2 S$ q# u" K: L+ U8 c                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
4 W7 R  h: {$ G4 N7 B                              {
# Y* a/ \3 o+ S7 F" {                                Variant a = v.GetElement(i);
/ H6 u6 G- Y( E6 e( O7 X& @                                if(!s.IsEmpty())2 m* g2 j( O( q: K
                                 s+=", ";
% |& g/ h0 N3 e9 J: S: B                                s+=VarToStr(a);% p! b# E. c4 J% y8 a9 e9 W
                             }
* s; y$ _- p- v                           }1 S$ |' k3 l% R/ R3 F
                         else
8 _8 D( z/ A  m' ?: L                           {
( ?5 L3 {- o, |2 u. F+ z- }                             s = VarToStr(v);
8 E- R0 E) @3 _0 p                           }
! K" `$ Z/ F. e$ F4 w& e: `" D. v; E                          lpList->Add(AnsiString(wsName)+"="+s);
' b2 E& t( \* g' O                        }
4 j+ D( J5 x8 t1 x6 |/ `: k2 o7 G9 \& q6 n
                      VariantClear(&vValue);+ G* S7 t0 |" w+ X* r0 u
                      SysFreeString(wsName);, [" E7 ]( V' Q0 n: K% @8 f
                    }
- A! G4 S1 T8 d                  }& c. V1 d/ u( w- l. T, R1 T$ z  F
                if(pvNames)SafeArrayDestroy(pvNames);' s1 A/ U" r- G* a# e$ U
                iEnumIdx++;5 U8 X7 ]4 n" c" R% j% E% l
              }
7 A& A. M: P2 u: B            }
0 Y! C6 H$ T  v5 R( T           if(pClassObject)pClassObject->Release();- F, w: i. `  L1 s: _* h
        }) J; Z6 I; P7 e- k1 y
       if(pEnumClassObject)pEnumClassObject->Release();
% @1 b# b4 T8 X. h+ C0 A* u0 K      }: {# r0 c9 V7 h7 E/ r; g
    if(pWbemServices)pWbemServices->Release();5 o) i( j% U4 [# u7 U
  }  z+ c1 b8 x6 S: l% z! Z8 i
  if(pWbemLocator)pWbemLocator->Release();/ f0 C! p! ^* M  Y3 f
}4 S" |8 s; w! x" K
//---------------------------------------------------------------------------7 J! y8 m. @% \2 I7 e. F

9 h& F. _5 \, B, ^4 `// 通过 WIN32_bios 获取 BIOS 信息:' M* A( N8 P3 F3 l1 {9 F8 B
void __fastcall TForm1::Button1Click(TObject *Sender)& _2 k3 o9 X. q; H5 r+ f
{
5 E& M: L* d* n1 c    Memo1->Lines->Add("================== [WIN32_bios] =================");
( |3 k6 F5 U. q) {, A9 F" i    GetWmiInfo(Memo1->Lines, "WIN32_bios");! [( W4 L/ v+ u
   Memo1->Lines->Add("");
- L2 G# {1 _" ?( D  V. q}( w/ u8 Z5 c; E2 D" {4 r* l% m
- X- v% E( |2 U9 O  ^' ]) \  T+ G
--------------------------------------------------------------------------------
- Z. ^; j4 i1 ?4 r2 r3 U5 f6 R% a2 z& N
3 q* m8 s5 X  c2 T3 H$ QWMI 可以访问的信息类型有:
0 I% B; D- P# k$ A8 X   Win32_1394Controller  A9 L) z' a2 F. k
  Win32_BaseBoard
8 ~1 z) K' x; _" D* \   Win32_Battery
1 Z' @! e% s* m$ J2 S2 X   Win32_BIOS
8 x6 ], I+ c: ?$ O% u0 A* J$ m   Win32_Bus
- M" X, N% h6 A, ]   Win32_CacheMemory( Y. o  A& O8 Q% r  P
  Win32_CDROMDrive5 O' ^2 ^1 n& z! h; g3 e
  Win32_CurrentProbe% z# H) H# B! C+ i4 v; q
  Win32_DesktopMonitor
7 g6 Q; b( U3 N' L8 o4 Y   Win32_DeviceMemoryAddress$ Z6 F! w$ f, w# Y  k4 A8 r
  Win32_DiskDrive
/ L; h& u+ l: I! d/ c   Win32_DisplayConfiguration5 O7 W3 a, T- C
  Win32_DisplayControllerConfiguration  ~/ q+ |& a* ]  H) F) t
  Win32_DMAChannel$ c: k/ y" e  `3 e
  Win32_Fan9 }, y, Q7 E6 g/ C& B
  Win32_FloppyController
# o( g3 P" Q9 c' w# O; g   Win32_FloppyDrive5 L- J5 a) H0 m
  Win32_HeatPipe
+ V! s4 n; [1 Y   Win32_IDEController
) K2 }9 Q7 L" @% X: D6 L   Win32_InfraredDevice
" F* l8 \+ h+ u  @& }) P8 q1 `   Win32_IRQResource
& n9 {0 l7 E, d* b! I' y5 i3 q0 i   Win32_Keyboard' M: v2 |# H- l' K2 |6 K
  Win32_MemoryArray
/ N+ w8 F$ Q. r/ i  u/ L   Win32_MemoryDevice0 q; S% I$ n; K% _) |
  Win32_MotherboardDevice! R6 C; `8 k0 u, m. ]& t
  Win32_NetworkAdapter# v4 |6 c" l+ V/ S2 q  D
  Win32_NetworkAdapterConfiguration
9 n- j: o  ^2 O8 @: y+ U$ N, i3 D+ o   Win32_OnBoardDevice4 S( ~. a0 m- a
  Win32_ParallelPort
1 f/ B- @% ?, f" ~( t* S1 M   Win32_PCMCIAController
+ D9 ~6 _) y( D# a6 l9 i! [$ r  d% _4 l   Win32_PhysicalMemory% E% G7 t7 }# R7 g& }+ A
  Win32_PhysicalMemoryArray
6 c6 {, K5 B6 L* ?5 a, h   Win32_PnPEntity. H/ W% o! d/ e( ], d  ]
  Win32_PointingDevice
2 x; G4 ]! }5 C   Win32_PortableBattery
! @$ j( V# f1 e) Z   Win32_PortConnector! O  D  R7 B, B& O0 T
  Win32_PortResource
7 s  b  \$ g3 {0 ]   Win32_POTSModem" m' u/ s) k9 Y  ]" X- c7 B
  Win32_PowerManagementEvent5 J, I$ t; J* u
  Win32_Printer  a6 l) I4 d1 W
  Win32_PrinterConfiguration
) q! @* a' ?9 H2 V, Z   Win32_PrintJob- ?  u, k- w. P" N  m2 ], B
  Win32_Processor  m2 R1 f, M$ u& B  U
  Win32_Refrigeration
6 `# t% B! l* p0 Z/ N! Y   Win32_SerialPort
/ N) \" ~+ k5 p7 M   Win32_SerialPortConfiguration
+ ^# p0 y( Z8 \   Win32_SMBIOSMemory
( ]2 k/ v! @  k7 w" a) K  W   Win32_SoundDevice
' L! B3 `6 n# f& p/ C   Win32_SystemEnclosure$ l4 g! Z1 Z$ B* H+ n5 A6 w
  Win32_SystemMemoryResource8 l7 g* }" u6 [3 x# ~
  Win32_SystemSlot
! u0 U4 p7 F- a& x  \   Win32_TapeDrive6 v2 O; O: ]$ \& N
  Win32_TemperatureProbe0 x! L% r5 C: ~  G
  Win32_UninterruptiblePowerSupply
) U, S* k0 H# ]4 U3 \0 n$ h   Win32_USBController
" f2 P3 b, p( U2 l/ s* i   Win32_VideoConfiguration
: ]9 \2 ~2 `) w9 {/ \  l   Win32_VideoController
. W- L( w0 E- q" M   Win32_VoltageProbe8 d! [5 ?+ [. ~2 z, f) q0 n

3 Q# L: }/ P& e, T' f  d以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-27 12:16 , Processed in 0.019116 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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