找回密码
 注册
查看: 5559|回复: 0

[收藏]关于用WMI获取系统信息——编程实现

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: , ]/ U  @/ X6 }" m  l$ G/ c
  --------------------------------------------------------------------------------, \# O1 K9 Z/ h1 ^) c% r! X
  #define _WIN32_DCOM
0 a5 Z: W4 p$ O, ?) q1 Q% J  #include <iostream>
& \! o  E- k6 Y. e  using namespace std ;
4 E7 T+ s8 _$ k% y+ V2 C# y8 d  #include <windows.h> * A6 }! b+ Z; C  L7 V3 {
  #include <comdef.h>
& O7 P4 _1 {; Y, ^+ |; J5 i4 k7 |  #include <wbemcli.h> 0 @9 `7 C1 u  D( j% G
  
# o* i' h, _! _5 n1 @2 A  #pragma comment(lib, "Wbemuuid")
# s7 h% j0 d: K# D* r& o4 _& z9 t& X  & \% |. U9 b& R. l! w' g
  int main(int argc,char**argv) 0 O0 m  \* B, ^1 H0 U  X
  {
8 }  `0 Z  p) T5 n; W  HRESULT hres ;
/ U) v3 g: z7 l) g  , I# G7 n3 s3 Q, x  \( D2 l
  // Initialize COM. ; _7 m8 l4 u$ ~/ F7 `+ k
  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
0 c& N* t$ X" {, y/ y  if(FAILED(hres)) 6 t, W; ?% R% l; A7 V. o7 e) w7 m
  { # l4 v% g! a* @3 v1 u0 }+ A
  cout<<"Failed to initialize COM library. Error code = 0x"
1 a3 s, A* M( ]* m% g# c  <<hex<<hres<<endl ; - L$ I- V! U: p4 Z
  return 1 ;
; y4 U& M  ]+ |" N: p( N7 \  // Program has failed. 1 b) x! H8 k/ [* s& {2 x
  } . J7 p% B2 {( e! Q' R9 Z5 R4 D- G
  - |7 t7 N6 ?* E7 _" u. U
  // Initialize
4 w0 g$ _; f5 h8 q: A3 B  hres=CoInitializeSecurity(
+ N* @2 c+ e. I3 `# g  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
" T& n9 {9 ^' b+ d7 S5 t$ p  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); : I; C% F+ a8 A; t
  
1 |6 b, w% M& v) q6 p& p2 t' a  
. L+ Q/ p" U6 L. ?  if(FAILED(hres))
0 D. u% `% c0 k- S' K2 O  { * u* O* h* c# u' _9 F; m4 P. W
  cout<<"Failed to initialize security. Error code = 0x"   f$ \8 J7 q. s6 e( e7 g) s$ N0 _
  <<hex<<hres<<endl ;
) ?% H9 {" }% s4 l  CoUninitialize();
. v% z; s0 v8 t9 o) F: o8 m! a  return 1 ; 5 Q/ T& `$ e5 ~' o
  // Program has failed. 3 Z) x0 o% S1 [4 l
  } + [( O2 V- T9 @; C
  ; h9 R, U6 z* k5 G& L# ?) u
  // Obtain the initial locator to Windows Management on a particular host computer.
9 ^6 [1 x& P9 v9 [0 q* ?5 m  IWbemLocator*pLoc=0 ;
, P6 U, j; I: d9 c  
. _' y+ n7 q4 {  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, ! `2 _: X/ B3 x2 ]1 l7 M6 R, Q; \
  IID_IWbemLocator,(LPVOID*)&pLoc);
; w2 k3 E# a0 J+ D9 @7 U6 Q  5 m) z) [: {/ D
  if(FAILED(hres))
& F2 ~: y- J, _' y9 e  {   h) u' F, S* [% F& ~) I0 L) [
  cout<<"Failed to create IWbemLocator object. Err code = 0x" 9 N4 n; q/ T1 \% z
  <<hex<<hres<<endl ; 6 f# Y7 L. B, x  ^- N) ^
  CoUninitialize(); + o: m5 A) z+ E3 J' b. h8 g; `  _- `0 N; z
  return 1 ;
