VC++如何获取机器码?硬盘序列号、CPU编号、BIOS编号等~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++如何获取机器码?硬盘序列号、CPU编号、BIOS编号等~相关的知识,希望对你有一定的参考价值。
我知道那个用GetVolumeInformation得到的不是硬盘的序列号,这个大家可以去百度一下。得到的结果是分区的编号,这个东西是可以用软件刷洗更改的! 那么到底该用什么函数来获取,我找了半天没有找到,举个例子最好!麻烦大家了~~
参考技术A 可以试试使用WMI(在msdn上有详细的信息):硬盘序列号:
用Win32_PhysicalMedia
class.
CPU编号:
用Win32_Processor
class.
Bios编号:
用Win32_BIOS
class.
下面例子取得硬盘的序列号,其他的用法也类似(msdn上的例子,把Win32_OperatingSystem改成了Win32_PhysicalMedia):
#define
_WIN32_DCOM
#include
<iostream>
using
namespace
std;
#include
<comdef.h>
#include
<Wbemidl.h>
#
pragma
comment(lib,
"wbemuuid.lib")
int
main(int
argc,
char
**argv)
HRESULT
hres;
//
Step
1:
--------------------------------------------------
//
Initialize
COM.
------------------------------------------
hres
=
CoInitializeEx(0,
COINIT_MULTITHREADED);
if
(FAILED(hres))
cout
<<
"Failed
to
initialize
COM
library.
Error
code
=
0x"
<<
hex
<<
hres
<<
endl;
return
1;
//
Program
has
failed.
//
Step
2:
--------------------------------------------------
//
Set
general
COM
security
levels
--------------------------
//
Note:
If
you
are
using
Windows
2000,
you
need
to
specify
-
//
the
default
authentication
credentials
for
a
user
by
using
//
a
SOLE_AUTHENTICATION_LIST
structure
in
the
pAuthList
----
//
parameter
of
CoInitializeSecurity
------------------------
hres
=
CoInitializeSecurity(
NULL,
-1,
//
COM
authentication
NULL,
//
Authentication
services
NULL,
//
Reserved
RPC_C_AUTHN_LEVEL_DEFAULT,
//
Default
authentication
RPC_C_IMP_LEVEL_IMPERSONATE,
//
Default
Impersonation
NULL,
//
Authentication
info
EOAC_NONE,
//
Additional
capabilities
NULL
//
Reserved
);
if
(FAILED(hres))
cout
<<
"Failed
to
initialize
security.
Error
code
=
0x"
<<
hex
<<
hres
<<
endl;
CoUninitialize();
return
1;
//
Program
has
failed.
//
Step
3:
---------------------------------------------------
//
Obtain
the
initial
locator
to
WMI
-------------------------
IWbemLocator
*pLoc
=
NULL;
hres
=
CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID
*)
&pLoc);
if
(FAILED(hres))
cout
<<
"Failed
to
create
IWbemLocator
object."
<<
"
Err
code
=
0x"
<<
hex
<<
hres
<<
endl;
CoUninitialize();
return
1;
//
Program
has
failed.
//
Step
4:
-----------------------------------------------------
//
Connect
to
WMI
through
the
IWbemLocator::ConnectServer
method
IWbemServices
*pSvc
=
NULL;
//
Connect
to
the
root\cimv2
namespace
with
//
the
current
user
and
obtain
pointer
pSvc
//
to
make
IWbemServices
calls.
hres
=
pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
//
Object
path
of
WMI
namespace
NULL,
//
User
name.
NULL
=
current
user
NULL,
//
User
password.
NULL
=
current
0,
//
Locale.
NULL
indicates
current
NULL,
//
Security
flags.
0,
//
Authority
(e.g.
Kerberos)
0,
//
Context
object
&pSvc
//
pointer
to
IWbemServices
proxy
);
if
(FAILED(hres))
cout
<<
"Could
not
connect.
Error
code
=
0x"
<<
hex
<<
hres
<<
endl;
pLoc->Release();
CoUninitialize();
return
1;
//
Program
has
failed.
cout
<<
"Connected
to
ROOT\\CIMV2
WMI
namespace"
<<
endl;
//
Step
5:
--------------------------------------------------
//
Set
security
levels
on
the
proxy
-------------------------
hres
=
CoSetProxyBlanket(
pSvc,
//
Indicates
the
proxy
to
set
RPC_C_AUTHN_WINNT,
//
RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE,
//
RPC_C_AUTHZ_xxx
NULL,
//
Server
principal
name
RPC_C_AUTHN_LEVEL_CALL,
//
RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE,
//
RPC_C_IMP_LEVEL_xxx
NULL,
//
client
identity
EOAC_NONE
//
proxy
capabilities
);
if
(FAILED(hres))
cout
<<
"Could
not
set
proxy
blanket.
Error
code
=
0x"
<<
hex
<<
hres
<<
endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return
1;
//
Program
has
failed.
//
Step
6:
--------------------------------------------------
//
Use
the
IWbemServices
pointer
to
make
requests
of
WMI
----
//
For
example,
get
the
name
of
the
operating
system
IEnumWbemClassObject*
pEnumerator
=
NULL;
hres
=
pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT
*
FROM
Win32_PhysicalMedia"),
WBEM_FLAG_FORWARD_ONLY
|
WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if
(FAILED(hres))
cout
<<
"Query
for
physical
media
failed."
<<
"
Error
code
=
0x"
<<
hex
<<
hres
<<
endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return
1;
//
Program
has
failed.
//
Step
7:
-------------------------------------------------
//
Get
the
data
from
the
query
in
step
6
-------------------
IWbemClassObject
*pclsObj;
ULONG
uReturn
=
0;
while
(pEnumerator)
HRESULT
hr
=
pEnumerator->Next(WBEM_INFINITE,
1,
&pclsObj,
&uReturn);
if(0
==
uReturn)
break;
VARIANT
vtProp;
//
Get
the
value
of
the
Name
property
hr
=
pclsObj->Get(L"SerialNumber",
0,
&vtProp,
0,
0);
wcout
<<
"Serial
Number
:
"
<<
vtProp.bstrVal
<<
endl;
VariantClear(&vtProp);
//
Cleanup
//
========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
pclsObj->Release();
CoUninitialize();
return
0;
//
Program
successfully
completed.
以上是关于VC++如何获取机器码?硬盘序列号、CPU编号、BIOS编号等~的主要内容,如果未能解决你的问题,请参考以下文章