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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
( x/ F( F+ ?& ]* E/ n  --------------------------------------------------------------------------------0 V% y8 e* g$ t
  #define _WIN32_DCOM % |) `: f: j0 ^0 \# X) a$ Y
  #include <iostream> # E8 m/ `7 @6 [- c" I5 @
  using namespace std ;   n1 v2 p0 S- G4 i* w" m
  #include <windows.h> $ Z  d' y9 V3 x- H
  #include <comdef.h>
- ~. n" C- w" f" I; ]" g  #include <wbemcli.h>
  i* i* n6 Y1 K* x" q. E  # Q3 ^& b. z* V! p
  #pragma comment(lib, "Wbemuuid") 6 G: s( w3 p- O, y& `
  
: Y$ K/ r$ K' [9 {" x) g  int main(int argc,char**argv)
8 K" |2 K+ a. ?  _3 P2 B) m  { 7 {1 A) g* u2 q( {+ H
  HRESULT hres ; 8 N4 p4 c7 ~, L$ d8 S% i
  / D6 q: `: m8 z2 v
  // Initialize COM.   I" X# e: V0 I1 [9 S, D% P
  hres=CoInitializeEx(0,COINIT_MULTITHREADED); ; l4 |& N8 ]9 Y8 U. ?
  if(FAILED(hres)) 5 U* V3 v% J. ]
  {
7 }5 [8 Y5 I: p5 k! c  cout<<"Failed to initialize COM library. Error code = 0x" ! M, c  @) u3 Z  g  F  q8 s2 V
  <<hex<<hres<<endl ;
8 h: N6 p5 m4 L& d  return 1 ; + j- ?8 l% _3 C5 `0 |
  // Program has failed. 2 Y9 c6 `3 P. F, z
  }
. S- x- M, ]3 U% h  
9 D* Y8 v) \' @7 ~# m: m9 r  // Initialize , f4 @+ w7 q( e: z( J) y
  hres=CoInitializeSecurity( $ x3 ?7 K% q# O: K$ L  {
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, # r, {% s8 X  [# G( }. @
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
" ~! T& Q8 D, v; z9 K( d: Y' }  
9 `! E) j( x6 q* ]: W  ) r5 p6 U8 d8 f8 ]8 ?% b
  if(FAILED(hres))
3 W7 n. l, y2 n, a; z  Z/ q  { 5 N1 `( u1 r% i8 ?
  cout<<"Failed to initialize security. Error code = 0x" 6 x6 @( a$ @' n* O& u" P
  <<hex<<hres<<endl ;
; F; z" J$ `; ^& B% e  CoUninitialize(); ; Z% v- w0 ^4 `: y+ {
  return 1 ;
* R6 T( q$ g4 J6 B  // Program has failed.
  v9 I2 L# f+ v8 S7 F0 \  } * H  T! W) T: j( l) B
  
9 |: ]7 Q- ^; t0 R8 N; z% a  // Obtain the initial locator to Windows Management on a particular host computer. 4 `# O$ S* u0 x5 p1 m( u% H
  IWbemLocator*pLoc=0 ; 0 k3 }0 b# d' M/ s  @8 s$ Q
  
1 z8 m! B7 R7 C) x6 l3 S  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
9 q" F; _6 {) S8 h" C  IID_IWbemLocator,(LPVOID*)&pLoc); ) ?) Q+ t+ w( s3 z, y5 ~
  , U9 y9 R' x0 H( d
  if(FAILED(hres))
3 d, v0 C) A0 R( ~* K# z& X0 A- ~$ A  {
$ Y. T% H. G) d- r  cout<<"Failed to create IWbemLocator object. Err code = 0x" 2 Z) T9 k: x9 w
  <<hex<<hres<<endl ;
. E5 `0 H! {* [; ?  CoUninitialize(); . e. _: V4 \6 C& v/ }+ o3 f$ t
  return 1 ; - R( @3 y9 h( y+ m2 Y
  // Program has failed. # F* b/ M8 J( X% d+ ]
  }
0 V" \5 L+ H6 ?8 p$ R  $ D# m# P) v+ m1 i
  IWbemServices*pSvc=0 ;
1 S1 \) A6 ]$ o5 Z, v2 q6 @# y( Q  
7 N/ h1 }; R) u; C7 ?7 a  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc   J7 i+ f( E6 I4 n
  // to make IWbemServices calls.
/ K8 V2 o& {' B4 }  # M: A1 ~( |' t% |
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), 8 `2 P- }6 C" k" g
  NULL,NULL,0,NULL,0,0,&pSvc); $ Z, k, ?) J% N% v" @! b
  : @& w, W; q* e, |# t8 O
  if(FAILED(hres))
