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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: 9 V( P; C" L1 F  O. z: z9 d
  --------------------------------------------------------------------------------  y. {; S8 K$ B* {5 ^
  #define _WIN32_DCOM 9 F( K6 L/ p: x# {; k7 u
  #include <iostream> : D( z) e$ D3 n: ], U
  using namespace std ;
6 M/ y, A9 ]/ t4 j4 Q2 I8 _5 c/ @) y8 b  #include <windows.h>
! t# `* f  Z: @$ o9 z% M- l  #include <comdef.h> 5 d+ L& ]3 M: G& S7 m  A/ i2 ?
  #include <wbemcli.h> 9 c2 v) o' x! e7 M
  ) W# w: Q5 z" H, j7 M; S
  #pragma comment(lib, "Wbemuuid") ; U1 H9 c  q9 }$ J- a/ g5 z
  % d4 u4 Q' z  `) t3 S' E
  int main(int argc,char**argv)
" z2 R7 v% J2 Y! A, @3 Y( b" H  { + v& X. q6 H" ~8 \% T
  HRESULT hres ;
% b& x" w2 `- h5 v  a& _7 T  
; m( z& T: Q! c7 s3 b# `" K) s  // Initialize COM.
$ A: A# }2 U- j  g  hres=CoInitializeEx(0,COINIT_MULTITHREADED); $ v; s% d, p! {4 l- x( z$ ~
  if(FAILED(hres))
8 M) C6 y8 E+ k# v: o; v  {
( e" T- ~+ c9 y" ]( C  cout<<"Failed to initialize COM library. Error code = 0x"
7 b* k2 w. \7 a. _2 g  <<hex<<hres<<endl ;
* ?$ ^) b! D& @  return 1 ;
% x3 `( M5 t5 U- e, ?  // Program has failed. * v0 W- t# p- h6 j! f! }
  } & }- u  B' k/ k- x4 D* ]7 I
  
! {4 b  `% s! y  J  t& q  // Initialize * c5 ~. c& E' i$ h, z. g  N
  hres=CoInitializeSecurity( ! A1 X0 [& r6 |* r% u+ C5 c
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
4 m/ @, @  V. P6 [; A7 _; H  E  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
0 @! O- d2 C; \5 {6 W7 ~3 a' w  
: E$ ~9 p0 u% f! I+ f2 z  : h1 o# @# X+ Y
  if(FAILED(hres))
& ]3 c& w/ R4 i" Z( ~& }, O9 F  { - \2 Z. |8 I: G7 H8 ~8 r9 I
  cout<<"Failed to initialize security. Error code = 0x"   ]6 `, V; s, U* `9 w' w0 B. T6 Q5 x
  <<hex<<hres<<endl ; / t9 S; G. |( \$ M- ?
  CoUninitialize();
- c! M, H1 ]4 i9 u9 @2 O: L  return 1 ; 5 h1 g! I8 w' t5 Q- T& O5 a
  // Program has failed. / b7 \' X! W3 ?7 a' @6 Z
  } ) c" t) _" M4 d0 r; E1 ]' k
  ; Y! C# H% w/ Y% R% E
  // Obtain the initial locator to Windows Management on a particular host computer.
/ @0 A- X, D$ }# R  `5 L. Z* i" D  IWbemLocator*pLoc=0 ;
$ `# s. G' [7 _, ^  ) R: @/ w0 u, }2 g* ?6 x
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, ! G1 Q/ v# b3 K1 }. n  R; U$ j
  IID_IWbemLocator,(LPVOID*)&pLoc);
* _; I: l( Q  w/ l0 f5 y: l  
. w  d  Y* k* @( y  if(FAILED(hres))
% Y" D; h3 N" U3 K  { - X. Z" r, r' ^- ~6 E5 [% t
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
: ?( X" ^* c  ?  e- T; G  <<hex<<hres<<endl ; 4 Y# X6 c! Q; W- ?
  CoUninitialize();
# N3 k, Q, g4 D* P9 `" T3 ]$ `  v  return 1 ; * E; L6 {$ E% s( g9 M
  // Program has failed.
- {' p* t! l9 @- h7 Q; H0 G. h1 V4 v  }
8 j! S) e: ?0 I  
" ^' Q, d( F# F, r! ^4 ^& Q8 a8 U$ Z1 O  IWbemServices*pSvc=0 ; % r, m! l0 [1 \, X' n: U0 H! s
  - b7 K+ I$ @/ B! |
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
! a' v! p! R, ]  // to make IWbemServices calls. ) j/ W; O2 o5 l1 U: L
  ( y5 ]% ]) Z) J# K
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
9 g+ M4 l4 @$ T( A3 P  NULL,NULL,0,NULL,0,0,&pSvc); ( P% ~# |+ W+ w$ n. ?& N
  5 L3 U9 K. t6 g6 d) E- E
  if(FAILED(hres))
