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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)) n$ h( b) V  @/ ~- K. C% [

  t' M$ P  n& d. F0 {5 _. C) c4 q; ^0 s8 i" ^2 R
--------------------------------------------------------------------------------* R, H3 l2 h# @' W  q; b, w4 S/ s
WMI: Windows Management Instrumentation (Windows 管理工具)
$ Y+ t+ \9 Y( Y  u6 L   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 K2 ]  Y. u& D+ _   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
, f, k9 y9 e& j   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 9 u5 k4 U7 R8 u$ t/ W

# v, @* c; m7 D' b# j& o--------------------------------------------------------------------------------
/ y% B, |) }0 wBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面/ A) d' c) }$ s- W
9 X4 G0 U2 f$ x% t1 l9 t
--------------------------------------------------------------------------------
& n2 a% n  {- M) ~① 初始化 COM 接口:
$ K9 c; [, B, c8 K0 u' S   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 A4 a6 U" @. J- e% V+ q; X   这两个函数在 #include <comdef.h> 里面定义。! M5 O3 v9 c  X) o' a
5 g5 s) z! X6 Y! R
② 获取访问 WMI 权限:; z; |( n( ^5 y  h
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
7 G- u  T0 f0 w8 i: e   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
+ k  F# s' s  f! q- f" J  Y  B
; v' t" ~# _7 [5 n③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
; S: j8 Q$ `8 R( \2 {, _# A   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: z! D( v- Y5 y8 [
7 U# t" n- @8 {" w( d  b6 Qvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
+ y# c0 g/ e. ?( Z* \8 [* {{
) G4 c$ j7 a0 e6 t# d: R) k  IWbemLocator *pWbemLocator = NULL;$ c) Y" t/ J- t3 \+ |- w+ V
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)8 g  C% Y, _, q! k3 I! d; L# L
  {" m7 l3 o. j) g+ l5 w) q9 i9 T
    IWbemServices *pWbemServices = NULL;
/ C+ }3 v6 ?( o' ~  z  V+ L# n     WideString wsNamespace = (L"root\\cimv2");: q4 t" l" o$ J! E" E/ |  }' V
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
0 |3 D  e9 I6 J, V0 H      {
. y* v3 c, n9 J) g, K9 u        IEnumWbemClassObject *pEnumClassObject = NULL;
# J3 p9 S7 u0 i/ Y) T1 `3 K! e        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;' }! W) y! ~1 X- q; H
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)7 I+ v% X" h  Z% @7 }" n6 ^$ |
        {& U; k- o& O# c# N& ?3 o+ ?
          IWbemClassObject *pClassObject = NULL;* y" B! E. B  r5 k& _( ]- |
          ULONG uCount = 1, uReturned;! U0 e( \: k$ ~1 ~: p" b4 A$ q" c/ s7 |
          if(pEnumClassObject->Reset() == S_OK)$ H8 ^; P) v- k! L) P
           {
' p! j' _2 D! ?( G              int iEnumIdx = 0;$ R5 e; u+ x1 {3 }8 W: L9 Q& S# H
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)- r7 N' W' s% @+ V  }3 c5 h" u8 }$ q
              {# g+ }/ ?- |% }( ?- _
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
4 ?& p/ O) U& \3 C
7 I9 p# b2 ^" E. ]' E1 D+ C                 SAFEARRAY *pvNames = NULL;/ ^8 m9 x" }' i& f
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)2 g8 R8 y' f0 O# l' n
                 {2 `: w7 ]$ _- C
                   long vbl, vbu;% H" i3 c7 V) R/ m8 `
                   SafeArrayGetLBound(pvNames, 1, &vbl);* r4 z7 g( k$ ]% v$ m
                   SafeArrayGetUBound(pvNames, 1, &vbu);
$ P" e$ X2 B+ B. J, [/ q5 P                    for(long idx=vbl; idx<=vbu; idx++)* m0 M' ?6 n% k; y% l9 S9 h3 R
                    {
. }5 ^8 l3 c$ b8 N( B% a4 N2 H                       long aidx = idx;
# M/ a2 }* ~6 _/ Q8 h                       wchar_t *wsName = 0;% k9 l( V* E0 I$ R
                      VARIANT vValue;
( g4 H6 i) r7 `( }* z% M# F                       VariantInit(&vValue);3 E/ \/ J, t0 b8 R
                      SafeArrayGetElement(pvNames, &aidx, &wsName);0 u+ j$ T! c3 ^9 J3 e% ]2 f
0 P; k, [1 I1 |' T7 x0 x$ f
                      BSTR bs = SysAllocString(wsName);1 S9 g/ F& M' u8 a
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
4 M& u) f; n. U. e, L: t                       SysFreeString(bs);
8 z8 W6 }3 s" M7 o4 s0 w7 X4 j- w: \: b& k+ H+ @
                      if(hRes == S_OK)3 V1 @( [4 g1 j2 C7 m
                       {3 m, \, r3 N/ n7 |
                         AnsiString s;1 X* t# A! v# g* N
                         Variant v = *(Variant*)&vValue;
; `- Q+ z5 [+ m/ c                          if(v.IsArray())0 }8 K3 A# Z; I* {7 j" a% `; o" E
                          {
' D- m/ U& K( E0 w                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)4 R  h, i( {, y+ J) ^  Q. k
                             {$ J- C* p) }& R; b
                               Variant a = v.GetElement(i);0 r. h" Q2 ]$ Z. J3 f8 |
                               if(!s.IsEmpty())# G, H$ ]9 r! c
                                 s+=", ";2 ?  ^) y7 q9 P
                               s+=VarToStr(a);# Y- j0 F& ]/ Y0 m
                             }
