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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者), T/ Q+ p! S8 P

* N5 g& C& c" }7 N/ L& I/ p) m7 g1 d' z! o
--------------------------------------------------------------------------------* q  b4 Z4 c" B
WMI: Windows Management Instrumentation (Windows 管理工具)
* q9 }" x, o' h9 o( d4 g   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
- a; }% D  ]2 H- i/ }   利用这个工具可以管理本地或客户端系统中几乎所有的信息。1 m$ D2 [# N) e
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" L+ P2 }5 h: B7 q, [0 T- o5 p+ j0 ?) ~9 p2 p2 D, {9 d6 V
--------------------------------------------------------------------------------
1 P3 s8 R0 E, D! H3 S% z, L8 VBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 w; [4 H) R2 ?0 W. |
# m2 c, R: H! E
--------------------------------------------------------------------------------6 a% A' D' ]  }7 K
① 初始化 COM 接口:
; s, l, r8 c. U8 g$ U6 z( @   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
. `  Q! }6 }- Q' p0 o, l0 t   这两个函数在 #include <comdef.h> 里面定义。
) j( U! A2 x1 K( L/ u( b$ {% ~$ q  v! |/ o
② 获取访问 WMI 权限:7 {! @  Z% |' x0 Q) y% _1 D2 I
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
0 M; \9 h9 W0 ]- n8 l5 j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。7 {% a' e9 l4 l4 t4 ]# [
' c4 t& h2 J0 f5 C/ ^6 U9 r' P
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
  P6 T% |) H- x* ~   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" v& `+ P2 v. B  P2 L1 P- ]" A, y
