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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
* `& k+ X5 D' s4 k  Y2 d" n8 a  --------------------------------------------------------------------------------/ X( {! L: d( u: _- p/ A
  #define _WIN32_DCOM
" F: n( f  l0 g! X! y1 s: O% ?  #include <iostream>
/ s3 S8 A0 v% T* ~  using namespace std ;
/ z2 n& o2 d* A6 a) |+ L  M3 l  #include <windows.h>
7 d' H% q' H5 Y' {  #include <comdef.h>
; T$ R2 J2 m) O2 c  #include <wbemcli.h>
. h) ]/ O+ A% j/ @& c3 ]5 I6 Y  
1 i" [# X, x, m9 s; X. A0 j  #pragma comment(lib, "Wbemuuid") 1 u4 h& r, ?& U1 i
  ' Z4 e6 {# E: k4 a% p  f
  int main(int argc,char**argv)
6 J7 Q, M1 ]5 o0 E  \9 }5 E- |0 r0 e  {
# G( z" k3 @, u3 a  W  HRESULT hres ;
" l; H+ N5 w/ `3 [5 F  ; F8 l9 Q, b1 E! J. l5 B
  // Initialize COM. 0 [( o9 U# P9 B0 \
  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
; W4 \0 H' {7 [( p( ^) c  if(FAILED(hres)) ) l) G/ E- G) Y1 _9 ~5 i
  { ! [: |) \. o- ]" r
  cout<<"Failed to initialize COM library. Error code = 0x" ( ]& K! |+ N4 F( L! D+ d$ g2 Z$ q
  <<hex<<hres<<endl ;
/ ^  V! M6 T3 z7 b# m  return 1 ; $ n$ v# o3 k! s. G/ N
  // Program has failed.
. Z$ l9 n* D0 S/ J  x  } + y9 W0 L0 i: ^/ v( O1 O: b  Y
  
4 ~& E/ A# W5 N+ w# P4 Z0 J' [- X  // Initialize
: S$ ^9 u2 V+ D, U3 E" q# X  hres=CoInitializeSecurity(
" k) d+ E/ Z1 f9 \' l) m  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, : e; b+ u, @& ~- c5 ], K( V
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); # l5 M' x/ A4 {* s0 [
  
' Q  Y% J+ O4 g  
+ [! J5 z6 @$ K  a& e+ I8 `  if(FAILED(hres)) ; _1 F; A3 L2 {/ u
  { * t' i' M& ^) k5 E2 Y3 T4 c' [" f3 A
  cout<<"Failed to initialize security. Error code = 0x" ) p, e0 J$ s! J/ d2 k& b, Q) D' K
  <<hex<<hres<<endl ;
3 R# v1 x' u& i  CoUninitialize();
  B3 b0 `; W# e  return 1 ; % G( M) o2 y- [
  // Program has failed.
8 U1 f  G- R4 t/ G0 u% n  }
# d6 c! u; `4 }1 p  6 i6 R. u& C) s9 o! c' p
  // Obtain the initial locator to Windows Management on a particular host computer. 0 _& K1 x5 \, j* N
  IWbemLocator*pLoc=0 ;
% M2 b% ?4 N2 i  v  
2 C$ `$ y! Y; V0 |  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, ' n2 @9 \& ~- \" S, [. Y+ c
  IID_IWbemLocator,(LPVOID*)&pLoc); 3 Q5 ^6 P: E* z) e
  3 V: u# c! c9 d# ^' o
  if(FAILED(hres))
6 d3 g: f7 T) s; B( q/ [  {
: v- I. g6 |) b9 t6 L& X  cout<<"Failed to create IWbemLocator object. Err code = 0x" ) e4 t5 K' f+ Y* h1 u5 P9 p' K! `/ w
  <<hex<<hres<<endl ;
) m  O, G2 Q6 q: x  b  CoUninitialize();
9 K$ ]" g8 s/ P6 W  return 1 ; + P6 x# g# I2 @9 k# L& B
  // Program has failed. % A/ m- h# B0 Z5 O2 j. k$ S7 n
  } + q) Y) s! C2 x, |% [- ?- |
  ) U  y' I8 v; `# H9 Y& |9 C: U
  IWbemServices*pSvc=0 ;
