如何在vc ++中检索bios序列号 [英] how to retrive bios serial number in vc++

查看:88
本文介绍了如何在vc ++中检索bios序列号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好我在vc ++中收集bios信息。我检索它的版本。我该如何收集有关bios序列号的信息。直到没有我处理这段代码。



// bios info.cpp:定义控制台应用程序的入口点。

//



#includestdafx.h



#define _WIN32_DCOM

#include< iostream>

使用命名空间std;

#include< comdef.h>

#include< wbemidl.h>



#pragma comment(lib,wbemuuid.lib)



int main(int argc, char ** argv)

{

HRESULT hres;



//第1步:---- ----------------------------------------------

//初始化COM。 ------------------------------------------



hres = CoInitializeEx(0,COINIT_MULTITHREADED);

if(FAILED(hres))

{

cout<< 无法初始化COM库。错误代码= 0x

<< hex<< hres<< endl;

返回1; //程序失败了。

}



//第2步:-------------- ------------------------------------

//设置一般的COM安全性等级--------------------------



hres = CoInitializeSecurity(

NULL,

-1,// COM身份验证

NULL,//身份验证服务

NULL,//保留

RPC_C_AUTHN_LEVEL_DEFAULT,//默认验证

RPC_C_IMP_LEVEL_IMPERSONATE,//默认模拟

NULL,//验证信息

EOAC_NONE ,//附加功能

NULL //保留

);





如果(FAILED(hres))

{

cout<< ; 无法初始化安全性。错误代码= 0x

<< hex<< hres<< endl;

CoUninitialize();

返回1; //程序失败了。

}



//第3步:-------------- -------------------------------------

//获得最初的WMI的定位器-------------------------



IWbemLocator * pLoc = NULL;



hres = CoCreateInstance(

CLSID_WbemLocator,

0,

CLSCTX_INPROC_SERVER,

IID_IWbemLocator,(LPVOID *)& pLoc);



if(FAILED(hres))

{

cout<< 无法创建IWbemLocator对象。

<< 错误代码= 0x

<< hex<< hres<< endl;

CoUninitialize();

返回1; //程序失败。

}



//第4步:-------------- ---------------------------------------

//连接通过IWbemLocator :: ConnectServer方法获取WMI



IWbemServices * pSvc = NULL;



//连接使用

//当前用户获取root \ cimv2命名空间并获取指针pSvc

//以进行IWbemServices调用。

hres = pLoc-> ConnectServer(

_bstr_t(LROOT\\CIMV2),// WMI命名空间的对象路径

NULL,//用户名.NULL =当前用户

NULL,//用户密码.NULL =当前

0,// Locale。NULL表示当前

NULL,//安全标志。

0,//权限(例如,Kerberos)

0, //上下文对象

& pSvc //指向IWbemServices代理的指针

);



if(FAILED (hres))

{

cout<< 无法连接。错误代码= 0x

<< hex<< hres<< endl;

pLoc-> Release();

CoUninitialize();

返回1; //程序失败。

}



cout<< 已连接到ROOT \\CIMV2 WMI名称空间<< endl;





//第5步:------------------- -------------------------------

//在代理上设置安全级别--- ----------------------



hres = CoSetProxyBlanket(

pSvc,//表示要设置的代理

RPC_C_AUTHN_WINNT,// RPC_C_AUTHN_xxx

RPC_C_AUTHZ_NONE,// RPC_C_AUTHZ_xxx

NULL,//服务器主体名称

RPC_C_AUTHN_LEVEL_CALL,// RPC_C_AUTHN_LEVEL_xxx

RPC_C_IMP_LEVEL_IMPERSONATE,// RPC_C_IMP_LEVEL_xxx

NULL,//客户身份

EOAC_NONE / /代理功能

);



if(FAILED(hres))

{

cout<< 无法设置

<< hex<< hres<< endl;

pSvc-> Release();

pLoc-> Release();

CoUninitialize();

返回1; //程序失败了。

}



//第6步:-------------- ------------------------------------

//使用IWbemServices指针发出WMI请求----



//例如,获取操作系统的名称

IEnumWbemClassObject * pEnumerator = NULL ;

hres = pSvc-> ExecQuery(

bstr_t(WQL),

bstr_t(SELECT * FROM Win32_BIOS),

WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

NULL,

& pEnumerator);



if(FAILED(hres))

{

cout<< 查询BIOS失败。

<< 错误代码= 0x

<< hex<< hres<< endl;

pSvc-> Release();

pLoc-> Release();

CoUninitialize();

返回1; //程序失败了。

}



//第7步:-------------- -----------------------------------

//从中获取数据在步骤6中查询-------------------



IWbemClassObject * pclsObj;

ULONG uReturn = 0;



while(pEnumerator)

{

HRESULT hr = pEnumerator->下一步(WBEM_INFINITE,1,

& pclsObj,& uReturn);



if(0 == uReturn)

{

休息;

}



VARIANT vtProp;





//获取Name属性的值

hr = pclsObj-> Get(LName,0,& ; vtProp,0,0);

wcout<< BIOS:<< vtProp.bstrVal<< endl;









VariantClear(& vtProp);



pclsObj->释放();

}



//清理

// ========



pSvc->发布();

pLoc-> Release();

pEnumerator-> Release();

if(!pclsObj)pclsObj-> Release();

CoUninitialize();

系统(暂停);

返回0; //程序已成功完成。



}

hi i am collecting bios information in vc++.i retrieve its version. how should i collect information on bios serial number. till no i work on this code.

// bios info.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#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 --------------------------

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 (for example, 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 "
<< 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_BIOS"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);

if (FAILED(hres))
{
cout << "Query for BIOS 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"Name", 0, &vtProp, 0, 0);
wcout << "BIOS : " << vtProp.bstrVal << endl;




VariantClear(&vtProp);

pclsObj->Release();
}

// Cleanup
// ========

pSvc->Release();
pLoc->Release();
pEnumerator->Release();
if(!pclsObj) pclsObj->Release();
CoUninitialize();
system("pause");
return 0; // Program successfully completed.

}

推荐答案

可能没有bios序列号。转到命令提示符并运行此命令



May not have a bios serial number. Go to command prompt and run this command

wmic bios get serialnumber





这将显示序列号(如果有)。



现在从这里对示例代码进行这些更改:



http:// msdn .microsoft.com / zh-CN / library / aa390423(v = vs.85).aspx [ ^ ]





This will display the serial number if there is one.

Now make these changes to example code from here:

http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx[^]

hres = pSvc->ExecQuery(
    bstr_t("WQL"),
    bstr_t("SELECT * FROM Win32_Bios"),
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
    NULL,
    &pEnumerator);










// Get the value of the Serial Number property
hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
wcout << " Bios Serial Number : " << vtProp.bstrVal << endl;





参考: http://msdn.microsoft.com/en-us/library/aa394077(v = vs.85).aspx [ ^ ]


这篇关于如何在vc ++中检索bios序列号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