6 h% w5 E: u- {! t  { 4 f, M% t& J# A8 d% r& J5 S9 s
  cout<<"Could not connect. Error code = 0x" ; `# f1 }0 ?" l5 G' U
  <<hex<<hres<<endl ;
) R2 z$ ~8 w. @  N( t  pLoc->Release(); 3 F, Y% `# h8 ^. A0 [
  CoUninitialize();
% G+ f$ D5 O" R8 x  return 1 ; 9 |# _0 K0 s5 u( \4 f9 f
  // Program has failed. 6 V1 U* F0 s1 D0 S2 r, ]& u
  }
% I. q  a- ^. e4 ]- Z" W- u  
% V! ~$ F# a" ]  cout<<"Connected to WMI"<<endl ;
+ n; `% ]: M. H( Q/ m! F8 R  * c: S' z1 g' h# A
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
0 H8 q: T% D4 @/ k1 S  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, 4 A0 @6 A- S+ X) B) g& j
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); 5 R. y( g, s9 y2 `3 A$ u& g
  
8 E4 g' W* R% U" T. _/ t! q# ]) B  if(FAILED(hres)) 1 g3 C% x4 S+ r) N. u% s
  { * T) N5 M2 N8 I( |) F
  cout<<"Could not set proxy blanket. Error code = 0x" ' y3 A7 q* K* y( T9 R  J8 i. h9 w# P
  <<hex<<hres<<endl ;
9 Y- p8 U1 `3 X9 A  pSvc->Release(); 4 ]* q% r6 ~2 _& O+ R, [( u
  pLoc->Release(); 4 x' m4 j1 a6 h! R* G0 ^
  CoUninitialize(); / Z" A. b4 L9 y. g
  return 1 ; / W+ I1 E( O. m, _) e7 F
  // Program has failed.
! U: M- F8 D! A# G  }   C% a$ Z' E3 }) M
  
  u; t" l8 ^9 A3 h! R  " ?8 a7 r  Q9 J' m- f3 s
  // Use the IWbemServices pointer to make requests of WMI. & B6 \2 U" z& z2 c) Z
  // Make requests here:
; _( J$ O( V4 v  7 H0 D: Q1 L! q1 V! i$ z
  // For example, query for print queues that have more than 10 jobs + M$ Q1 H; X# F( T, F+ T5 F1 p- L9 ^
  IEnumWbemClassObject*pEnumerator=NULL ; 1 y! ~( ^) t  i6 l* w* ?
  hres=pSvc->ExecQuery(
! P- h3 p( Z! w* u7 k: I7 \, G& M  bstr_t("WQL"), ! p* l+ Y  H1 `0 Q2 a5 x# F
  bstr_t("SELECT * from Win32_BIOS"), * z& j" Y7 k' v$ ?
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, , P8 B; D$ O( Z& q' M
  NULL, ; _% w' ~) M& O8 H
  &pEnumerator); 9 j+ W% E9 q1 [2 c
  
3 n4 N3 V. x! `! o  if(FAILED(hres))
, r2 B! Z& G' Y  { " ^# `1 K6 G* e
  cout<<"Query for print queues failed. Error code = 0x"
5 J0 X) Z) u! W# A. h  <<hex<<hres<<endl ;
4 m: ]+ G3 b7 E) N  pSvc->Release();
1 E  W2 E: S( Z0 z, ]5 A: C, O  pLoc->Release();
- |; }* }4 j+ R9 a; Y/ x7 `3 r  CoUninitialize();   N( P# M$ {5 o, Y
  return 1 ; 0 E$ {' s( i. B5 B1 E  @! c0 W. l% u
  // Program has failed. ! t9 m# o/ B8 ~7 ^2 C6 n8 ]' G
  }
, h! z$ Q# X9 N' V' M6 t. ?# x  else 0 m7 ?8 r9 D  D/ f" x9 F  B; E! d
  {   S% W; j; a* l& ]3 Q, k
  IWbemClassObject*pInstance=NULL ;
% T6 |7 N5 Z5 k5 g* |8 O  k8 o& h  ULONG dwCount ;
7 Q. D) q' Z3 o+ F- k  u) Z  while(pEnumerator->Next( - k/ q8 s. k2 W1 Q
  WBEM_INFINITE,
/ z. D7 V0 \! S% k% Q. h  1,
+ [! J$ I6 ~- S  &pInstance, ( ^  R& R/ ?' q8 c' R4 j
  &dwCount)==S_OK)
: b4 ^; d4 Z7 Z$ C% n  {
6 N0 @& `* M2 q2 R  SAFEARRAY*pvNames=NULL ;
  R7 ~9 F7 E/ P  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
