问题描述
您好我在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.
}
推荐答案
wmic bios get serialnumber
这将显示序列号(如果有)。
现在从这里对示例代码进行这些更改:
[]
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;
参考: []
这篇关于如何在vc ++中检索bios序列号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!