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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
0 U" @, k+ S' c0 ^  --------------------------------------------------------------------------------
6 U6 {% v+ M' W+ m  #define _WIN32_DCOM
; o# k/ x9 _8 q/ ^# U  #include <iostream> % ?7 [* Z$ @* p  |7 Z0 m/ E! ?
  using namespace std ;
  C3 e( j3 [; k% V3 Q3 d- E  #include <windows.h>   y2 Z: v% H  ^/ d# J9 N
  #include <comdef.h>
: }/ r. G# i4 O1 @4 O7 o& }  #include <wbemcli.h> - K/ _- q% {5 h& @
  
  q6 b) \$ v5 v6 q. S  #pragma comment(lib, "Wbemuuid") 3 C) Z! m7 ^/ a4 o2 _; M! ]! h
  ( w* J% W! E! q7 E- ]9 E& m
  int main(int argc,char**argv) / L! ?! k# `) N; ~
  {
) I. T" I9 K; o3 x7 ~1 x' E  HRESULT hres ; 5 E$ l2 A& }  T  D4 U( ]- {  r
  + @; Q6 k0 D' O
  // Initialize COM.
$ Z- F! i6 o4 L4 O3 J1 t  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
, ^' E$ x) b/ r7 j  if(FAILED(hres))
0 N4 p' x8 l% [% x" y) c- I  {
. v8 J8 D. V% z  cout<<"Failed to initialize COM library. Error code = 0x"
/ w3 _; [) f) {3 ^) E3 K. p5 P  <<hex<<hres<<endl ;
( i) k1 q$ A, t) T. s/ @' G  return 1 ; 2 _1 D8 v/ O2 L
  // Program has failed.
) A' p6 w; A4 U% j' j5 Y6 S  }
+ \# P: g6 D' w/ o0 {  4 m2 X# e# Q8 g) J6 q7 `
  // Initialize
6 B3 U; c; X; x' |! K  hres=CoInitializeSecurity( * A6 C7 E9 r8 L% F+ d1 \. W
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, 6 A2 L6 K  t2 u5 K  y: R+ D
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
( M, T  d3 {$ r  2 i' p  t6 F2 [* \7 `9 F
  
. O1 a; A  `/ D6 L8 o# l  if(FAILED(hres)) 5 f# Y" `9 G1 ^3 E, x  z
  { # o, R+ m# I1 B8 D
  cout<<"Failed to initialize security. Error code = 0x"
! R  {9 V& D/ Y  c7 s5 v0 W- h0 @  <<hex<<hres<<endl ; 8 u3 g7 W' ]& n) I  v8 L$ n
  CoUninitialize(); 2 A+ G# W! d" S  x2 j* m( o% m
  return 1 ; 9 Z& p, p) J0 Q4 p
  // Program has failed. / m: h* d3 }3 P4 G) \1 t8 a2 [& k& `
  } 6 o) b! }- N* |- {
  
5 y9 [& f7 `8 b' d- q  // Obtain the initial locator to Windows Management on a particular host computer.
2 s' j& j- H5 x5 [: n9 M  IWbemLocator*pLoc=0 ; 6 r1 h/ E, j+ V3 a( M- G3 W
  
- g  L* F4 \6 X% K  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, 4 N" A  L. ~8 ]$ K2 i
  IID_IWbemLocator,(LPVOID*)&pLoc);
% Z) }1 R* G6 H( }1 g" |  6 |1 ~; {2 `4 j' w3 w
  if(FAILED(hres))
+ @" x) O& m( h6 R  {
7 U$ P) C( x' B) T  a  cout<<"Failed to create IWbemLocator object. Err code = 0x"
1 h4 s: o, ?, z  <<hex<<hres<<endl ;
( N+ l% D/ v2 S" K2 L  CoUninitialize();
( m8 Z% E  B! s  return 1 ; & b4 [+ _' M5 e  B
  // Program has failed. ( g4 Y, @2 Q% P- r% {+ ^5 c$ q
  } & F% K. Z2 d% U' H! _
  
2 G+ }  e7 ~% m3 o1 |. @  a  IWbemServices*pSvc=0 ;
8 Q, J" f- E& r* C4 y5 }  
2 J0 I7 |5 q7 O3 K, w  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
, c( N; e7 P! T. |3 Y) h  // to make IWbemServices calls.
' F( x2 H3 @7 Z$ L2 U; v5 h. G' `: p  2 E: q0 R* l5 O" Y+ m
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), ' C$ n8 V8 Y2 d- g. {+ s9 X* _
  NULL,NULL,0,NULL,0,0,&pSvc);
. ~+ e, h+ j7 ^$ ^  
- t( _7 B# E* f; c! W  L) a  if(FAILED(hres))
4 m/ @& J+ l& [4 ?) _  { $ k$ h1 Y7 S, s
  cout<<"Could not connect. Error code = 0x"
2 u/ y7 e' A( f# b5 ^+ S( T  <<hex<<hres<<endl ; 9 ^) g# F, R0 R% u8 F$ J
  pLoc->Release(); / Y& C6 C9 E5 Q8 J! M) m: j/ ^
  CoUninitialize();
0 f; _: S6 U+ y& L! B# y# `  return 1 ; : J! W  ?- J: N3 B; D
  // Program has failed. ) R+ o" M6 ~: m
  }
; T, B8 Y3 b, {4 K) M* a; d  6 u1 Z0 t6 c& X8 M2 ]+ V
  cout<<"Connected to WMI"<<endl ; 1 }7 n3 e: B: d1 f8 N) K- Y; R
  