, K( |% o. q. j3 b4 G; n+ T1 i" @  {
' F/ _% b& }$ n# Y! u/ Q7 O, q1 v  cout<<"Could not connect. Error code = 0x" : n0 M1 q3 |" f# L  S% a
  <<hex<<hres<<endl ;
/ d2 v9 W7 L0 K0 U" l: h+ M9 P  pLoc->Release(); 2 }9 p7 K: b" x# b
  CoUninitialize(); # s: N4 B2 |/ `* ^% _% T  e
  return 1 ; 3 z  v/ `. a" }( _- X
  // Program has failed.
) A1 g% f& J9 E) [" \4 o1 H  } ; f( @; l% ]) _$ w' I" X3 F
  
* k6 N$ T8 C. u* M  cout<<"Connected to WMI"<<endl ;
* a. b7 y9 s! a2 ~" P* s  . j. D& q- h8 |# w/ m4 u* X+ r
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
4 m9 u3 W4 ]% t! y2 c( b' s  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
5 G' O; z& w; A. k" T0 x  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
4 K* |8 a7 |7 C' z# l2 }5 f% D  
" A# Q, I" T5 ^, D  if(FAILED(hres))
. W  }# p* N; A) R" Y! E  {
8 ]5 ?& `% t' h' Z0 s7 G, t  cout<<"Could not set proxy blanket. Error code = 0x"
) t) j9 P$ X# U& @. i4 A% d- _  <<hex<<hres<<endl ;
9 ?% a. I' [3 u! x; D  pSvc->Release();
% h( c" P" b" H& w2 Z, |  pLoc->Release(); $ g# E4 x8 d3 W" E6 M/ ~
  CoUninitialize(); , k1 Z* A' g  U/ ?& ]) @
  return 1 ; 2 ~. z9 c% @6 m* e; M" t1 e
  // Program has failed.
8 S/ E5 W* Z* J  }
4 ~# _4 }  P6 L, S  $ j% o: z6 k8 O3 U: c
  
. W' q# k8 Z9 M3 U* D. `% u  c  // Use the IWbemServices pointer to make requests of WMI.
! |6 U! X. k7 D! h" P2 s* S8 f% v  // Make requests here: . }" t7 b+ C# K" H- [" [; G
  