' V+ j7 P9 @' U- y8 s5 [: j! u/ X1 J                           }+ C% K- C5 a5 z; L1 }: h9 [
                         else+ t9 n  i. h' Y' [; s
                          {$ x5 y* ^- V9 [8 j9 M* B: V  b
                            s = VarToStr(v);9 V* m; K1 j5 r9 ]
                          }
! f4 W$ e9 R" k6 O                          lpList->Add(AnsiString(wsName)+"="+s);
( u" M+ f: H& @                        }0 V3 w5 d- E9 T8 }# n/ D

. `( t+ A. ^& j1 A: u6 E0 W6 G                       VariantClear(&vValue);) [+ X# n$ O/ V; A5 `* D, S
                      SysFreeString(wsName);
# N% n8 L/ l1 j/ C' B) p                     }
- E# `3 v. q" J0 Z" k                  }
& g8 V2 `/ h7 i* q5 J8 p                 if(pvNames)SafeArrayDestroy(pvNames);
' X9 U. G0 D. }0 S5 W: l                 iEnumIdx++;9 F  h  V. F! ?+ y
              }
4 k$ j4 a1 Z! G/ ?# U& I; Y            }) `; Q5 j, @0 ]
          if(pClassObject)pClassObject->Release();
# R0 t9 C& a# N9 Q9 _: t8 i         }1 |- ^' |/ B8 I8 g: z9 z: t
       if(pEnumClassObject)pEnumClassObject->Release();
8 a! C  {4 K' g! p      }, Y/ S* B2 K# z: p+ V+ V
    if(pWbemServices)pWbemServices->Release();
' D3 F" E2 F9 R   }* x' Y# ~9 c. a3 i5 T8 q
  if(pWbemLocator)pWbemLocator->Release();8 @' I! K# ~: n' a1 q& O
}6 ~/ o7 ~) a; J% [, K1 d
//---------------------------------------------------------------------------
) I" i& H3 k0 F; |& v" S7 T
+ N+ Y# ^1 d, c. ^! S// 通过 WIN32_bios 获取 BIOS 信息:5 @# a4 T3 B5 v9 y! w! k% W
void __fastcall TForm1::Button1Click(TObject *Sender), ~4 M7 C9 {2 D- Y- G7 z; P
{; k1 g: A3 ~+ M4 B) D
   Memo1->Lines->Add("================== [WIN32_bios] =================");! }+ j7 C6 k/ u/ g8 [
   GetWmiInfo(Memo1->Lines, "WIN32_bios");2 b7 @; d, @& E& W; \7 k
   Memo1->Lines->Add("");
' G1 w9 J; z- O}9 f7 U$ I  T+ N" B7 L' z: p) F9 l

1 l/ t* J6 C7 E--------------------------------------------------------------------------------3 P! |+ f1 |( [' T9 K7 h7 Q
2 f% W& P/ u- X
WMI 可以访问的信息类型有:( U" Z" T% M; M& i
  Win32_1394Controller
% u3 a6 d' e7 x7 G5 v" w( V  R- Q   Win32_BaseBoard
6 |* H3 N0 H- N! h* b) i  @   Win32_Battery
/ W0 }* C' w& K' |  N   Win32_BIOS
3 Y6 W2 k0 O1 p& M5 N( A   Win32_Bus
7 g& r: y5 s* i9 p1 F   Win32_CacheMemory4 o. M# }; }4 B# R1 i0 Z
  Win32_CDROMDrive* f; z( D! A$ N( K* [/ t, W
  Win32_CurrentProbe+ D" D! j- \6 P6 j
  Win32_DesktopMonitor
! ~# i7 l4 h3 v. o4 W   Win32_DeviceMemoryAddress
) z5 |0 G% ?! e, N, C8 j   Win32_DiskDrive
) l- _4 f$ D. `. t8 E% P1 q   Win32_DisplayConfiguration5 W& q7 Y+ v! c$ }: H" q
  Win32_DisplayControllerConfiguration8 m* G: l* p1 |) g; c
  Win32_DMAChannel* `5 L1 a, S, c5 q
  Win32_Fan
- X4 b- S, m2 y' q9 f" @3 j   Win32_FloppyController) [+ ]# Q- f1 e9 {( k$ \! T( }
  Win32_FloppyDrive
+ Y3 [! I6 U6 a6 @   Win32_HeatPipe
& \! q& X; N" s8 }   Win32_IDEController6 s! I1 O3 g* ?- ]# U4 \+ a
  Win32_InfraredDevice
$ j  e7 @2 J, R$ R, w   Win32_IRQResource' p: I8 V3 z# m. n8 ~& ]
  Win32_Keyboard
) w) C' _  z. {( T5 X/ s! w% A5 j   Win32_MemoryArray' Y/ I( O7 @( A" ?! ?8 w8 m
  Win32_MemoryDevice
% l6 u: F* |$ H, @   Win32_MotherboardDevice+ L- T* R* N/ T* W# e
  Win32_NetworkAdapter$ h/ H$ E4 k# R5 {5 b+ s5 e' U
  Win32_NetworkAdapterConfiguration" g4 l7 w; |8 N9 U% F4 G, B+ U
  Win32_OnBoardDevice
6 Z3 H; P- b4 Y+ Q: x  ?8 f. \   Win32_ParallelPort
/ L, [& u) d% u4 H2 v- W$ l   Win32_PCMCIAController0 Z& u! \8 J5 O. R0 L5 n3 N4 l
  Win32_PhysicalMemory3 E/ ^2 m2 A: r2 K, T3 r: s
  Win32_PhysicalMemoryArray
; ^+ b+ j* Z  L6 j3 G0 |* U! Z   Win32_PnPEntity* g' j& v$ v: q  V
  Win32_PointingDevice( s: G8 v) D% A4 M  p5 Z. p' B
  Win32_PortableBattery
" m7 e  Y: x" X4 }- J( T3 E   Win32_PortConnector- E' y- ]: A3 W9 U
  Win32_PortResource0 I* G! V0 k+ {: j9 M
  Win32_POTSModem
7 ^3 w/ O  U% y   Win32_PowerManagementEvent
/ b$ g) z: a  w' q. q   Win32_Printer
, y& P! `. ^# W$ G+ k   Win32_PrinterConfiguration
: p$ X4 J% @0 P0 t! d   Win32_PrintJob: a# U2 L- \! u% L
  Win32_Processor* j1 A3 x9 t" a
  Win32_Refrigeration. O! y/ F  r; q  J" D# U; c2 s
  Win32_SerialPort
! I. s2 Q  X5 C# q" ]   Win32_SerialPortConfiguration* o5 p3 O! ^/ |  g/ |3 K6 ~+ L
  Win32_SMBIOSMemory. e7 z/ n# n: q! z( n; b5 ?: S
  Win32_SoundDevice$ K6 u- y9 @1 M+ H0 ?3 _5 y
  Win32_SystemEnclosure( a6 k8 w; U- H
  Win32_SystemMemoryResource
9 }$ r  |( _( ?1 a+ l+ m" E   Win32_SystemSlot
% P) ?2 I  `! e' l$ C. K* Q3 o# |0 M   Win32_TapeDrive
. @% m- L+ v* C, m   Win32_TemperatureProbe
/ p3 r+ d7 o8 b* I' ?6 d  N9 D% e   Win32_UninterruptiblePowerSupply
& V# j" z) {+ e' K) d8 f7 U   Win32_USBController0 n2 D. j) _; r4 m. H3 W9 e
  Win32_VideoConfiguration% X- L1 R+ l4 E2 Z: \
  Win32_VideoController  P0 l- c( S/ b# k/ m$ c7 V7 R
  Win32_VoltageProbe7 B5 I* N# P: P4 F! p- ]
2 a( M& Y1 Y( R8 P9 y
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-1 05:24 , Processed in 0.018238 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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