& y$ L! S3 V' P- U  {
0 y( e& q; R* Z! N9 a  long vbl,vbu ;
& U* C# M& J/ }7 W  SafeArrayGetLBound(pvNames,1,&vbl);
  Z  S1 K; m+ g2 B: Z5 r  SafeArrayGetUBound(pvNames,1,&vbu); ' `$ s  b9 s- t+ }5 V  ^8 R
  for(long idx=vbl;idx<=vbu;idx++)
* n9 j; q. N/ K* H  { % p8 K3 v, P% G4 }
  long aidx=idx ;
+ D& v, j3 S5 i  wchar_t *wsName=0 ;
, l1 z, a# Y% }* L4 `4 j  VARIANT vValue ;
0 s6 i( F7 J- E6 d  a" \6 L  VariantInit(&vValue); ( o" w4 e5 q2 x7 W8 D: [
  : T' n/ ]& h1 f' K
  SafeArrayGetElement(pvNames,&aidx,&wsName);
1 e* o: U' j( M, p4 c& n* l  
4 _. a- b* f8 q% o( Y7 R* R. _  U  BSTR bs=SysAllocString(wsName);
: Z" ^, q* `6 N4 D! t2 `  hres=pInstance->Get(bs,0,&vValue,NULL,0);
- H1 @2 Z3 D- Q& i8 f  SysFreeString(bs);
" T" x( \/ u1 l8 I; m9 x  ; c5 O6 d! Y. }; `# O
  % l& K4 J3 D& w$ }
  if(SUCCEEDED(hres))
2 u- L9 J/ m2 e# D2 |  { " w2 E* G5 V0 T$ x
  char szANSIString[MAX_PATH];
- t; L$ s9 k- O6 Z  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
9 u( q5 [) ?  ]! y# {, e  szANSIString,sizeof(szANSIString),NULL,NULL); ' r' A9 N  l- o# F0 H4 H# N" e
  
- r, s0 T% ~  x3 ~  cout<<szANSIString<<" : " ; 1 q$ k' V( W/ ~' r/ @1 j3 q7 T
  switch(vValue.vt) / p7 b3 k! u2 O' r; |
  { ! m' h. A+ I& A" Q
  case VT_BSTR :
0 ?: \+ Q4 j+ m6 ^2 g4 }8 e( R  wprintf(L"%s",V_BSTR(&vValue)); $ x' x5 B8 g- k, r$ {
  break ; ; z9 ?$ ^( ^" u0 d) M- o" |
  case VT_I2 :
% ?, D6 z3 L) \( U* J" h  wprintf(L"%d",V_I2(&vValue)); % }6 K2 Q: A( Q
  break ; " ~* r  g2 t* W+ V# S& K
  case VT_I4 :
/ f0 _' T7 P: @6 X1 q% W* u  wprintf(L"%d",V_I4(&vValue));   k- w3 F! X* H( _# I5 C$ P) z% G
  break ;
+ C" d3 y1 I  d  case VT_BOOL : + Q5 [- y5 e' J% ?1 E( E9 ]
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
" Y2 K, a# @6 U3 [8 P  break ;
6 `) h5 Q% L3 ?. A) `+ X4 ~  default:   D6 Q* L8 G$ j: c
  /*WCHAR tmp[100];
: P7 B. p8 a5 ~# T& r) f6 q; g" T  wcscpy(tmp, V_BSTR(&vValue));
1 M2 ]9 B" x- J0 H. Y5 x' c' q  char tmp1[MAX_PATH];
3 }4 |3 V# v% ^4 S/ b6 X3 Q* k  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
. @; G7 Z" `/ k% h% Y& F- W  tmp1,sizeof(tmp1),NULL,NULL);
1 I6 k' e) x) ^) i  0 N% F& H. w7 l  j* K& \4 C* V  c+ h
  cout<<tmp1;*/ : J3 s, w8 @7 [% Q' Z7 Z
  break;
9 I/ m9 d) o: G  } 8 E; J" t4 g/ x' C+ L/ {
  cout<<endl ; ! Z. T1 }) m) ^9 I& D; n9 z, F
  }
