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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)" |- b0 `- ~! [2 A+ T5 j" U3 K$ J
* {* O" I9 s) T

+ a8 ?, W; i' [+ _--------------------------------------------------------------------------------
2 H" A! Q) h9 {6 l0 r5 o  BWMI: Windows Management Instrumentation (Windows 管理工具)4 m! t, I# v' N' o6 @" B/ @
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. i( x5 `2 R4 b1 o( k' A- w6 k   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
# A# F" e. ^0 \1 l& K+ b" E* t   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + ~  A; A9 U. B3 E6 B$ B/ Y) M! Q

3 W* n9 i- m- \! o- }--------------------------------------------------------------------------------
- z1 A* `" `* O6 I) a' pBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( u& ]. h7 U& a( c0 J" A: S4 R: Y
$ L4 n1 W, b) d7 i9 ^; q. H& a--------------------------------------------------------------------------------
1 C$ m* l, p2 T+ |① 初始化 COM 接口:
) b: F$ {. \* o& v* n   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
4 c6 C) }: g8 A# b5 [/ y   这两个函数在 #include <comdef.h> 里面定义。* d+ j$ O+ A- c( T% F3 Z
$ ]! q' u7 r# O, g1 T1 W
② 获取访问 WMI 权限:; Z1 @' R- d+ `& ]
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
& v! F( Q" T$ R, F) t6 A2 u# c   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
2 W; T2 J* K0 B4 t* W; d; t6 c+ Z5 \2 U% D" @7 K
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:. u* Q/ A, L# e- U" I. n
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。7 G* m9 v, ^# T$ a4 N' @. x
1 r' E2 C1 D! v  W5 E4 o
void GetWmiInfo(TStrings *lpList, WideString wsClass)6 `& N* X6 L$ X6 w5 S
{
+ f1 m) i9 J" W- H2 n+ J: E" }* `8 N  IWbemLocator *pWbemLocator = NULL;
' j. ^+ u& [8 o8 E; W  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" @6 H) R0 H7 \# o6 y# ^3 ~   {' b5 T2 Q3 Q4 a  H1 y4 z$ {# C2 J9 ~
    IWbemServices *pWbemServices = NULL;
/ X8 K. f, p* S9 P/ {  b# s     WideString wsNamespace = (L"root\\cimv2");
/ |# {) `2 T# q% p& J     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)5 t( v. h* I1 {; T
     {
- b2 \9 C+ @# a# c  W        IEnumWbemClassObject *pEnumClassObject = NULL;) s7 Q$ U' J) N4 }' x. p- G
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" l, ~# X# r6 `6 X' t
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' T( |  X7 [: h: K/ a         {. X# W4 l; s- p# s! N2 [
          IWbemClassObject *pClassObject = NULL;7 x0 ^! Z0 |  x; ?2 T: q' U6 d6 j
          ULONG uCount = 1, uReturned;) v: F& j# `8 u+ N  C' j+ Y
          if(pEnumClassObject->Reset() == S_OK)
7 E0 |/ ]) H: L+ \. V            {
* Z5 i, @; \( e6 Q' B              int iEnumIdx = 0;
% a3 E9 [/ g' g; ]1 o              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)6 X+ T9 P* Z0 N# K
              {) e  q$ Q2 z" L) l
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");5 Y* P( [( O1 a1 p9 g( W3 \

$ b9 b8 O1 D) v! s$ C- F. M, S                 SAFEARRAY *pvNames = NULL;0 d3 a. W. I( b- m' p
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  i0 C; L6 C2 e/ H
                 {' ]9 w9 i  Q- G) c# d$ E. N" Q& y
                   long vbl, vbu;
( W: q1 J% }' Y+ k; l; a2 h                    SafeArrayGetLBound(pvNames, 1, &vbl);. E3 F, r: ]: W6 |! r) L) m' B& h
                   SafeArrayGetUBound(pvNames, 1, &vbu);
& b! T3 D; D" N                    for(long idx=vbl; idx<=vbu; idx++)
* g' K1 w9 M' ?% Z1 N6 A" Q8 }                     {- @9 P( Z) ~5 _' W) m
                      long aidx = idx;
3 c5 D: m* U/ z8 h2 r                       wchar_t *wsName = 0;2 U) u2 @: @, t2 m, c
                      VARIANT vValue;
0 q8 y: F4 V" @' w! Q+ m5 {6 O                       VariantInit(&vValue);4 J# ]$ ^8 A! ~" A& Z2 b; Y* v
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
: e/ p8 W% ?& ]* A# E
, f2 b2 f# @+ n8 D2 F                       BSTR bs = SysAllocString(wsName);% t8 g, ?! [" q/ O: g/ X- X3 u: X! G
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);/ ~' D9 E% t& A' [
                      SysFreeString(bs);
# J0 q5 T, u6 Y% H* y! _% @1 P) S
# S0 A( x, i3 x3 o, E0 w9 K                       if(hRes == S_OK)  O+ a! q9 y1 m0 X, a
                       {
  d4 p: I+ ~/ u9 b                          AnsiString s;& V1 H# ?$ a; m2 Y) o
                         Variant v = *(Variant*)&vValue;0 I0 ^3 p. g. |& E. _
                         if(v.IsArray())+ y2 e# u: i+ b' ^; O9 o* h4 m' p
                          {
( Z0 z0 r/ l. {, h6 Z                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
; W& X& p. N6 s9 c2 G  E8 D                              {
( H9 ^* ?8 u: ^6 d$ M; y                                Variant a = v.GetElement(i);
: v7 u- ?0 |9 Y7 a7 M+ h5 n                                if(!s.IsEmpty())7 Y- V; A: L  ^5 ]( q
                                 s+=", ";
/ P3 p  t8 y4 Z. D                                s+=VarToStr(a);: h% N6 R% ~2 n
                             }: P, a1 H$ W+ f
                          }
- U5 |( E6 }% c: W$ v                          else
+ p$ W+ H6 \: Y5 u- M- e                           {
: L' U: O, [* F! `                             s = VarToStr(v);
5 n+ [% o1 ?  a2 a: g+ S3 u                           }
$ H% B1 B0 ?5 N' D                          lpList->Add(AnsiString(wsName)+"="+s);3 `* t$ Q  k/ d) N  G
                       }8 Q9 J% C: O8 |! ~) f) P( U

" o4 X9 d: @8 c  S/ e6 g2 f                       VariantClear(&vValue);
4 l; h. C: A+ I                       SysFreeString(wsName);
+ M) z# g0 n( Z  z4 C) ?6 I                     }. I: D, l7 ~2 W! A
                 }3 y3 G. z- X- ]- }/ \) q, n
                if(pvNames)SafeArrayDestroy(pvNames);
7 k+ ^) {1 U- i8 j                 iEnumIdx++;, R/ H! f! d4 o! b
              }! T- `2 y4 S  Q8 Y' Y! K# f" ]
           }- }7 |4 C/ C' \  j# ~5 b
          if(pClassObject)pClassObject->Release();+ ?# ]2 q8 T5 y# T
        }% I; N' D. X; K! x' i. l
       if(pEnumClassObject)pEnumClassObject->Release();& K% L! [, j# V* L9 ?+ d! [' A8 M7 Q
     }
) _1 y( m% b2 i0 J5 S! L( {     if(pWbemServices)pWbemServices->Release();
' n' j& q3 h1 P9 j   }
. Z' b1 E! L/ X# L" M  if(pWbemLocator)pWbemLocator->Release();) Q2 X0 P. H2 {2 k+ k8 t
}
# U" L2 T$ Z8 A3 I! b7 p, J, y# [//---------------------------------------------------------------------------, B2 d' S" w1 e/ D2 m2 h$ _

. Y1 }. C9 d( K5 a7 Y// 通过 WIN32_bios 获取 BIOS 信息:
( d9 |* n* i& m7 xvoid __fastcall TForm1::Button1Click(TObject *Sender)
& N# {! ]& ~4 U, N# H( K{
% L" z4 w, B% E0 n2 S$ O    Memo1->Lines->Add("================== [WIN32_bios] =================");9 d# r, ^7 P$ x
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
" ^" b. g7 [% x$ i# e9 v) \    Memo1->Lines->Add("");
1 r, ?$ j! }2 {+ `8 R}
3 ^; W3 Q1 j* B* z. C- S, Y) L- L* K3 [
--------------------------------------------------------------------------------
0 f; Q- {/ [  \) l6 n6 k: ]* I  }( Y) P+ e
WMI 可以访问的信息类型有:( V1 H* k. S& L
  Win32_1394Controller
4 W; ~& i/ j8 N% r/ S   Win32_BaseBoard
* `6 o7 [& f) o, g9 ~   Win32_Battery
; c; ~! G9 I+ n! S. S* p( S   Win32_BIOS
. B1 N" X  p5 y3 i$ Z; _   Win32_Bus9 Y& |9 K" ]7 f" u5 a
  Win32_CacheMemory  y4 N( N8 Q- K1 B" `# C# S; b
  Win32_CDROMDrive5 u0 Z7 g, p8 p6 v
  Win32_CurrentProbe
4 R. \& [; e6 h6 \   Win32_DesktopMonitor8 k# i1 B9 M* A
  Win32_DeviceMemoryAddress
  B/ P) z$ X% X# ?9 `/ L   Win32_DiskDrive7 Z2 `" k0 M1 s. P% \0 |" o( ]3 F8 _, v
  Win32_DisplayConfiguration3 z$ d) e. r- o  J& S. o
  Win32_DisplayControllerConfiguration