+ a: x3 v0 v% a; J$ H  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. . w) R+ P7 e5 I; x+ K
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
# ~. W/ Q, H: _6 U( a  \% v  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); , D% D- B8 s# Y9 G" J
  0 }& D8 s9 y8 c! r0 `8 ^
  if(FAILED(hres))
- D: w/ l4 ]2 E  { * t& X7 E& k  M
  cout<<"Could not set proxy blanket. Error code = 0x"
- k) r, Q7 e0 x% y  <<hex<<hres<<endl ;
0 O$ V1 c; U- p  {+ K  pSvc->Release(); 1 f3 q0 e: r# a
  pLoc->Release();
8 A: ^2 c( R+ i  CoUninitialize(); 6 _( A3 y% W  d6 f5 }
  return 1 ; & i. t$ g) W( G% R9 y& o7 p& `% F
  // Program has failed. ! C  ~: H* J# M: T* N$ n* h6 W
  }
# c5 e, C( n% j. A: Q. ?5 l* U  , ~  H$ W! ?( g0 ], ^  ^
  3 V  J, w% X  _2 \% Y/ ~
  // Use the IWbemServices pointer to make requests of WMI.
8 D5 J; q8 `7 T; }4 ^  // Make requests here:
6 i2 f0 Q1 ~9 d% `0 h3 `  ; ~0 M+ I! C$ s
  // For example, query for print queues that have more than 10 jobs , ]' t, c! u2 V# `+ g
  IEnumWbemClassObject*pEnumerator=NULL ; $ O, e8 e& n& J3 F
  hres=pSvc->ExecQuery(
8 I+ s( e9 m+ b% I  bstr_t("WQL"), 9 {6 p/ N3 a% C5 L- V! x: ~0 _! }! z
  bstr_t("SELECT * from Win32_BIOS"),
: F$ V1 R0 ]1 ~+ V1 n. m3 v  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,   W0 d& k* t8 a2 T
  NULL, - I; e+ l! O5 f7 v+ d
  &pEnumerator); 9 N$ G- o. f) ~5 G, q: s6 e
  ) ^/ d+ c7 `3 f/ q1 t1 A
  if(FAILED(hres)) ! _# o7 I4 |% y  R' y; @$ d
  { 3 N# @" H/ X# O1 T* K; f. w9 N4 b/ Y
  cout<<"Query for print queues failed. Error code = 0x"
' j. B7 O8 J; M7 W* g: V  <<hex<<hres<<endl ; ! E5 |5 v$ R2 c4 M
  pSvc->Release(); - \% J3 e8 ]) |$ X2 y4 b. x3 S
  pLoc->Release(); & x$ V# P& Q) j. [6 s
  CoUninitialize(); % _$ C7 H# r$ G
  return 1 ; " c  H' d) {* b7 T3 w. `
  // Program has failed. 7 o0 [; Z& S* V: H
  }
