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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
& O" J2 n, c/ s- b  --------------------------------------------------------------------------------
2 Y. ?* G( q/ a" h  #define _WIN32_DCOM ! _' x. R0 q& C
  #include <iostream> , ?+ G" m4 t: m* o5 C
  using namespace std ;
  m- F1 ^7 U, R- G0 w. L  #include <windows.h> 0 Y$ L( f' B# I6 y& p
  #include <comdef.h>
- ]+ g7 v- D5 A, ?  #include <wbemcli.h> 3 y: Z7 _6 L1 D
  
1 I6 q; d2 d, s1 w- W. V$ o& k  #pragma comment(lib, "Wbemuuid") $ M! I# |, w- G% C4 E5 [
  
8 Q% f9 E# ^: Z+ y2 u' n: e  int main(int argc,char**argv)
8 s7 `$ @9 W, m: z  {
5 i. m. r1 i! y  HRESULT hres ; 4 q: u9 G# F6 a% Z$ d1 H
    E! k- D2 x+ z; S, {
  // Initialize COM.
! r9 z8 y0 ^6 i0 e8 M  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
( z- M1 I- K1 u' b  if(FAILED(hres))
% e+ G9 v% j( o, _3 r  { . D4 {+ ^) ?; A* }' x: ~  N- w* V
  cout<<"Failed to initialize COM library. Error code = 0x" & v2 ~5 E6 G, ?  T# B$ ~+ q
  <<hex<<hres<<endl ;
* ^9 {9 e$ t( s, V  return 1 ; 5 d8 j4 d" l! R( c; z8 h2 x% F
  // Program has failed.
0 T/ w1 u: V  Z# p' M# w- K  } ! X& }' b1 P3 W7 b* X; I2 ?
  9 m2 S* b1 T& c. c) ^% n
  // Initialize
  e& @$ o2 t: W9 P  hres=CoInitializeSecurity(
8 m# L. j- S1 S, I7 x  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, ' |4 k1 a" y7 ?- T1 `* p! z8 _, h
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); - g, @3 M1 H# V! z# m7 x
  8 Q( u/ S% `, N6 [0 ]8 R; j
  $ {  `1 b- S* \4 B5 P, V  C
  if(FAILED(hres)) # ]+ T3 C5 u% h' ?9 C: R
  { ' z8 E, d) e. W* ]1 ~! i. O
  cout<<"Failed to initialize security. Error code = 0x" % I6 }/ o1 L" Z- i8 t
  <<hex<<hres<<endl ;
8 K. e1 @- s2 g1 H. @; E+ J  CoUninitialize();
7 x2 Z- \' S- e' ]; m  return 1 ;
: d  n& z/ ?- t. {7 Z+ b" ^" S8 m  // Program has failed. ' m" M4 C2 U( B
  }