1 [& o" Y) B7 ?' b% n  // Program has failed. * T! ~5 y6 ]( |
  } % r" X" X% u$ i- S
  ' Z2 Y) x  Q4 E, Q4 X
  IWbemServices*pSvc=0 ; 9 U; D+ [9 t( U" K8 e4 d
  $ ?# i( F: g, d# v3 n. Q
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc ) [) X2 W  c6 L5 O. |& t! G0 G: i
  // to make IWbemServices calls.
, w9 e3 d9 L% Y1 A' g' ^! ~  
8 d) }" h+ |, t2 I! W/ g  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), 7 s9 T; c$ o2 t4 w; e
  NULL,NULL,0,NULL,0,0,&pSvc); 9 F$ n: U- R! h" h
  9 B5 d; Z1 u& }; D
  if(FAILED(hres)) * @5 e1 w% ^) \* J" v
  {
* o& |6 _" M' S1 E' P' `( J. o  cout<<"Could not connect. Error code = 0x"
4 T$ V. c% U/ o$ t' H: b# B$ K  <<hex<<hres<<endl ;
6 {! y' M5 R& Q/ \8 L# G! P5 g  pLoc->Release(); . m$ c7 ^# {: ^6 R5 C' _
  CoUninitialize(); ' G% W5 u9 v$ q# Z
  return 1 ; . F+ {( V+ ]6 T' s
  // Program has failed.
- Q. Y! P5 n' @9 F# _. |# M  } ; |1 v; C1 o& s% r7 ~! Z* {- g
  
; L; Z$ m+ X( j( l& Y+ {/ W7 \  cout<<"Connected to WMI"<<endl ;
# P7 R8 P3 u% K  
- T7 g8 |( q" `' v% \  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
& D9 G  X; B. b1 P3 O* E0 |  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
! v5 V  ?, \% d9 L  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
( V. z2 O( n5 H% Y  9 M) ?  K: t+ q
  if(FAILED(hres)) ' `0 H. ~: G- z, r! @* c9 i
  {
+ J5 i% T, d( P& {- l  P2 j  cout<<"Could not set proxy blanket. Error code = 0x" - o- L4 L. M$ K# r
  <<hex<<hres<<endl ;
4 L/ a8 U* S& y  pSvc->Release(); 6 b1 D+ y% Z- N: R! ?+ m( t
  pLoc->Release(); " s9 L4 Q* E5 c! o
  CoUninitialize(); & ^! H* F5 ?8 M
  return 1 ; / ~  m1 t% }, T2 Y! v* h. n; J
  // Program has failed. % y& L% h5 p. n  _6 d
  } # g* N: I& Z! ~7 j/ N
  
/ I, }1 I: g0 {: y; \) Y6 t( ~* Q  1 x7 M5 J6 F2 i9 i* y  H0 Q
  // Use the IWbemServices pointer to make requests of WMI. ! ]0 N: @7 ~8 T
  // Make requests here: 3 g& Q2 J( S; D; u1 \
  # k3 _( D5 U: h) |' _
  // For example, query for print queues that have more than 10 jobs ) G& n; K+ ?" c" f
  IEnumWbemClassObject*pEnumerator=NULL ; 9 }0 |1 f  [1 V) \' F6 u8 G8 @$ i$ J
  hres=pSvc->ExecQuery(
/ O$ H6 {; u1 p: y  bstr_t("WQL"),
" D0 C, n. U+ F# z+ X: Y. X  bstr_t("SELECT * from Win32_BIOS"), % t0 `, s# A6 a8 W
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
/ G' A+ N2 E9 {" X$ q1 T$ k) x  k" g  NULL,
& w+ W* Y( C. A6 y6 c( R  &pEnumerator);
! t9 }9 m9 n0 c2 l  ! S1 Y/ \7 K' v" j1 @) Q
  if(FAILED(hres)) + k, z" D3 h. q% V- G# ^
  {
( i4 O2 g+ A' k2 d- s2 P, B  cout<<"Query for print queues failed. Error code = 0x"
' o) G; k2 `/ k$ L! D% a3 _& j  <<hex<<hres<<endl ; ' F) H" M: W0 W: w3 Q
  pSvc->Release(); , Y' R. Q0 x2 Z# I
  pLoc->Release(); ! A/ @! `1 _+ I$ d  C1 h
  CoUninitialize(); / B0 }" k, i9 {, a7 u2 h. O
  return 1 ;   ?' W6 P4 Z; ]0 x. A$ Q) C4 S
  // Program has failed.
# d, b( m% f' G. x& R4 l  } 8 U4 p* V& d3 R1 h" u: o
  else 1 @9 p. X: b- P' K" V5 N4 n
  { # [, {; r$ x8 ~( K6 r
  IWbemClassObject*pInstance=NULL ;   F! r; I  G" `" q% v& N; L% g% ~
  ULONG dwCount ;
, m1 X) o; w! g  while(pEnumerator->Next( " v0 Q  X7 I" r) [" |) L7 E6 |; I8 F
  WBEM_INFINITE, # L% ~( k. N5 `/ e- z
  1,
' u5 ~, `8 k% e4 U  \9 j9 i  &pInstance, # e2 v& I! `! ?( \! K
  &dwCount)==S_OK)
0 r. q+ J. @/ G  {
, ~6 X) K$ D" }) x  SAFEARRAY*pvNames=NULL ; 9 F/ G& q9 n* b' z
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) 3 i$ O0 I! K! Y8 x9 X  W
  {
: y& q2 J; ^4 b! {% [  long vbl,vbu ; 3 w8 h7 l! a& k, w4 b3 s
  SafeArrayGetLBound(pvNames,1,&vbl); 2 R& E9 }" K# K, n& c6 \5 j
  SafeArrayGetUBound(pvNames,1,&vbu); # x0 h: G4 W; N( R0 A4 k9 Y1 C
  for(long idx=vbl;idx<=vbu;idx++)
( j7 k: p/ z+ Y: e: K" }* s  {
/ F! C# {8 d9 Y& [8 H5 Q  ]. ^8 m  long aidx=idx ;
( Z# i3 C: i# B* K8 |# i  wchar_t *wsName=0 ; , ]1 }; Q, K0 Y3 f: u
  VARIANT vValue ; ( M& z6 u' Z' K  s: ~
  VariantInit(&vValue);
. C' w7 {8 o. ~, x, C  / h: t/ C* M! o( U
  SafeArrayGetElement(pvNames,&aidx,&wsName);
6 G; r' A% o4 I+ s% \/ _/ D  
; @! Y8 l3 s7 l, @& n, K  BSTR bs=SysAllocString(wsName); * M& X  A/ W, m0 q
  hres=pInstance->Get(bs,0,&vValue,NULL,0); ! r1 Q. A" I( D1 S0 I( A* @! q
  SysFreeString(bs);
/ ^/ w" O# c" B( Y* M+ t8 k$ Z  
! f9 }2 ?. v; y  7 ?+ j2 M) z, u
  if(SUCCEEDED(hres))
1 L/ L+ [  _$ x$ }  {
. i- `! j4 v+ u: J1 l4 r' s/ U  char szANSIString[MAX_PATH]; 7 a7 p; e$ h9 ^( t
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,   C. ^) f( b7 O) o
  szANSIString,sizeof(szANSIString),NULL,NULL); ! Q% C) B2 N) _* S: D2 m9 S
  
- z2 l* T' ~  p: w: N. E: z1 g$ V  cout<<szANSIString<<" : " ; % G# w# }& `; j3 U
  switch(vValue.vt) ! H5 Y+ P8 y2 h
  { - j$ x0 e% H5 {" e1 t: H# s/ A
  case VT_BSTR :
. E6 ]! w/ j5 l0 v  wprintf(L"%s",V_BSTR(&vValue)); * ?% T$ j( T3 |) l$ ]' x
  break ;
5 S+ n* i* `7 V6 U  y8 ]( C- }; @7 H( l  case VT_I2 :
0 y3 X9 b) R" E$ e& x0 a  wprintf(L"%d",V_I2(&vValue));
& D* M) y0 W# U( Z0 b  break ;
) e# y7 ]" C8 e6 m& F8 H/ N  case VT_I4 :
: O* Z0 p% V$ u+ ^+ h6 J  wprintf(L"%d",V_I4(&vValue));
9 j1 e# ]) O% |! f  break ;
: w5 ^! J! t. _& b3 O  case VT_BOOL : & k, g/ W( P/ h0 Z4 s- ~8 T
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
: p( y$ t) s7 m7 e7 [# q" G  break ; * u& j3 ]2 c* c! ^! @- |4 c4 w' i! l+ \
  default: ; R0 U# B0 N  a, J* P4 n  r
  /*WCHAR tmp[100]; ; x: h" @# @8 x* {' J2 q
  wcscpy(tmp, V_BSTR(&vValue)); : A( x7 v3 K7 C& D9 l$ _
  char tmp1[MAX_PATH]; 4 ~& h9 E$ a) V
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, ) i2 g+ M/ P1 ^1 P( x3 h- d: w2 r
  tmp1,sizeof(tmp1),NULL,NULL); & w; j( n  w' T7 u* Q( f* u
  
8 W1 k* B+ d. _- A; ~  cout<<tmp1;*/
& m% f( X# g. [  break;
$ ], U$ e7 `4 F) ^! Q  O% @( |1 x  } 7 Q; H- w) F' U( ^: S( F* a/ v
  cout<<endl ; - X6 Q2 j6 T/ s8 J$ M( }, O8 z
  }
& P* ?5 d* O. X% [9 r/ p  $ o8 S. p9 F) m3 T
  SysFreeString(wsName); & o& @. X" X+ i
  } - K. T& H& ^) K5 E" j3 M! ~* Z5 y
  8 Y& L7 m8 C, {% @) O& ^! C
  }   ~6 m! W9 v+ ?7 U1 B1 l! \% b; _
  else
/ d7 I/ k- F) l8 y% ~/ o$ `+ M0 A- i1 e  { 7 p1 ^: p& ]+ s9 k2 z0 R  l
  cout<<"Query for print queues failed. Error code = 0x" ) p% G! P" b7 A( f) ^
  <<hex<<hres<<endl ; ! o2 T4 D$ t6 X2 _2 j0 M! W, U
  pSvc->Release(); ) b  E! J. X2 l* e
  pLoc->Release();
5 r$ a- K/ @% P3 [0 ^  CoUninitialize();
  k6 L1 N- e& o& C  return 1 ; 0 N$ }# n) b" Z) T1 _
  // Program has failed.
! W5 U& ]0 ~- U7 R5 o4 q  } 4 w( D# t; i/ z2 g) p
  if(pvNames)SafeArrayDestroy(pvNames);
$ N" b/ y/ d% C' \9 m$ B2 a  } 9 g" N; o# {- p2 ^1 [/ p7 p
  if(pInstance)pInstance->Release();
- P  J/ ?# p& D2 c8 M. r, c9 l& M  
0 x" _/ h5 y) o3 O5 U/ t  } # k& n0 H" P  c5 N, ]- p
  // Cleanup * o% ?& j: F; a; W8 h( u3 Y( \
  // ========
* N# a! \8 c# h/ v$ L  pEnumerator->Release(); " A" Q% V2 [) y
  pSvc->Release();
$ ^( i3 C8 I5 G8 B% N* a( R5 h2 T  pLoc->Release(); ' F/ y5 ]: {0 v& w/ U2 ^6 F2 g
  CoUninitialize();
8 R. W) e5 X8 g  
0 |( c0 {4 e3 L7 o& _  return 0;
4 w" @- s9 ^2 F9 M) O  // Program successfully completed. * K9 L. F: [" t8 ~3 A
  } . G1 n* l9 D0 D4 g& e$ F6 R4 T2 _
  //-----------------------------------
' ~: I; M- l% J  
$ p4 C. P, ~+ N' L% J  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
3 K. @0 Z7 E5 n7 s$ x1 H" k  5 V+ V3 y/ U! [! }, f6 A
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
) k- y3 |0 u4 j& L1 y- o/ Q  {
! f; l' \. Z1 S' c# o* d( `" H  IWbemLocator *pWbemLocator = NULL;
7 O  t5 l/ ~$ \5 a# [8 B# ~. p" v  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)   z1 z1 W$ B# Q2 N7 n3 m
  {
/ {7 @9 ]3 ^) e. w) F5 I- e9 \  IWbemServices *pWbemServices = NULL; 7 P' S' A, q! Y+ j
  WideString wsNamespace = (L"root\cimv2");
" x4 T$ T3 v: k* N! j  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 Y' b% U/ C0 x" ^7 w& r- a  {
0 I/ ]- t1 w4 H7 [* L  _1 [  IEnumWbemClassObject *pEnumClassObject = NULL;
3 b$ a# R( k+ i3 T  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass; ! K5 H5 A4 Z$ t. s' {9 g9 p& S2 t
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 I3 Q' i, f% q) C% i& d  {
+ u8 z7 }9 h7 g# Q% k0 I' P9 }  IWbemClassObject *pClassObject = NULL; ; P7 `2 l, q2 P2 ]7 X
  ULONG uCount = 1, uReturned;
2 O" h- A5 O5 G  if(pEnumClassObject->Reset() == S_OK)
6 r1 A" O' z* |, p7 t7 j  {
1 N# i2 U# `6 ]. b. Q) c1 j3 y. p4 L  int iEnumIdx = 0;
% f8 D4 I/ u6 w- {  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* s* Y6 l5 _+ |$ z2 E1 g  {
1 d/ z: \7 Z9 ~; w. c  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); - J8 m- `+ Z* h7 ^" X
  
  z4 k* D2 C" B; H- O! p8 [  SAFEARRAY *pvNames = NULL;
/ Z" M9 M, M4 H0 d  o4 W2 I9 h+ o  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
6 t+ i3 k& D; ~- n. s1 M  { ' k( |$ r# q- r6 c2 \
  long vbl, vbu; 2 i# S. \) }3 M4 R% M! t  K2 `" M
  SafeArrayGetLBound(pvNames, 1, &vbl);
! |5 [4 D. d' h' ~2 f  SafeArrayGetUBound(pvNames, 1, &vbu); / ?" ^$ k: R% ]8 y
  for(long idx=vbl; idx<=vbu; idx++)
# U% D5 E/ n) e- i! ]  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 23:10 , Processed in 0.017297 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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