! o' z7 f2 h* l. A+ g! n& y# N1 T  else 4 W" u  ?' \5 s) x) F
  { 4 i4 k8 c1 H, b: S: r' @
  IWbemClassObject*pInstance=NULL ; - s! u+ y3 K" c9 C
  ULONG dwCount ;   o& `7 c% F' B3 k1 p0 u; N7 s
  while(pEnumerator->Next( 6 {( K& v. B9 s0 m, [2 B3 k
  WBEM_INFINITE,
8 v6 b' n9 f+ g9 f: c  O3 j- t+ S  1,
4 [2 S: ?& Y+ {! t8 d! X  &pInstance,
( g3 K) G" ]- m( W  Y  &dwCount)==S_OK)
' K3 u& @* @9 [" Z  {
3 w- L& o' o- d9 A! b  SAFEARRAY*pvNames=NULL ;
! @4 o" ]. S5 l+ X3 W  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) 0 L7 l$ w3 Z: l( E2 x3 u6 P& U
  {
" B# n9 |) R" x4 b; D& m- E. b3 f, G  long vbl,vbu ;
. s5 H7 ^$ j& P* I2 L  Z# X  SafeArrayGetLBound(pvNames,1,&vbl);
" K; |1 {4 `. {* o1 G" |; m  SafeArrayGetUBound(pvNames,1,&vbu); ( G! A$ n# z% u4 K3 H9 J
  for(long idx=vbl;idx<=vbu;idx++)
# k9 a4 `! I- ]1 {1 j  { 0 P# s0 M: \0 f( P
  long aidx=idx ;
: }, f. b$ w4 W1 U: X  wchar_t *wsName=0 ;
6 s  ?  m8 c+ ^& t  VARIANT vValue ; " c. `$ S: |  G8 }
  VariantInit(&vValue);
8 D. l# ~1 j- }8 o% t  + O+ A% }! D  }; j
  SafeArrayGetElement(pvNames,&aidx,&wsName);
1 J+ {$ ~2 w# u' n- Q2 o0 A  
6 }/ \& m+ h  u3 I  BSTR bs=SysAllocString(wsName); 6 C( E. |0 q7 Q( k3 M
  hres=pInstance->Get(bs,0,&vValue,NULL,0); $ r  }' b1 w% B3 P0 U" g
  SysFreeString(bs);
0 Q: Z/ w( P8 A% Y& e  
5 r$ E1 {0 T' {  ) H1 T5 o8 w+ `: O) ~- w
  if(SUCCEEDED(hres))
4 m" W- [) P$ |  { ( r4 k" N7 B# R$ A; q6 c4 ?5 O
  char szANSIString[MAX_PATH];
0 Z5 d# y7 N4 M* }/ J  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
& {2 ~% N8 n% f) H* Z) V6 A# y( l  szANSIString,sizeof(szANSIString),NULL,NULL); / k- T+ o+ Q3 i# h) Z
  
$ N4 k! b! G$ J& H% ^& V  cout<<szANSIString<<" : " ;
' e5 B, u) w1 S% ~5 h  switch(vValue.vt)
8 f2 F* U2 ?9 P+ k  {
" `4 v1 D; N3 Y8 d  case VT_BSTR : # e: D$ I1 n# ]/ Q. J
  wprintf(L"%s",V_BSTR(&vValue)); & |5 ~2 y0 Z: i* I- S& O
  break ; . v, X5 A9 h8 Q8 _  g% ]; k" M' L2 b
  case VT_I2 :
8 v2 S* G7 L" u- w6 R! B* p: v, f9 l  wprintf(L"%d",V_I2(&vValue)); . {8 p3 z' H, }" ^: x1 ?
  break ;
4 ^9 L4 d) S5 A: r6 M! K9 s: D  case VT_I4 :
' j' F$ S0 L! n# d, G# C- m/ Z/ u2 H  wprintf(L"%d",V_I4(&vValue));
2 O; H0 Z: e$ p; [" V$ \  break ; % [% l/ J8 a+ u- x0 z& |
  case VT_BOOL :
/ F! }5 y' y. o2 e/ e7 f  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 9 Y' B1 Y4 R( d2 L; G% S% d4 Z
  break ;
; J" O4 [% w6 n6 ]  default: & D0 R# |8 y2 x- w+ {- |" |  C
  /*WCHAR tmp[100];
9 x  |: Y. O( y- i  wcscpy(tmp, V_BSTR(&vValue));
& v  Y% u& Q; U$ f% p6 x, k  char tmp1[MAX_PATH];
- d6 k1 b5 k6 q  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, # k; f, t/ d+ p$ n# n( h
  tmp1,sizeof(tmp1),NULL,NULL);
# r, y- O) b$ {: m  O" r* Q' J  9 }. y' a! m( i  J( V  D, ]! J& r
  cout<<tmp1;*/
5 P' a6 D0 s9 U: s. U7 G3 R5 f! B# b( z  break;
3 z2 h( W& Y$ w7 [- i2 X! t+ g# I$ g  } $ |: \% \- f- \* L3 |
  cout<<endl ; ; s- ^- G& Q3 O$ F  ~" D( W( D
  } ( y8 d. G0 L) h, D/ p4 N; Z/ l1 W
  ! K: c4 ~- J$ {* B7 y3 P
  SysFreeString(wsName); 6 \) X4 v% o) y0 D
  } * d" _3 o' f3 v/ u% I
  
3 p$ g3 P5 C, h" S* P0 g1 q% }1 }! A  }
' w5 m$ M7 z* j7 S2 u0 Y/ W  u  else : o1 S) \7 R" u; f  Z2 R4 Q$ p$ _
  {   t# i( C- f( f! u. o, o3 Z/ }% r' p7 l, g
  cout<<"Query for print queues failed. Error code = 0x"
, B2 N% i5 d% c9 {& P# l5 }  <<hex<<hres<<endl ; 1 r1 i$ v2 d' i5 S6 }( Z% [
  pSvc->Release(); # k: y4 m$ z- o/ t# F
  pLoc->Release(); - w0 k* \' ~0 q
  CoUninitialize();
3 A! n! p: `( Q: `- s# m( e  return 1 ;
* [8 |4 [, O& Q" i  // Program has failed.
& S- f( }, \' N- T, K  }
. W' D* x5 S3 r  if(pvNames)SafeArrayDestroy(pvNames);
  T4 \% W9 z5 g  } ( h, e; o, B- A, H3 L: }
  if(pInstance)pInstance->Release();
% ]: W2 X, E1 c8 H  # y6 U! q1 ~& r0 J! X
  }
8 ^4 {% [+ f. h1 t; C  // Cleanup
4 l3 c0 W* X. Y4 P5 B% G: H( j  // ======== ) k$ }; }7 v0 R, i* o
  pEnumerator->Release(); ! d: H8 [$ c$ e5 _! w
  pSvc->Release(); % ^7 _2 g+ @4 r  j1 o
  pLoc->Release();
8 i3 p) m  H0 g3 y  a  CoUninitialize();
7 `2 |) N: g; P+ |  1 J6 Q7 ~$ T# s+ K  `
  return 0; $ f. ~  |6 e, [) a' O4 f
  // Program successfully completed. : J; |5 ~8 W% b' ]
  }
0 Q0 t* [! t) A. S2 Q4 m$ S: r  //-----------------------------------
: p8 X6 X3 Y3 H% Z  
1 E( p# k" z  q* S  P7 j  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. 3 h/ M, }, a. C$ m* c
  
- w  F! i2 i- d$ B, O1 a  void GetWmiInfo(TStrings *lpList, WideString wsClass)
2 p/ Q; I* d. ~9 G3 z  {   U+ L" L' O1 p6 u+ m- x
  IWbemLocator *pWbemLocator = NULL; 5 \3 E2 D8 _9 e# m7 K
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( ?. k5 e% k7 d( ^8 e  {
3 h0 r1 n4 e% F. b1 W+ {9 r  IWbemServices *pWbemServices = NULL; - n" |* X# f' j& e
  WideString wsNamespace = (L"root\cimv2");   M9 I5 s* B$ [/ d& M" x
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) ) N2 A2 @2 K  O3 g
  {
2 ^$ B7 q6 f; x) K  IEnumWbemClassObject *pEnumClassObject = NULL;
& _1 C9 y6 K8 z. o" Q9 W  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;   ?9 E2 S, Z- E4 t6 w& }5 Z
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) . G5 [, @; p( f1 b( F4 \$ u
  {
' G, g& T3 t6 |* T3 ^  IWbemClassObject *pClassObject = NULL; / P: e7 g  `1 G  w$ c, p# ]( @
  ULONG uCount = 1, uReturned;
1 ?; x" m" C& h5 |  if(pEnumClassObject->Reset() == S_OK) ) b* [2 O2 A: {& K8 X
  { 3 b+ r4 y$ f' n, A) R( F: w% K) o- }
  int iEnumIdx = 0;
" _! Y3 O7 t. [% r# n% S  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) ) E  n2 }8 f5 q1 M5 r
  { $ n- b2 q" j, Y* w
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
+ z; Y5 U3 T/ s- T# e+ _% l# I$ h  
9 L% N* v& w' \% D- L/ s* `8 ?7 y5 y  SAFEARRAY *pvNames = NULL; ! Q1 ^) K9 R. B2 i; l$ x
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) 7 o; L: S: ^. Q0 g1 R+ i/ U  q
  {
; G1 L7 X5 c: T* j" ~8 P  long vbl, vbu;
; R0 j$ }% S4 f. a, H& c  SafeArrayGetLBound(pvNames, 1, &vbl);
# k4 U! X8 o& e; N  SafeArrayGetUBound(pvNames, 1, &vbu); % E  Y& W) E( h! u* \) P3 D
  for(long idx=vbl; idx<=vbu; idx++) 1 x) c3 Y3 o+ G/ D- k
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:11 , Processed in 0.015058 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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