. ?, f0 g! L# F- K# }  
$ H) l0 v+ t' K" E2 k6 @( d  // Obtain the initial locator to Windows Management on a particular host computer. 1 h; D: `8 @, y$ Z5 V! P- i
  IWbemLocator*pLoc=0 ; 4 G. }% z* l, {9 w$ K
  ) P$ v- r; C9 \1 ?
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
4 w' t. }1 n" p. S  IID_IWbemLocator,(LPVOID*)&pLoc);
0 K% [) F% `& i0 ^3 V  G  . _+ T4 i/ i3 h& o
  if(FAILED(hres))
" y5 t2 _6 c( [) t3 p/ M  {
* X1 ~- V8 L$ r$ P) [4 T  cout<<"Failed to create IWbemLocator object. Err code = 0x"
5 `3 v( K# o, W: k; x, V1 E  <<hex<<hres<<endl ; ) T- f/ V2 y. U# X5 u$ p9 f! c
  CoUninitialize();
( K4 ^8 M6 m' Q* u/ h2 O, V  return 1 ; $ L2 c. y; z' W1 u" P
  // Program has failed.
  Z9 X1 A/ b. [" Q, |  }
& M! b7 S( |- {% B  ^  
% P  i+ r6 A% x9 ^' r" Y  IWbemServices*pSvc=0 ; 6 D+ R2 k. P4 f3 ^, C5 e. q
  
1 _+ u, [: x; E% J4 e. ^  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
) @+ }. {+ K  B5 J" L; j0 ?  // to make IWbemServices calls.
! D1 z+ q% k8 A) G6 s% S  7 x/ {$ H" y, R; \2 o; z+ w5 B
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),   z; O9 `2 T. t; V
  NULL,NULL,0,NULL,0,0,&pSvc);
6 r- F: [2 s5 j/ j2 L# b( O# B& f  ( {" y$ E4 j8 U" ]. R, O; b
  if(FAILED(hres))
% ~. H, r: P# z/ e1 o  { * q, |: @6 `7 W3 h9 @
  cout<<"Could not connect. Error code = 0x"
+ O7 W: v, ?9 r: t% ?  <<hex<<hres<<endl ; % E6 l. c$ c1 m( H7 S! G6 d4 ^
  pLoc->Release(); - S, C4 i0 @( x3 D) z( U; s) [! Q5 o
  CoUninitialize(); * ~. W, k3 P& y
  return 1 ;
8 \" K& b" _$ E6 Y  // Program has failed.
& G# W. }! i" H7 R  } 1 A+ v' L+ e6 |' l0 a" M: v
  ' n4 X+ H3 Z$ t: ~# J
  cout<<"Connected to WMI"<<endl ; . z/ }" Q6 N+ H. P/ E
  
- U: X! q9 m! a: H; k- P  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
0 s4 g. C) c3 Y: B. |) k  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, 7 d. G6 M9 q" t# }8 }& K
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
; M$ T2 p, c) L( [* V- f+ r  w! f  0 y$ g  [# m$ |
  if(FAILED(hres))
7 q* T6 ]: b- N' S& v  {
: I- {0 L" w3 w; k- o. \  cout<<"Could not set proxy blanket. Error code = 0x"
9 l# G* U9 O% @& H. T# p. c! D  <<hex<<hres<<endl ;
. }7 B, k! j& \5 W. J+ k  pSvc->Release(); 2 J' A$ g( T% b6 |$ g. A- P; z
  pLoc->Release(); 4 m8 _0 p6 S8 G, Q
  CoUninitialize();
( u2 I6 r% o$ y6 B# O: I6 C0 Q  return 1 ;
' C: E- X+ C. D; s# T" N! v  // Program has failed.
& r8 W9 u. O/ L3 }$ R  ]  }
0 j  n# p, T- ]% B0 x% M% e  
1 p9 J0 _- x4 h! i7 Q! e1 P2 p  9 |' `8 e2 H; v  s6 a2 ~; _
  // Use the IWbemServices pointer to make requests of WMI.
& ?' E" p; I' W' x& p+ f; T' U  // Make requests here:
. ^6 A" K( B* j  2 i" K! b/ K/ b. G
  // For example, query for print queues that have more than 10 jobs 6 y$ ^0 ?$ t  j1 ?4 x1 S# b
  IEnumWbemClassObject*pEnumerator=NULL ; ; P2 ]- t- l+ S2 t/ j$ U/ y: d
  hres=pSvc->ExecQuery(
! H: E  w+ Y0 L/ H0 C4 o/ e0 k  bstr_t("WQL"), ; D7 N  m. r% N! p  Z6 d3 Z
  bstr_t("SELECT * from Win32_BIOS"), / G* S2 `' d' q, U( q2 w
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
6 Y, W7 {8 O$ M  NULL, 4 a2 i" L) Y0 B' G9 s, j
  &pEnumerator); , {/ e  [+ W" w9 j$ Z! S- m6 f" }
  9 p, |0 [' f( x" z) d9 V' Y: m+ Z6 p
  if(FAILED(hres))
2 y' |& k* {" J" q. g. l$ O  {
% d2 L$ R/ W$ Q  ]; D8 T, q: a0 G  cout<<"Query for print queues failed. Error code = 0x" 9 m( W# a0 I# }" s, R
  <<hex<<hres<<endl ; * n9 f- C7 r+ P
  pSvc->Release();
1 y, q) j! ^5 }* i2 X  pLoc->Release(); 1 A- ~  W& o5 h7 Z& z
  CoUninitialize();
2 `3 e# F2 q7 _0 N1 J+ t  return 1 ; ' x5 U) e" c- T0 g- b3 J% ^2 E
  // Program has failed.
) \3 f5 {3 [$ o1 J  } 2 E6 Q: ]. `: |6 O6 I9 K9 q
  else
7 W, S3 q5 _4 N7 X3 H" @9 H4 p/ f  { / e2 K6 F" B* i4 J7 k% q$ O
  IWbemClassObject*pInstance=NULL ; 6 n0 f7 {1 W! I: X9 t  _. C
  ULONG dwCount ;
1 X! P4 b! z: `: R; Y. E5 |& L  while(pEnumerator->Next( 3 P; U. I: I( X
  WBEM_INFINITE,
. ?( ?6 g5 E0 c/ k  1, ; \) A1 u4 W5 C6 @
  &pInstance,
9 D+ T. |+ V; P, F7 o; _1 R  &dwCount)==S_OK)
/ e  e' u: \+ F; Q/ N, o  {
/ H0 O" N: H9 y8 ]  SAFEARRAY*pvNames=NULL ;
  E3 c6 E% {/ P, [  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) $ V: c0 U% t9 \7 v
  {
6 r2 H# @! h  e4 {  N; o  long vbl,vbu ;
5 \* q( w9 R1 C1 I, Z( C' h  SafeArrayGetLBound(pvNames,1,&vbl);
. X( O: n7 q0 P) ~  SafeArrayGetUBound(pvNames,1,&vbu);
' V3 Y+ m+ f' V9 E7 h+ Y# o  for(long idx=vbl;idx<=vbu;idx++) 3 M! D$ D7 r( A1 i) c( D
  {
9 `( N, e; [+ M; m5 m+ @# F  long aidx=idx ;
' _6 ~( _/ p$ u: |  wchar_t *wsName=0 ;
6 N! o8 ?  E3 u7 r* E$ S  VARIANT vValue ; . D( Q" l3 i% F% O5 O% T/ d" {
  VariantInit(&vValue);
; l4 X8 L% v# l# r4 `0 C5 p    [" C! I3 |4 c& ~2 R' M5 w! |
  SafeArrayGetElement(pvNames,&aidx,&wsName); 5 M# A3 u7 g. _2 D
  
; z" ?  d- k' Y$ ~2 l; }  BSTR bs=SysAllocString(wsName); / @9 c" ~, I/ X* e. D# @% G
  hres=pInstance->Get(bs,0,&vValue,NULL,0);
+ M, R& O. V3 w4 P7 G2 e  SysFreeString(bs);
4 q4 c, L- A; k5 z. C8 F  
% ^: c7 A2 D5 Y' R) w- [1 |  
3 e8 H% D( i% J. ~5 A  if(SUCCEEDED(hres))
$ ~0 R* y) t; A4 J4 {% `  {
* w8 l) n7 ?+ J) Q. r  char szANSIString[MAX_PATH];
1 f4 e8 V/ X- \) o4 \  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1, 7 |& _6 P1 e6 L$ p5 h
  szANSIString,sizeof(szANSIString),NULL,NULL);
+ `4 t, L" ]+ o* y1 @  5 c. w- i, x: B8 V+ u4 R% q# @
  cout<<szANSIString<<" : " ; 2 t* R# Y: D6 j6 q  J( ^
  switch(vValue.vt) 8 s6 {" B7 G9 j( w+ {
  { 0 p/ \; D- G, s0 B
  case VT_BSTR :
( g2 D; |4 A6 m( E6 T  wprintf(L"%s",V_BSTR(&vValue)); ! K2 _1 j3 C2 m& R: R
  break ; , T6 T/ }! Y) e8 T% f! c1 i
  case VT_I2 : : t7 g2 q' y: Q
  wprintf(L"%d",V_I2(&vValue)); 8 z  o, K- Z3 ^7 ^/ b
  break ;
6 P1 i. f6 E" ]0 K  case VT_I4 : , S7 S6 \4 {2 ~( T
  wprintf(L"%d",V_I4(&vValue));
" z1 C. r0 j3 y+ a4 L$ a( t  break ; . f8 W! x) w3 l  ?
  case VT_BOOL :
" r4 j+ ?, \% ], _  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 6 A% F- L; M) t
  break ; / Z/ y- J7 |, c, Z& d
  default:
3 M' v& _, @/ M% [  /*WCHAR tmp[100]; : z/ j2 W9 t3 e4 d# q" ^' T4 |. M8 g
  wcscpy(tmp, V_BSTR(&vValue));
$ e( g7 ?+ F  ]" p7 k2 X  char tmp1[MAX_PATH]; & H. ^5 s, p' ^& G$ P, S
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
1 w5 s! A  V8 u1 c9 N1 N2 s  tmp1,sizeof(tmp1),NULL,NULL);
: p3 G* ]& i# r) v8 X  6 W7 d" C: N! L. L: O& U; o: Z
  cout<<tmp1;*/ 0 J% X* N8 O: I# \. n
  break; # G( x! @! F# I' L
  }
+ e% Q* Q5 @  o! `, |2 W! h5 u  cout<<endl ;
# b: [0 z* I/ _$ a  H$ O  }
8 {7 P* }# Q; D: ~! N  
: h3 m+ M, D: U7 ^% v2 G  SysFreeString(wsName); / O/ p4 \9 [: v: \
  }
/ N! h  r1 G5 y  $ T6 O3 P2 o1 o& Z* N
  }
6 x. b1 w) g; w, A  else
- |% z& a  R9 n1 y- \  { . x9 I) r' X' f% q. n& z! U
  cout<<"Query for print queues failed. Error code = 0x" + r' h2 q9 K; C3 z$ l
  <<hex<<hres<<endl ; : V, Y, X6 X4 H
  pSvc->Release(); 9 T; S9 f' i( B( {6 L( a( \+ w
  pLoc->Release(); . h6 r) b! @& k2 S5 U
  CoUninitialize();
$ K. c5 r$ \  @3 |  return 1 ; / E: |* {9 e- k
  // Program has failed. ) H) X. p/ X4 V4 y
  } 1 B+ T% u, x. d  g7 T7 p
  if(pvNames)SafeArrayDestroy(pvNames);
( d6 G  @, b- N+ R; W  }
: q4 P  W& T8 s0 W8 u  if(pInstance)pInstance->Release();
3 D; j. a* K+ n4 o2 y7 J6 ~  
, U3 O" K7 D4 Y0 Q7 ^6 ^  } ! T% J( [4 g9 Q# ]: W
  // Cleanup
0 s+ ]# J7 k' Z+ \/ C% Y  // ========
* K& l4 k, V# j. g  |  pEnumerator->Release(); ( C1 ], W5 w: a6 x) E
  pSvc->Release();
1 ]& b$ Y9 A0 u1 s) S3 c2 o  pLoc->Release();
$ r5 Z1 M  k1 Z8 ~1 R) g  CoUninitialize();
" L; o8 z& Z9 r2 b+ u  
4 d8 _/ G, e" q6 K. B9 [; V  return 0;
. `" E4 d8 I; A* d  // Program successfully completed. - ?! }& |' j$ Z: F
  } ( ^) q6 H/ t- n/ i, I- D' \
  //-----------------------------------
& O9 y, K3 Z1 f# K% l; z  
: V) q, p, F* f( r" F, Q  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. 1 b- ^, B2 ?0 [. g. M! f
    w2 |1 \2 u# p9 H3 J
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
3 }3 R8 E. B1 p2 }  { ) |' e0 \$ P2 U; ]
  IWbemLocator *pWbemLocator = NULL;
, V/ q$ i7 M: _  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) 8 M9 }$ F+ U! h2 g- d& Q, T: |0 d
  { 1 ?% i# @3 L) }
  IWbemServices *pWbemServices = NULL;
1 k, e* m! Q6 A  `- w  WideString wsNamespace = (L"root\cimv2"); # ?# \/ ~: c% D- H+ [
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
2 n% v6 t# M% d' i' }8 f  { 3 Q4 h$ ~  y: u
  IEnumWbemClassObject *pEnumClassObject = NULL; ) Z6 o' B! I, Q
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass; 3 S$ u* `2 f! ?, D* S0 ~
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
* q# o8 k0 G" v* n# c# k0 ^  {
2 o0 |* M& H2 f  IWbemClassObject *pClassObject = NULL; * d0 G/ D! E8 |5 v; Y8 J" e1 x7 O, c
  ULONG uCount = 1, uReturned; 2 W2 o9 r7 M# \+ k
  if(pEnumClassObject->Reset() == S_OK) % ^# I  E: o; e: q2 i. t
  {
$ x/ `0 H3 ]! M( Z3 Y/ F! c" }6 I1 m  int iEnumIdx = 0; ; V  A  I& M* B7 Q
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) ( |. ?  H. n" H# U- ^9 E" T
  { . A5 {% e4 m! |, f$ f3 f
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
; t! u8 L& D2 B0 N8 e  9 k5 x! K( f* ]7 ?6 F8 Z
  SAFEARRAY *pvNames = NULL;
! C7 Z3 p% ?8 k$ {2 b1 ~  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
/ L9 p: \4 G$ A5 e/ K  {
5 J+ N" K* R. q  long vbl, vbu;
9 y8 Y) H7 R9 c8 G+ d9 x- t  SafeArrayGetLBound(pvNames, 1, &vbl); % g* l- T0 K& u) p% [4 [
  SafeArrayGetUBound(pvNames, 1, &vbu); . }6 h1 s" e8 m) G: K' s  G
  for(long idx=vbl; idx<=vbu; idx++) # E6 J4 ^" t6 n7 s* M$ U! H% o
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 11:46 , Processed in 0.019519 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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