2 f% g: e. }. {  
& g  C& S3 [/ w0 F4 Q( r  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
) s9 _: M$ i$ p  // to make IWbemServices calls. $ o& M: q6 p( T9 Y4 O4 |/ S3 d
  . V; p' e  g! ^! I9 e% U
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
+ d  D6 O4 V3 g7 e; C6 ]/ s5 }9 v  NULL,NULL,0,NULL,0,0,&pSvc);
2 v; V& R5 t& t2 ]1 [3 x- c6 U/ q6 G1 o  / f' p& h, K2 @) N4 V( R, p
  if(FAILED(hres))
8 G5 D; A# |- f+ ~. n) ]' ?: U% q  { 8 E5 p0 L/ {( v" @6 t' h
  cout<<"Could not connect. Error code = 0x" $ o& r0 B7 D" o, d' A; U8 I- x
  <<hex<<hres<<endl ;
& i- J! ?) R  B  pLoc->Release(); ; f; G2 Y8 g1 L/ L
  CoUninitialize();
5 Z7 c5 [: M, U# \/ p' j$ e" }  return 1 ; ' X. K" w* I; J3 i& R
  // Program has failed.
$ q; G) Z. x" [( u: s* H  } . _+ ^' N+ X6 [) L% _
    n+ A! J. Q! b1 j! F" z8 @+ C
  cout<<"Connected to WMI"<<endl ; ! i4 s8 h* V! Y  k( e
  : E4 b6 [8 p$ K% c( S+ }
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. ; v" I! o4 u; S9 ?) R' L
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
( S- L9 O# b$ K8 n5 l+ z5 b  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); - d, n5 e+ j5 l& i. U
  1 l/ ?" Y- F) d
  if(FAILED(hres))
& |) m  ^! I! F9 t& a  {
/ ?; J5 |+ s; E2 n7 ~1 c, j  cout<<"Could not set proxy blanket. Error code = 0x" / M$ n0 S4 {' S6 s: Z$ K% k0 N. s, y! V
  <<hex<<hres<<endl ;
& F/ F' Q; a" p( S9 T' G' a  pSvc->Release(); 3 |4 m: |5 G* G
  pLoc->Release();
, u( E# u% f& X9 C  CoUninitialize();
2 {. K; y. s$ H" k  return 1 ; 8 s: C! \& t6 l5 N( w
  // Program has failed.
2 [. S' o" l2 H* b" z  } . L8 V" @4 D# E# P) T8 P
  5 R; W' q! y4 V4 r, [) l3 m. @
  , W3 R* |0 T/ g% i9 D( g
  // Use the IWbemServices pointer to make requests of WMI.
! D) y: `+ B  a2 f. U' t$ M  // Make requests here:
; s+ C7 r$ r" b+ u  ( G- F3 w$ H% q/ v0 j% G
  // For example, query for print queues that have more than 10 jobs 2 I2 @0 W, Z2 O$ j1 H( f& O
  IEnumWbemClassObject*pEnumerator=NULL ; 1 H2 ?% N% n/ y* V
  hres=pSvc->ExecQuery(
4 O0 \8 H  M* }1 Q& J  bstr_t("WQL"),
, Q0 e" J& V; ?1 x  bstr_t("SELECT * from Win32_BIOS"), ! |3 K. u+ v# @9 H( V$ o
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
' q4 V/ E* F5 ^! j6 a  NULL, ' @5 \2 {$ Q& G8 x* J
  &pEnumerator);
6 ^$ G* {8 S6 L, G& `. d  
3 c9 G9 y5 d. v/ s  if(FAILED(hres))
3 a. v7 y; s9 h* {' h5 @1 G  { / h- t' A$ b) X; D9 l
  cout<<"Query for print queues failed. Error code = 0x"
" o/ B; W% b9 A/ W  <<hex<<hres<<endl ;
6 a/ P) Z% t" O$ E. V+ i  pSvc->Release();
/ e4 p0 g+ ]' u+ H3 ?  pLoc->Release(); ; P5 }, K& J# x( i2 Q' y
  CoUninitialize(); 1 e# b/ p2 r' @- V7 r) f
  return 1 ;
1 S* G6 L: O" n: `8 x# V  // Program has failed. 4 `. c) X7 f2 Y  J( P% {  J
  }
+ T. E1 Z4 o1 `  else $ R6 [* ^) q8 K1 E; k& W
  {
0 V- C4 S, v) n  IWbemClassObject*pInstance=NULL ; 9 G9 O5 `$ H: c3 W7 a- c% n. o
  ULONG dwCount ; $ g. z1 `( h) J. u
  while(pEnumerator->Next(
' S/ T7 s' x4 p2 ?# v7 f& }% `0 J- s  WBEM_INFINITE,
$ c3 Z; X9 h& X( x) ]0 R" \& J  1,
: z! g$ f* r; F& Q' X  &pInstance,
3 r9 i) g5 H4 S6 I8 y1 E$ @% S9 P  &dwCount)==S_OK)
7 }  `6 @) R% |% V1 [& |" e) I  { 5 X' o5 k$ d9 l0 c6 l1 h; L
  SAFEARRAY*pvNames=NULL ;
; L7 s! i% I: Z. X8 t4 v! X2 x  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) 3 E% I+ J* a+ l' l6 T8 }7 \
  {
+ o* W4 w6 [* E0 O: `  long vbl,vbu ; 8 _( q: M5 B& s! t% J% `/ ~
  SafeArrayGetLBound(pvNames,1,&vbl);
% r. ?5 ?' F) s  SafeArrayGetUBound(pvNames,1,&vbu);
. |5 t5 t/ B$ z; \  for(long idx=vbl;idx<=vbu;idx++)
5 ?% K2 f: p: b8 x$ ?6 _8 ?7 R! g  {
! q% }! x  M6 Z* \/ W% s* a4 o( w+ c  long aidx=idx ;
" A3 O3 X* B6 d  wchar_t *wsName=0 ;
- N! q8 y- q0 h  VARIANT vValue ;
5 [' ^& C/ F: P& Q, @3 l  VariantInit(&vValue);
  a  `. I$ U1 C; ~  7 [& Q% Y% j! T( z
  SafeArrayGetElement(pvNames,&aidx,&wsName);
. f2 K4 Y+ V/ U) u  D  7 s5 q! p) c; L
  BSTR bs=SysAllocString(wsName); 6 S% Y! f2 |4 T* ]+ ~* y7 D$ L8 M
  hres=pInstance->Get(bs,0,&vValue,NULL,0); $ V8 X( [% V; P- t
  SysFreeString(bs); / ?1 G( b& {. j1 X
  
! E' Y7 D9 Q& w: X2 }  6 w$ `% o9 v( S* Y
  if(SUCCEEDED(hres))
: n  W) x( u7 e2 u  z4 o; O9 f  { ; f' {0 p& \9 a& d; W
  char szANSIString[MAX_PATH];
2 R/ {" y1 I. Q7 A  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1, + K+ X$ h+ J% z7 R
  szANSIString,sizeof(szANSIString),NULL,NULL);
; @" t+ x9 P1 a- O% S/ |  
# d9 z& |8 W+ L6 _( f  cout<<szANSIString<<" : " ;
( {4 }& S8 I' l  switch(vValue.vt)
9 c7 C- R9 @& V" S% X2 A  { 9 N* ^  j5 `% G
  case VT_BSTR :   h& l4 [7 k# [7 w: [& q' a
  wprintf(L"%s",V_BSTR(&vValue));
+ `9 y  m! H1 F' P  break ;
0 @/ ~( R- `- _% s  case VT_I2 :
5 C. e- j+ t* o4 o* I# t  wprintf(L"%d",V_I2(&vValue)); 4 F0 W& L( G) y' S
  break ;
& R  W: N" g* U  case VT_I4 : ; r# e8 i1 y% S! n' g
  wprintf(L"%d",V_I4(&vValue)); : B, Y; b' r, d& x7 J" ^" n
  break ;
; b/ b' ~% ^% O* k0 I* j  case VT_BOOL : ' ?  p8 M* S9 O% U
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
4 m: ~9 x6 C! _% r  break ; - ~/ p* Q9 [- m4 y9 M' w& ]4 h' s$ J
  default: 6 e& K/ J; }- `
  /*WCHAR tmp[100]; ( H* r- h/ w& C( h5 K9 q
  wcscpy(tmp, V_BSTR(&vValue)); ' c4 w5 ]* [  A3 [0 x: B6 A
  char tmp1[MAX_PATH]; 8 e* l  V0 w  u
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, 1 k' q2 A) x% Z! B8 c
  tmp1,sizeof(tmp1),NULL,NULL); 2 b  D# D8 Q# p* w$ E8 r5 o4 x; g
  7 p, g* m5 N! U8 M
  cout<<tmp1;*/ 0 s! m" L  T; o; e' ~# y! s' d
  break;
# _- x. |/ g2 F8 B  } - p0 [, D6 p/ J
  cout<<endl ;
9 K1 M9 T4 y6 b" s: p! c7 A$ Y9 |' e  } ; h8 C" L: @# F$ o$ g7 [& z
  ' B" @! d3 f. `
  SysFreeString(wsName); 5 U8 o; n. k' R$ V# U
  } ( k1 n5 T4 |# Q; I  }
  
. u0 a2 m, ~7 j! l; D  }
2 L* s. s2 R1 s9 y  U7 N  else / e: v$ P" o1 a& w8 }
  {
7 m; i( ?0 U0 W8 ^  cout<<"Query for print queues failed. Error code = 0x"
5 i/ J. \6 k0 y& ?4 j$ k  <<hex<<hres<<endl ;
1 ~9 Q) D+ v; A6 u9 j# t: k( Q  pSvc->Release();   g5 o0 R" [: ?! n  Q3 w! h
  pLoc->Release(); ! ^; t$ E$ L; ?4 @+ V( l  e5 ~& O' ?
  CoUninitialize();
1 o+ k5 |# @8 _: x  return 1 ;
/ A# O* M) U) q  // Program has failed.
% `* f$ P! s9 P  \  } ; r5 Q9 Y8 r; |4 e% g
  if(pvNames)SafeArrayDestroy(pvNames); % ?5 D3 h6 b# L  S" k2 f
  } 9 |) }& j. p" Z- c
  if(pInstance)pInstance->Release(); % }. B. h% h1 [  ~  G
  - T$ ~; w& @& f+ A
  } 4 d8 E( \& T& J; l; P* p# M
  // Cleanup 6 W4 H$ r/ {, V5 p' I6 J
  // ========
, f* H6 \7 v0 i, P8 ?  pEnumerator->Release(); ) H3 ^$ X% e2 N* K2 V) w
  pSvc->Release(); : _* j7 o6 a0 b+ N
  pLoc->Release();
8 j3 L( }; @3 P) J9 A" I: O  l& J  CoUninitialize(); ' `5 o+ y! W+ O& s
  * O9 _5 i1 X9 x# F
  return 0;
/ x; J6 R) N# g0 f/ P3 ^  // Program successfully completed.   G) b9 M4 R) _! `" e$ \
  } 9 v% w" F6 |, r& Q+ l( u2 D1 T) ]4 ?
  //-----------------------------------, g% ?+ Z% O) C8 ^  c
  1 M& {0 T' t8 w+ j8 l* [6 a
  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
6 A; \  T" o. L4 x+ G  
- o: a0 a  Z8 z1 l4 r) f! i  void GetWmiInfo(TStrings *lpList, WideString wsClass)
4 T7 N/ c7 h( ^( s4 b  {
: [$ l$ d  Q& J2 j% c/ X  IWbemLocator *pWbemLocator = NULL; # n; ~7 }( i2 m2 h3 v
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) 3 k) ?3 X5 s$ V( k
  { 6 w& Y. N: [& A, }
  IWbemServices *pWbemServices = NULL;
% I% A. c$ N$ S0 k: E( \  ^1 S  WideString wsNamespace = (L"root\cimv2");
/ s6 z: l8 J' r" h' o5 C7 V  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) ( ?, o; d  [+ [! {0 C. ~
  {
3 [+ o0 w1 k/ I6 n) Z7 w4 H  IEnumWbemClassObject *pEnumClassObject = NULL; - T  `! e( C* F- V5 W- ^2 S/ Q
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 R0 i% i9 R/ ~% _! M8 O7 K; i. h  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) 6 |: [& {/ m3 D' c- {; f
  { # f) r0 k# x# c0 g5 f5 ^8 V# [+ Q3 H
  IWbemClassObject *pClassObject = NULL;
2 D8 ]/ m: D+ ~4 K7 m+ M  ~: @. T8 l  ULONG uCount = 1, uReturned;
) @  l5 B5 q2 a- G  if(pEnumClassObject->Reset() == S_OK) 3 v7 X' G& y. J: K. j
  { + p: p) I  @" F% o2 N% \% _0 L
  int iEnumIdx = 0;
, L* O& b2 O( s  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, L) G" _4 y9 ]6 o* x  { 8 T# \% Z1 d$ t
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); ( d1 V( F; W4 e0 S
  ( I( R5 C/ @: p% g9 t
  SAFEARRAY *pvNames = NULL; ( J1 i: ^; @1 J; s: {  }& O7 b
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) / v7 f; W! ?/ J1 C( j
  { 1 s) z: z$ @; X6 G
  long vbl, vbu; 6 _1 F0 R& W8 x
  SafeArrayGetLBound(pvNames, 1, &vbl);
% b* K7 ]- T/ x9 _) {/ s7 P  SafeArrayGetUBound(pvNames, 1, &vbu); 0 \& e: x! V/ ]6 G# ]* \
  for(long idx=vbl; idx<=vbu; idx++) ) e% D  q' @, i0 A5 V
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:34 , Processed in 0.035018 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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