# ]) W# T& I, b# P0 k9 w( T1 ~  
/ m1 t8 p8 `$ q; M8 U* V! R) Z1 T  SysFreeString(wsName); / ~- q+ h; W+ g+ H" j* z! ^/ D3 w
  }
, z% L5 h& O5 ^- e( L  
, Z' z9 e( z* _5 p  }
. L3 _  \: H7 n* k: }% `' G# q  C  else
4 e  @( i# p. H4 {, b" v2 z  {
$ [9 @" H8 {% t: }  cout<<"Query for print queues failed. Error code = 0x" # r5 n1 r+ P0 H5 ]
  <<hex<<hres<<endl ; 2 F4 k2 O$ m0 ]0 x$ r
  pSvc->Release(); + h9 p9 @6 E' i4 ?; b
  pLoc->Release();
& N/ R; h9 w/ ~, h& v  CoUninitialize();
1 d  v0 Z- P- D% Y! m/ H6 A  return 1 ;
  C* `  P7 R9 [+ c  Z( c, T  // Program has failed.
( k5 |9 |4 n" r* a( _  } - O* J* c4 k9 Y
  if(pvNames)SafeArrayDestroy(pvNames); 1 V* R- {2 T; z0 K+ H. \
  }
0 t2 ]) p  A* X' E9 w8 y  e  if(pInstance)pInstance->Release();
2 l$ Z+ E, b6 q- f9 `* J$ \, f  
6 w+ X5 \# @; y! i3 t7 P  }   \9 E6 p/ M0 i, U2 k7 ^* ?! d1 q
  // Cleanup % Y; I( k9 N1 E0 b: C5 T% G
  // ========
# \5 F. N8 S; N  pEnumerator->Release(); 1 M1 v( z5 {% A9 N* \% }+ ^
  pSvc->Release();   O" m6 ?; i) N$ t. u  |
  pLoc->Release();
8 B2 c7 ]% |9 r3 U# t  CoUninitialize();
$ J0 J0 I8 s/ m9 c" ?8 v2 E& u  : W& d6 E- t, x2 r7 Y3 `
  return 0;
( _) t/ x- V$ V" W; H( r1 r  // Program successfully completed.
$ _7 I; L  X! b+ G1 \3 X  } " y; W( U. @0 v+ f1 n, L5 @
  //-----------------------------------
% ]  v3 q) U: r! q1 }  4 Q7 u! |% J. _& n# k  p
  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. * R4 B& k: h) m5 H
  
- _* R) r8 `5 d! W) W  void GetWmiInfo(TStrings *lpList, WideString wsClass)
' h# j& h2 g! ^! a5 t4 i  { + W, S9 l$ A: B+ @
  IWbemLocator *pWbemLocator = NULL; ) e6 Z: f- `( d7 `3 [% r
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) ! [# s, O, A+ j
  { * `, y& A2 h- {0 H+ x% c# c% R
  IWbemServices *pWbemServices = NULL;
9 @* t6 ?$ }+ {  n( o8 U% S) o  WideString wsNamespace = (L"root\cimv2");
* E  R: j0 r+ G* k: L9 v- j3 M$ }' z  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) - @! R# n0 l' K+ o$ |* m
  {
3 Y* }$ b1 j5 c5 F& g  IEnumWbemClassObject *pEnumClassObject = NULL; 8 f3 X" g' J6 w" G; G! [
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
# w7 Y# c% y& w. l' m) v' E3 Y% o  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) ! @' L) J7 z& C( @. W5 U
  {
& X& u; x1 s: b5 T4 Q' Y. f% ]* ?  IWbemClassObject *pClassObject = NULL; 0 W  w- o) x, q# j- ]6 K! F
  ULONG uCount = 1, uReturned;
& E% N# ^% l! M) q/ Q2 Q  if(pEnumClassObject->Reset() == S_OK)
  E% y* d" `+ J  { 4 p# Y' a. K( R8 p
  int iEnumIdx = 0; 8 |4 K1 p3 L) y$ e9 G
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
" ~! ?$ `" w+ a7 [5 e2 Z; G- `; C3 g  {
: E; M# B- S+ Q  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); 5 y! M6 [6 f; q) r
  / u/ K0 b4 ]8 K& G$ t
  SAFEARRAY *pvNames = NULL; 1 ]6 D7 S7 p1 @- F; \6 R, O
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
4 Z; {4 [% ?4 w- Z: ]7 `  { 9 k# |) C8 @( I$ l( e% U
  long vbl, vbu;
! |% D0 Q5 E* R. t- _: s/ O* A  SafeArrayGetLBound(pvNames, 1, &vbl); " E7 r2 T. c: k/ c/ R
  SafeArrayGetUBound(pvNames, 1, &vbu); % K  b- M2 D4 B! C4 O
  for(long idx=vbl; idx<=vbu; idx++)
. o' a$ T4 e* F6 s  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 22:21 , Processed in 0.020355 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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