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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)  O' p( |. ~. {1 K( c  z
/ ^' y5 d1 M9 ?! T

' [4 D- B4 X! {( t" h--------------------------------------------------------------------------------) G: t- D" g( D7 n, N& x# g' ]
WMI: Windows Management Instrumentation (Windows 管理工具)
7 b7 K  G8 U, u   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : @( T- r" `$ ?0 G
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。9 \8 h5 T& Y$ T1 l
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 8 u! ?! B. Q" h

5 M2 k% S$ M9 q5 Z, m--------------------------------------------------------------------------------
5 V4 W" ^% T" JBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面0 x# y# p4 I6 _4 l- V. [
" [( J$ ?# s/ h7 _
--------------------------------------------------------------------------------7 B* C+ z) `& K9 ^/ Y
① 初始化 COM 接口:
3 K6 n+ D. z; V! Y5 c, F' m   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
/ y8 G6 E2 v* S7 U' X   这两个函数在 #include <comdef.h> 里面定义。. x* }" H0 c$ S6 n0 u% S+ V' x+ J

3 r5 Z5 d2 H5 G0 t$ |' W7 Z# e2 q1 L② 获取访问 WMI 权限:
* @4 x5 d1 B2 v& h  F. {$ N: _   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);" A: I0 Z$ u. k: h! c1 o
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。; [" \$ ]' ]. h& j0 V( R
1 v% N. \/ o6 s! B: h
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:5 U5 \. k2 a: Q! z& c4 w4 m* d
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。- A( p/ @" y! E

8 h- a" j! _, Y: Z. n/ o7 c! R. Avoid GetWmiInfo(TStrings *lpList, WideString wsClass)' \9 p! ?. p% t' O
{
- L4 Q) `# t4 w  g  IWbemLocator *pWbemLocator = NULL;
9 P! D* M2 a8 f& \  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
3 \# f3 v+ k) g' y& Q   {
# g: i; B( n: u9 `0 Z% w& r     IWbemServices *pWbemServices = NULL;+ k$ C5 x% C) v. _9 i" M8 i
    WideString wsNamespace = (L"root\\cimv2");