! @5 _6 t7 w- q/ Z3 `4 i7 Wvoid GetWmiInfo(TStrings *lpList, WideString wsClass)" U. X; A) ?& l7 f' R2 W1 p1 L
{
1 h; P! B8 s3 o, b& G  IWbemLocator *pWbemLocator = NULL;
5 j# X2 c4 C; p/ H  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)- R" y8 k- ?7 Z# w& d
  {* A  `% I- v7 a6 \9 K% e
    IWbemServices *pWbemServices = NULL;* ^- \! e2 E+ b: C8 n
    WideString wsNamespace = (L"root\\cimv2");& c% O3 a* }! Z5 {% W4 T
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, h$ M. C7 w! x; ^% F      {
3 i1 J5 ^# `7 A! @' d        IEnumWbemClassObject *pEnumClassObject = NULL;' v" U# E0 k0 c! b3 W0 y/ z
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 X/ y; l% ?( e1 u6 u) B( k        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
8 T) k7 {! \; U2 p* ]( m0 g         {0 s+ {8 n- B  @  r8 H* G
          IWbemClassObject *pClassObject = NULL;
+ w) h" ]) |* y- k5 s: ?           ULONG uCount = 1, uReturned;
1 o3 v9 a; L7 S           if(pEnumClassObject->Reset() == S_OK)
/ b  U" E  A% i: R. r( y6 _  @% B            {
/ Y$ V; S5 P0 R/ R4 v. {              int iEnumIdx = 0;" P' l: o9 c7 Z) T- H) |
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, j+ T+ L! L' T* T! x4 n0 L) F) h               {
* l/ H# f9 @; Z' Y$ F) |. d                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, T, a& [% g4 f% I
, [* J! O4 a9 Q                 SAFEARRAY *pvNames = NULL;  @9 @5 N! S6 g6 T1 \% x
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)6 j4 \5 a. F; v# P
                 {/ N# `8 q6 B6 z/ }# p7 h: f& \) T! `
                   long vbl, vbu;
& P2 h+ |! s- P" d                    SafeArrayGetLBound(pvNames, 1, &vbl);/ L1 |, q0 b: ^$ a2 A
                   SafeArrayGetUBound(pvNames, 1, &vbu);7 ^) z$ L: D, ~& Z! `, B& t
                   for(long idx=vbl; idx<=vbu; idx++)
; e6 O+ d7 |8 z7 D% N$ I8 o3 e' k; m                     {
( F+ D% h) r% V. N5 Z2 y7 s0 \6 ?6 x; ]                       long aidx = idx;
3 \0 Y2 @; Z% L9 t8 ]% Z$ w                       wchar_t *wsName = 0;8 n+ g$ S# @2 \5 k5 }
                      VARIANT vValue;
6 y0 s9 W6 i5 t                       VariantInit(&vValue);
9 O9 F$ S# T+ [4 ^3 v6 H( T$ I                       SafeArrayGetElement(pvNames, &aidx, &wsName);% v' K8 H5 i2 k* F- \$ ^

3 q6 C# P$ p3 A7 S                       BSTR bs = SysAllocString(wsName);
! c, Z" G; d; E0 \& z- Z, F                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
* W8 M7 Z  o# ]                       SysFreeString(bs);
7 W) {1 v# b* ]0 d0 g# B+ G$ l: d1 C- S
                      if(hRes == S_OK); u! ^3 a4 y& z1 v
                       {) g0 w4 R9 N1 Q& |; C! P
                         AnsiString s;% A" X/ c; x  a; e# h
                         Variant v = *(Variant*)&vValue;
) i  Y; @) ?" ?! n' f6 O8 T) E0 E                          if(v.IsArray())& b  y- s: i0 h! Z- @( H
                          {
6 V, H( P$ a8 ]* @0 I                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)1 Y2 m2 o. a0 }" _7 g! m7 x- y
                             {$ i+ Q7 b1 N1 u' c% A$ E
                               Variant a = v.GetElement(i);
+ F. H' L! e8 |5 x+ z. S8 `' ]                                if(!s.IsEmpty())
3 k% e& ^) [/ Y) M' B                                  s+=", ";1 j. F. ~+ Y/ G
                               s+=VarToStr(a);( F( h) A; |. E# ^1 x: P; M5 K
                             }' V9 M$ d( M$ o" y: E; K
                          }  x3 {) g) c2 Y- \
                         else; J7 k0 A; @/ b- q
                          {
2 @& Q- I: p( X4 ?1 f, f( K& E6 i                             s = VarToStr(v);. L8 t- S7 v4 i
                          }
7 j% p) I4 U/ Z5 I                          lpList->Add(AnsiString(wsName)+"="+s);
' T/ [2 t& [8 ~' Y- A8 S                        }
. _3 w) {$ b9 z& Q4 h% I& e7 v6 d: x: `" _, o
                      VariantClear(&vValue);
4 R' p& t% C8 f                       SysFreeString(wsName);
9 n. S8 k" P7 b) k8 ]2 j4 o* C                     }
6 o2 p1 X7 T" g/ \8 n3 h3 |3 M1 [* A2 }                  }
) T, ]2 @: N4 Q- ^2 H- V                 if(pvNames)SafeArrayDestroy(pvNames);
- Y8 v) G$ R; X& P0 E                 iEnumIdx++;
  @; ?( D2 P1 d9 B# q- Q* t               }
0 ~5 h- |* A1 R8 Q7 S            }6 a+ N2 B& N) @
          if(pClassObject)pClassObject->Release();3 a  v, I- X7 b) F, V
        }
( x+ f/ |' E; ]' d) y        if(pEnumClassObject)pEnumClassObject->Release();
% o4 L! V: S8 ^& E/ L0 L# Q- ?      }: p! m4 Y) ]# s- N: w% t' W7 g
    if(pWbemServices)pWbemServices->Release();
$ x& r3 s. F: k1 F   }2 ~7 ]6 I( r/ h/ _- Q
  if(pWbemLocator)pWbemLocator->Release();" Y) v$ |' d$ L+ m5 b6 Y& }
}
) U% i) g) k( v9 X- k  B//---------------------------------------------------------------------------
* Q: v" @2 H- o2 a  z' |$ j
$ V3 L! G- `1 P$ p* v: W/ f8 P// 通过 WIN32_bios 获取 BIOS 信息:: Y: Z9 s- T3 n1 @$ W: l$ U
void __fastcall TForm1::Button1Click(TObject *Sender)
3 Z& k% ~. M8 @  s# N{
, l) R: c# Q( d, _    Memo1->Lines->Add("================== [WIN32_bios] =================");# ^* N4 P# D$ f' \- d: p! ?
   GetWmiInfo(Memo1->Lines, "WIN32_bios");6 a5 _6 m# K! w( J5 l* ^0 y4 U/ u% `
   Memo1->Lines->Add("");
3 I/ a- m6 |3 l. n, {}
' `' |% k8 A- A
9 G( y( ]6 T5 d" W( y! {--------------------------------------------------------------------------------9 m3 x" h, A, Y& F* h# O. e
! }/ X/ l! P2 j2 u5 k6 f/ {
WMI 可以访问的信息类型有:
, X# a! Y1 z; n; u( n   Win32_1394Controller0 A% l2 @- j. s, A, Q2 P
  Win32_BaseBoard
) j4 _4 h. V" `9 U2 C% k; m   Win32_Battery3 m$ @* K, W; s
  Win32_BIOS4 d0 }+ m( ?% o: s" q1 Q: d
  Win32_Bus
2 v  f5 |8 ?) P( D4 v, U7 G/ h   Win32_CacheMemory
' x3 d, n/ B1 _; X2 U- `: u   Win32_CDROMDrive4 c8 g, E  k5 L8 ?2 U3 u/ l
  Win32_CurrentProbe
; o/ J3 p" c- W1 M' [   Win32_DesktopMonitor+ n7 v9 L8 {, E0 e3 y
  Win32_DeviceMemoryAddress- R, B7 Q/ j8 D! x/ y4 y5 j
  Win32_DiskDrive
  l4 C, c, q$ T6 i   Win32_DisplayConfiguration
* P/ m8 a; Z0 R" ]% e   Win32_DisplayControllerConfiguration6 S$ V( M& \. n$ ~  H; O
  Win32_DMAChannel
: O4 B6 |! U; Z% r   Win32_Fan
1 A1 Z/ Z# D/ e7 C  ?   Win32_FloppyController0 q, J+ K% H2 l
  Win32_FloppyDrive: {% ~, A& u- a
  Win32_HeatPipe
$ ], s, g6 f4 \; S% A- s   Win32_IDEController
4 C# k* s8 G# X$ A5 H   Win32_InfraredDevice
" J. q0 U2 E1 h0 L6 G' h   Win32_IRQResource. ?% k8 \) n* b
  Win32_Keyboard
5 j% [, q; N: q: V/ k) A   Win32_MemoryArray, N* J# c; V1 f3 e4 j' I. h: N
  Win32_MemoryDevice6 M5 l  C0 W2 w, S6 |
  Win32_MotherboardDevice' w% z7 Z* f9 k  ?+ K& ~3 G
  Win32_NetworkAdapter
/ r3 c0 t, c# H( o3 o; U& E7 [   Win32_NetworkAdapterConfiguration: y1 \8 I  F& V% u" R+ Q( H
  Win32_OnBoardDevice
8 P: k8 w. x2 Q0 O3 b   Win32_ParallelPort$ y% J& y% Q8 L" Y( V8 n
  Win32_PCMCIAController
! C: Q- V  ^& g1 w+ _6 R9 o, g   Win32_PhysicalMemory" x6 s( A9 E" o# U* D
  Win32_PhysicalMemoryArray
; s4 J$ R$ ^2 s2 K$ d9 h+ X   Win32_PnPEntity- @$ r9 n/ v6 B
  Win32_PointingDevice
1 H% m! d* {2 v* Q, W, g* e( V% j   Win32_PortableBattery
( P5 v5 d6 }4 A( m   Win32_PortConnector
7 M( a+ L2 [  E9 T! N9 Y   Win32_PortResource7 ~0 g; M- w; ^4 i/ y3 f  K
  Win32_POTSModem/ `9 ~" B5 j/ _* L0 j: r
  Win32_PowerManagementEvent" N7 u+ {) k4 _4 `7 H9 d' e# Q, g
  Win32_Printer3 E( V4 T9 ]$ ~, f% h, e; Y
  Win32_PrinterConfiguration9 j* n; i7 ]; l+ y* Y% c% {: U, M/ V
  Win32_PrintJob  {, {/ W7 M5 ]7 g8 k+ a/ A
  Win32_Processor# f1 f! t2 n  n! }, C/ |& s0 c
  Win32_Refrigeration$ A- _. X+ R/ t- }
  Win32_SerialPort
* s& ~- ?6 ^  @3 B& p3 W   Win32_SerialPortConfiguration" {2 {2 E$ F4 r! I2 T
  Win32_SMBIOSMemory
, h* x, o5 u. b9 T. V   Win32_SoundDevice
% }4 l, z/ f; s  Y( |% l( }   Win32_SystemEnclosure
7 ~& Y% p! ?/ o( d) }   Win32_SystemMemoryResource" `6 e9 c/ ~9 F- a: g2 @
  Win32_SystemSlot9 B# j3 v, \& e9 q& R
  Win32_TapeDrive9 G8 ?- G; G. `3 k
  Win32_TemperatureProbe
) F5 v7 q# k5 o5 L7 y   Win32_UninterruptiblePowerSupply
4 g0 ^  R8 ]5 I+ z! f( b7 s   Win32_USBController
% I; ~  s: U9 Z  R8 P# o; W8 [- d5 O$ y   Win32_VideoConfiguration
' ~" I, t8 [( t; M0 i9 e& Z9 m   Win32_VideoController
/ |% u8 z' R1 I2 \4 z  w2 E   Win32_VoltageProbe4 J- p8 g/ Y' n3 E7 F4 i+ ]  y
, f: u3 U/ j+ O+ H
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 00:21 , Processed in 0.020127 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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