$ ^, ?+ }& z! r1 d( {/ s) [! z1 \  // For example, query for print queues that have more than 10 jobs 7 S. H' }( ^$ C* k3 N
  IEnumWbemClassObject*pEnumerator=NULL ;
( m3 _1 e: |, c" u1 B+ m/ y& ]  hres=pSvc->ExecQuery( 1 [5 Z" Z6 f# d' Z# C% w* G8 y
  bstr_t("WQL"),
/ S! }" q/ {2 _* A4 `  bstr_t("SELECT * from Win32_BIOS"),
  @& n, t/ I: _' c8 l  @  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, 4 t0 t" ^7 a+ W9 u- Q2 k& C
  NULL, 5 h% w- M+ [4 Z1 t; F
  &pEnumerator); - t& ~5 j6 m3 J( B
  
& `& H: L6 x6 Y- J5 @. E  if(FAILED(hres))
- \1 @7 R* W$ M. b4 \+ I  {
; P% b" D* \7 m% Q+ I8 y& Y( i  cout<<"Query for print queues failed. Error code = 0x" 1 S+ Z4 ^2 z0 R
  <<hex<<hres<<endl ; & u& B  s3 Z  c' \/ t# N
  pSvc->Release();
9 f4 f/ v4 p. [5 C  pLoc->Release();
6 f! Y6 C0 X5 j% H$ J5 \, Y- |  CoUninitialize(); 9 S% p) H' Q" Z/ ?; O- j+ k% d0 q
  return 1 ; % d8 ~4 ~8 Q( E1 e0 z& W
  // Program has failed. / W4 y1 u' Z1 F
  }
, A: G. V* E) M" E7 W& c$ {! q  else
! [: D+ z6 H, e7 x9 W" `  { " l! P1 O9 n; }$ i" Y
  IWbemClassObject*pInstance=NULL ;
# j0 i/ D+ x2 r9 N  |  ULONG dwCount ;
) G/ g) x8 X, J) F  while(pEnumerator->Next( % t( L! n: t) l
  WBEM_INFINITE,
7 D7 S! i$ G8 K: q3 u7 U  1,
2 n8 ~- o( x6 m/ G7 ~( @9 ]  &pInstance,
6 i. R2 ?2 ]5 d* A  &dwCount)==S_OK)
" ~  w( x# X0 p" s2 ?" I  {
- \* V( m* r/ V; ^$ p  SAFEARRAY*pvNames=NULL ;
8 e) ~# O8 \: q- T: x  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
9 x2 R- v$ }( g: x$ e0 A% F- f  { 0 L) P- N3 r; |% X2 v! y% n
  long vbl,vbu ;   y2 n8 j+ |5 d9 U/ I1 l( n
  SafeArrayGetLBound(pvNames,1,&vbl); : C8 h; l. i1 y0 S, P2 \
  SafeArrayGetUBound(pvNames,1,&vbu);
- }& H, o8 [* A+ G! z1 P  L  for(long idx=vbl;idx<=vbu;idx++)
1 A( A9 G6 S+ P1 u# e+ C( o! d  { ! ]* u, q( W  k( Q$ l2 |* [
  long aidx=idx ; # v7 K& O& m1 l
  wchar_t *wsName=0 ; ( q( {  P6 Q4 S
  VARIANT vValue ; . W' g8 B0 [8 R5 x. M1 g* Z! g! _+ k
  VariantInit(&vValue); 9 d' M% [9 X8 I* h1 }1 O
  
( s$ l, [! O/ s3 u) @4 `  SafeArrayGetElement(pvNames,&aidx,&wsName); 0 G$ ~- J! H4 G% v& T
  % R( {) ^) d- ^. V
  BSTR bs=SysAllocString(wsName); 3 D3 T' {( C4 I/ i, t! O& a# N
  hres=pInstance->Get(bs,0,&vValue,NULL,0); / `! O" `. A/ Z/ P9 |' N( e
  SysFreeString(bs);
" g6 h" U9 Z% n: E9 ?  
& K0 R( ?" \: r6 i; G5 ^! Q  
* d% O7 A& ~+ y( ?  if(SUCCEEDED(hres))
0 f7 b) q4 w6 g1 T5 M. E  {   e+ |/ B! f; j, c5 |8 q
  char szANSIString[MAX_PATH]; 0 L8 c( Q; p0 c+ N2 u
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
+ s) P0 L! V- h4 C' s0 Y# c$ _  szANSIString,sizeof(szANSIString),NULL,NULL);
9 }8 Y2 s  ~, H% ]6 {8 f  H, V; N  , N, k5 B  z8 |6 \
  cout<<szANSIString<<" : " ; * h; w, Q$ Q. C; E, B( l9 n
  switch(vValue.vt)
/ w( U5 s! e9 A1 m3 l, `7 y3 |  { " \' Y+ D# J( X6 K" d' I$ T
  case VT_BSTR :
8 x+ c) q' B  m/ @% L0 T3 ]3 R  wprintf(L"%s",V_BSTR(&vValue)); 8 D' O2 d6 b- ^' w) k  c" S' l, z
  break ;
2 f# U) k- r% w( a  case VT_I2 : , d7 B8 l! O+ A4 ^4 Z- S, U% U0 v& Y
  wprintf(L"%d",V_I2(&vValue)); . y1 r! N& b- j
  break ;
* f# E6 M; p" d/ a  case VT_I4 :
+ V4 ~% R" x. \  wprintf(L"%d",V_I4(&vValue)); * ]2 d- ^9 N$ E- o2 v/ M
  break ; $ V( F: X2 O+ @( a
  case VT_BOOL : + J* V: Y+ F0 D9 ?, g
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); . X" S: K4 d! `. H; X3 {% j
  break ; & S2 l1 ?- u" K% S+ S6 R% K
  default:
4 G5 a1 w* y+ w5 R, f% |. W3 L( O  /*WCHAR tmp[100];
- |6 J( f1 ~. b) n  wcscpy(tmp, V_BSTR(&vValue));
- J7 l' V* V3 z" f" }* a  char tmp1[MAX_PATH]; - f$ ]9 e5 J& T* B6 P1 G
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, 7 ?! w& D, ^0 a9 `& o: e- A0 ~" Z
  tmp1,sizeof(tmp1),NULL,NULL);
5 U* v0 ?/ G2 o& R5 @8 x! d  [: n7 g  
" \+ e% L4 F0 l' u  cout<<tmp1;*/ 4 I; n' E6 m* }: l' i$ H
  break;
) _' O2 r  ?2 T; J: J) [7 H7 x  } . F( s' r) h) k- d# P' `# g
  cout<<endl ;   @4 t( [8 w/ u
  }
( v. A# r3 x+ P2 N0 m5 N) J' a  
9 S* e& A2 s9 c. H  SysFreeString(wsName);
/ `( ]2 [; k# w$ h5 ^% L  } + R! k- A9 i. p4 z- y
  0 n! ~& Q+ [3 \+ H
  } / Q9 t' i1 {: A: i
  else 9 b1 ?* ?1 i- e3 e) \& {
  { 3 I( ~+ y3 a8 @8 m
  cout<<"Query for print queues failed. Error code = 0x" 3 W7 S! E4 q; b& ?: Z$ A$ S
  <<hex<<hres<<endl ; / _6 I5 J' g( r0 G, F1 t
  pSvc->Release();
( {/ Y* @. w, o0 e3 d. k  pLoc->Release(); 6 x) u+ h3 l4 N  C" ^, H; K
  CoUninitialize();
( V6 Z% v5 X& M5 }8 C  return 1 ; # A! _4 `# h( K6 S0 u$ k
  // Program has failed. ' p, I' ?* S0 g* a
  }
; o8 }3 J* ^% w$ P+ G4 Z" `2 O& _  if(pvNames)SafeArrayDestroy(pvNames);
/ x, @6 f3 m6 D+ z5 I  }
4 ]0 P4 J- D0 z4 z: M! ?/ q9 Q  if(pInstance)pInstance->Release(); 1 E7 O  p3 ]: e; B1 ?4 p9 a; G
  ! w2 @- G( l4 R
  } & {" Q" f* [- h5 }- O
  // Cleanup
; a8 l, s" x+ \# m' a; d" B8 }6 ~' @' R  // ======== 6 O% `' o& V3 Z9 @
  pEnumerator->Release();
7 V. o  k& t- p3 I( k5 T8 w2 O  pSvc->Release(); # w& E4 J- P/ w! R
  pLoc->Release();
1 @7 M: N. T" D1 D  CoUninitialize(); % T0 h. k& v! L& ]
  . v( d  c' j% m' X4 }6 }8 n
  return 0;
4 R1 t: F; i/ D  C  `. d1 d& Q1 }3 @* w  // Program successfully completed. + r5 w7 J; Y) Q5 U7 D
  }
5 K+ R: d4 U; y, t( E  //-----------------------------------; T  C/ N7 @0 I' m
  ; X5 f7 T, o/ P: X; ]7 h6 L3 w; h
  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. 1 m( W5 V8 u& a( X9 O& v7 ~
  
, B, d- ?# ?7 g/ l  void GetWmiInfo(TStrings *lpList, WideString wsClass) 2 q# a# t! L$ D
  { & }& Z7 P1 C' h0 [. @
  IWbemLocator *pWbemLocator = NULL;
5 r' F9 A, x$ I& l+ h0 ~  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( \/ v5 s. s( D3 P2 z  {
3 M* [" g0 y$ d  IWbemServices *pWbemServices = NULL; $ R. o) v. j# M4 `4 `
  WideString wsNamespace = (L"root\cimv2");
% k( \* j) O% L+ S. y  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) , c- v, Y) h; K4 V# y1 s. }
  { ( j2 c! W3 j. X& w- }# |
  IEnumWbemClassObject *pEnumClassObject = NULL;
) g1 k9 C0 \( u) t  _  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ n6 i5 ~' n$ K8 ]  N  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) ' L, N- t( w, w' o9 V+ \
  { ) W; ?$ b: Z* b6 t3 g
  IWbemClassObject *pClassObject = NULL;
. o/ y: C5 N6 v$ \" ]  ULONG uCount = 1, uReturned;
7 c8 C% |8 @8 t9 B4 ?7 j  if(pEnumClassObject->Reset() == S_OK) + Q4 b, s* w% w; W' ]. B  @$ A/ B
  {
; U2 S% b5 N) ?, T  int iEnumIdx = 0; / V' [0 W3 R) W- w0 F/ m6 q
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) $ Y+ v$ |: E* Z" w, \; G: C
  {
/ w+ i3 N% p# q5 X: i0 n+ }  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); * F+ N4 _6 H( {4 {/ a
  0 M4 k1 o$ T2 ?# i. a
  SAFEARRAY *pvNames = NULL; 1 Y6 H1 V0 a) j  M0 r! q7 x
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
( t3 h& a1 V2 Z% B& G% {( z  { # E7 F$ |& A6 F+ q
  long vbl, vbu; 5 E$ M1 L7 z8 b
  SafeArrayGetLBound(pvNames, 1, &vbl);
- P$ L$ x, q7 q+ `  U5 q! ]  SafeArrayGetUBound(pvNames, 1, &vbu); % F; _8 M0 @6 N# c/ ~
  for(long idx=vbl; idx<=vbu; idx++) 5 c. ?/ A2 @" b& @- S+ B7 Q
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 10:45 , Processed in 0.019768 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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