7 p+ {/ }, C7 _; n0 \) W% J   Win32_DMAChannel
9 R- ^$ c. Q' e9 L( b( @   Win32_Fan* G% h- q. ]1 @  c+ @
  Win32_FloppyController
+ `8 C- ]1 ~( A( \   Win32_FloppyDrive# j- c. x6 a( a9 y' k/ ?
  Win32_HeatPipe7 o6 H. E" @2 q1 }4 ^
  Win32_IDEController1 _& [- `3 ^- L/ c  {6 \
  Win32_InfraredDevice
+ z+ I* S. V' T" k6 d: ~  i1 [! w   Win32_IRQResource' O4 I8 o4 F+ o- x" M( s" P
  Win32_Keyboard
  F! ^- d6 D$ f( H7 B% y  i7 q   Win32_MemoryArray
7 e  s0 P: |  Y7 B5 ?   Win32_MemoryDevice9 H: d! G$ g% O& p
  Win32_MotherboardDevice/ b! V' r9 m: \/ G, z
  Win32_NetworkAdapter& ]: F: h4 w0 t5 R' V
  Win32_NetworkAdapterConfiguration
( |( z$ o# R: ?! C- j  G6 O1 v* a   Win32_OnBoardDevice5 R0 e( ~. `: t; C0 M" {! p, g# l
  Win32_ParallelPort! g8 D/ B7 V0 M: }
  Win32_PCMCIAController. u4 Y9 @2 ~, ~6 l, @
  Win32_PhysicalMemory( L" j# b$ Z( i: J
  Win32_PhysicalMemoryArray% B* C( L/ e2 ^( c1 \* q
  Win32_PnPEntity; g* j; p0 D2 V( n/ A! d4 ]- m
  Win32_PointingDevice2 t& x5 t/ M  q& Q& c' \# D, P" o
  Win32_PortableBattery" ]3 y6 V/ U* S- g* o2 p
  Win32_PortConnector4 @0 f% j& k" V6 Q8 v/ n
  Win32_PortResource8 G/ _, g/ A  n( f9 J4 X
  Win32_POTSModem( q; A& O( Y' u* y# Z
  Win32_PowerManagementEvent- g/ ]# a( V4 `' B$ G0 ^
  Win32_Printer$ `( [/ Q7 }; h/ `
  Win32_PrinterConfiguration
& ]. U- q( ~* h7 D3 ]1 U   Win32_PrintJob. }# n4 A* M4 K
  Win32_Processor
- ~- B- X7 U% Y8 a9 }8 O9 F   Win32_Refrigeration: P4 q' \. w0 |. i: u
  Win32_SerialPort
; F8 d% q9 P9 `2 s: n0 P2 B   Win32_SerialPortConfiguration# Y( r' Y6 O+ r' K) ?
  Win32_SMBIOSMemory
7 Q# D4 _) `% Q  B   Win32_SoundDevice
; r- W9 Q' O! c) q" t   Win32_SystemEnclosure
( K# @8 D. `- ^. q0 c$ a   Win32_SystemMemoryResource
! V% ^4 {* q: n) _9 n   Win32_SystemSlot8 L( I( q0 D+ b* x
  Win32_TapeDrive
( i7 f+ B, g" O. ?   Win32_TemperatureProbe
! D+ M+ }% g5 V( e% o3 D  ?3 i* M   Win32_UninterruptiblePowerSupply5 b: u7 Y- u$ s( @# A
  Win32_USBController
/ K# \! g7 F: L: ]   Win32_VideoConfiguration$ s: z( {! O$ |4 f7 O) U* w0 R+ A
  Win32_VideoController* ]8 z0 Q- w1 G2 b( I" l
  Win32_VoltageProbe9 J- o- Z# \- e8 }* F# R; B; e
1 `  t: j% V2 l! y6 [* o0 t0 S8 B
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-19 11:23 , Processed in 0.021455 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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