* Z  H; }7 \- x- Q7 w3 Y     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
' ]3 J' E) ]' j' W' k* `: B      {
& m  e7 H( V0 U. w$ A        IEnumWbemClassObject *pEnumClassObject = NULL;/ t/ J* v2 x9 U  S! c! s. x
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 h. r4 J5 G- q# I        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' }: [/ D0 T. A         {
7 z" g9 O; j& J3 d/ H) s9 G. ^           IWbemClassObject *pClassObject = NULL;# U0 K# f' B4 ^- f3 c3 L
          ULONG uCount = 1, uReturned;8 n# e, h" g5 g+ B+ X+ C4 g, i
          if(pEnumClassObject->Reset() == S_OK)3 ~- N: g2 t# I& F: C
           {9 k- o% ^5 [) u" g
             int iEnumIdx = 0;- ^4 g0 q: j1 u
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK); t0 K9 P( X% h1 B2 c" b
              {7 T" u5 V, s6 F2 u/ u9 l9 B
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");3 P* V  Y. ^3 ?5 r& G
4 a3 X/ L, q! F1 V% {
                SAFEARRAY *pvNames = NULL;) f3 ^' e0 O# S; u/ C8 L* g) Z' h
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
/ U( e* T4 U- f6 L                  {
1 w/ S5 l* v1 a% y: d# e                    long vbl, vbu;
$ ]1 n) t; q9 w% k! a$ f/ D                    SafeArrayGetLBound(pvNames, 1, &vbl);
: }# F& L" [% W2 l% r0 v( r6 n                    SafeArrayGetUBound(pvNames, 1, &vbu);
2 ^8 I, p# p% j  J6 r                    for(long idx=vbl; idx<=vbu; idx++)
5 g# ]  P8 F9 u) _* I" o                     {& s5 Y. u; V7 M! {& w1 G- V
                      long aidx = idx;
8 I4 n% F9 z8 v/ X+ g                       wchar_t *wsName = 0;
* M% @5 {+ Z! R: O5 z; U                       VARIANT vValue;
8 p0 O5 Q& B" m                       VariantInit(&vValue);. o5 u/ v7 m' y" {
                      SafeArrayGetElement(pvNames, &aidx, &wsName);$ V5 Y. u+ ]/ y+ s

# Z; ~7 i1 {$ ?7 N% K/ T4 Y% U                       BSTR bs = SysAllocString(wsName);
% z$ t) j5 o% E; i                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
1 i5 ^$ a' p" @" Z                       SysFreeString(bs);
! C% ^8 \+ {2 W0 P, {7 {( p( T& Y# c$ {9 w4 J
                      if(hRes == S_OK)) N# f% B6 r  G4 X) H
                       {! ~) Y: n, v/ T$ Q% E& V2 {
                         AnsiString s;
; U) I' v8 A  G$ }  n( C8 l# i9 r                          Variant v = *(Variant*)&vValue;6 d. y7 l- T# a8 Y
                         if(v.IsArray())
" y, o9 H9 [& k5 c: T7 x                           {
. j4 M4 H, I" f  X  C$ g, T4 _' d                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)$ [9 n: T$ X' T! G' S8 H$ [
                             {
( @* E1 s/ n+ j                                Variant a = v.GetElement(i);
. I" \$ \1 v0 ?% X8 c                                if(!s.IsEmpty())
) Z5 g' J6 y8 V% Z' ~# C% P                                  s+=", ";
. n( H/ Y" Y. Z% o( C# h$ v# m                                s+=VarToStr(a);
. _  X( W8 c1 K% `& O                              }# l3 t' b3 h9 }( W, D; j+ r! d* ]
                          }' L' u6 d) t: D& M! F
                         else5 z' u: @* ~/ k! N3 k% a
                          {$ \& F' y) W$ E3 y* o2 D
                            s = VarToStr(v);3 \0 A  Q5 U/ {3 E
                          }4 ^/ O/ j3 T3 T
                         lpList->Add(AnsiString(wsName)+"="+s);3 l) B! q0 ^7 J# Z4 E
                       }
  q1 V' Y: e  U# ?2 A# A1 J+ ]' a% T" ^) ]: z: Q3 t
                      VariantClear(&vValue);$ Z2 _/ U$ i  R0 U! M8 b3 m9 m
                      SysFreeString(wsName);7 a& [9 V" \, i/ [8 d
                    }8 u) e4 @9 [1 F/ @* h
                 }6 d6 U+ j# d3 D" Y
                if(pvNames)SafeArrayDestroy(pvNames);! h4 b5 g! H0 F' i& \
                iEnumIdx++;$ T' D; i2 C8 d1 t+ ?( ~
              }7 W) ]9 v3 `7 ~. f% X
           }9 u( D' p  K- d4 t
          if(pClassObject)pClassObject->Release();
4 H7 a0 m% j( Y" \         }: B2 U1 y, E7 c  }
       if(pEnumClassObject)pEnumClassObject->Release();0 B  e. \( W" I
     }
' n9 ^0 M# t' v% N! M& i     if(pWbemServices)pWbemServices->Release();
4 h9 N9 W+ i. @1 [+ D$ m1 L   }
& r, P! \. x$ @  if(pWbemLocator)pWbemLocator->Release();
: T' l1 |" c4 B0 L2 U! w}
4 T: q& ~) B: w% C  y. x. K, ^//---------------------------------------------------------------------------/ k6 e( n* u" m" L8 B- N
: p; E4 Q8 w& N4 g6 |9 \, Y
// 通过 WIN32_bios 获取 BIOS 信息:1 m7 i5 m% c3 h. O9 a0 H; \  c
void __fastcall TForm1::Button1Click(TObject *Sender)
$ u; k/ D& p7 a5 C{
& `) _' |" r; L    Memo1->Lines->Add("================== [WIN32_bios] =================");
5 K& n5 l; \' A5 L, M8 ^9 b1 Q0 k    GetWmiInfo(Memo1->Lines, "WIN32_bios");1 k# H$ s( E3 N5 p6 o; t- ]' X# g
   Memo1->Lines->Add("");( X% L- {; v+ T0 m8 K
}
3 g0 W' ?9 k" {' Z! o( o7 c5 r4 D
--------------------------------------------------------------------------------
% A; b2 ^5 v* F
9 h( E9 M. O) }WMI 可以访问的信息类型有:2 `7 i% K/ Z& W* K/ c1 Z3 E
  Win32_1394Controller  Z0 j% r2 `. E% E
  Win32_BaseBoard
; G1 z' x0 |3 G9 v( P' T6 {   Win32_Battery
2 F& V% c2 X/ O7 V4 @   Win32_BIOS0 v! j5 m$ W7 \0 x0 L
  Win32_Bus
! x! o* \% _  U! v1 P% C. V, ?   Win32_CacheMemory
' Q) |; ~5 }2 A- s   Win32_CDROMDrive  [) g; u! L3 T: X8 V& V* N  M6 z0 r2 V6 r
  Win32_CurrentProbe
% ^) Q; T  ~' n) m/ _   Win32_DesktopMonitor2 b" X# g; N5 B6 I/ P
  Win32_DeviceMemoryAddress5 H7 }- q: b' v2 r7 _
  Win32_DiskDrive
, g# z9 j4 y- p% x* k7 l6 k; n5 `   Win32_DisplayConfiguration/ a* F  c& f5 z( P
  Win32_DisplayControllerConfiguration. B# R5 i) f' c6 w' s! x& H1 G" m. S
  Win32_DMAChannel
" x7 s5 j/ I7 k   Win32_Fan
' ?! |# H, ^: p7 [4 L) J   Win32_FloppyController) \; E& J1 e5 `2 L8 `. }
  Win32_FloppyDrive
6 u: N) }! m# W6 X' G8 f7 N0 }6 c   Win32_HeatPipe
. c  }& j2 k" n8 ?& Y2 w' b( T7 ]   Win32_IDEController
, J) `9 C+ {4 C" F5 F! z   Win32_InfraredDevice: z' E% e  ^/ K* N7 M" G  e
  Win32_IRQResource
$ s* O3 i4 ~( g3 x+ d) g   Win32_Keyboard. R/ [# x. g: ^
  Win32_MemoryArray0 x# C# `5 \6 P  ?% W
  Win32_MemoryDevice' v0 J' @- c+ |) G/ e- J- r" ?
  Win32_MotherboardDevice( w* O6 Q- b- t/ ?8 {$ V8 r( a: W
  Win32_NetworkAdapter' k8 K+ A2 N8 n3 p" E  i
  Win32_NetworkAdapterConfiguration
' ~/ h& p  N  y) w+ ?- O9 I: m+ r, A8 [   Win32_OnBoardDevice
( [5 X; F$ u$ x4 }) s   Win32_ParallelPort: V( @' L; W8 x0 _9 h: G( N* m( I4 q
  Win32_PCMCIAController+ C) [4 {& [& r
  Win32_PhysicalMemory1 M; A* N2 s* T- L9 ~
  Win32_PhysicalMemoryArray
. Y, S  l" m1 t: q   Win32_PnPEntity; D5 p1 N& @! H: n5 m& h/ \9 _
  Win32_PointingDevice4 q) r& n( r; i
  Win32_PortableBattery' U* T0 d* I+ ~. h2 f$ a; y7 s
  Win32_PortConnector* h/ y2 _. q5 D6 ~# p
  Win32_PortResource
  U* `; L$ P3 c0 r( n! B. j   Win32_POTSModem: z  w) H! r/ W. g3 \) @. V% }+ v! l
  Win32_PowerManagementEvent& q  t$ a( z- f1 j& q, _
  Win32_Printer
2 X2 L  F# `0 q8 H" F$ ^   Win32_PrinterConfiguration
' C$ I( z. M( w1 q% _   Win32_PrintJob
5 G4 [) ?/ h$ w/ C4 {) A: R   Win32_Processor8 g4 |. r* L& Q1 _' p* z
  Win32_Refrigeration
9 v9 W4 `8 i: ^. K1 p   Win32_SerialPort
# F& H; c' {- y6 k5 f   Win32_SerialPortConfiguration6 s0 {) q7 n% x/ P
  Win32_SMBIOSMemory2 _% Q& l9 s$ P% ~
  Win32_SoundDevice
6 y" H! |; u  Z3 I6 p1 V2 u9 c+ o   Win32_SystemEnclosure3 E: K4 S4 Y3 \% {9 S* s
  Win32_SystemMemoryResource
' u" w4 r$ p- K8 E4 J   Win32_SystemSlot+ m, j9 V0 D  P2 D. O& J1 r
  Win32_TapeDrive
' _! U' h) p3 r3 `   Win32_TemperatureProbe- k2 R$ j$ I* b# s
  Win32_UninterruptiblePowerSupply  p9 \2 f' h% G9 B* K
  Win32_USBController
5 b  h$ M( p; y2 S   Win32_VideoConfiguration
" p+ K/ Q3 l( H+ W+ h# U0 M   Win32_VideoController
' j; [$ `3 S1 y3 q' y3 x   Win32_VoltageProbe
9 z& t& S8 t6 `7 i& `, b
. o% ~0 o3 j4 O6 S! C0 _( }! n& K, S以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-24 12:06 , Processed in 0.021020 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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