http://1.johnhome.sinaapp.com/?p=310
以下函数可分别 获取主机硬件信息:
CPU, cpuid
硬盘,hardDisk
主板,motherBoared
网卡信息,netInterfaceCard.
通过WMI接口获取硬件信息,但这些信息有些未必可靠
QString logInDialog
:
:getWMIHWInfo(
int type){
/*
//0.当前原生网卡地址:
SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))
// 1.硬盘序列号
SELECT PNPDeviceID FROM Win32_DiskDrive WHERE(SerialNumber IS NOT NULL) AND (MediaType LIKE 'Fixed hard disk%')
//2.获取主板序列号
SELECT SerialNumber FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)
// 3.处理器ID
SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)
// 4.BIOS序列号
SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)
// 5.主板型号
SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)*/
QString hwInfo =tr( "");
QStringList sqlCmd;
sqlCmd.clear();
sqlCmd <<tr( "SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))");
//注意qt调用 wmi时,对查询语句要求很严格,所以 like之类的句子务必精确才能有结果出来
sqlCmd <<tr( "SELECT PNPDeviceID FROM Win32_DiskDrive WHERE( PNPDeviceID IS NOT NULL) AND (MediaType LIKE 'Fixed%')");
sqlCmd <<tr( "SELECT SerialNumber FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)");
sqlCmd <<tr( "SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)");
sqlCmd <<tr( "SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)");
sqlCmd <<tr( "SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)");
QStringList columnName;
columnName.clear();
columnName <<tr( "MACAddress");
columnName <<tr( "PNPDeviceID");
columnName <<tr( "SerialNumber");
columnName <<tr( "ProcessorId");
columnName <<tr( "SerialNumber");
columnName <<tr( "Product");
QAxObject *objIWbemLocator = new QAxObject( "WbemScripting.SWbemLocator");
QAxObject *objWMIService =objIWbemLocator - >querySubObject( "ConnectServer(QString&,QString&)",QString( "."),QString( "root\\cimv2"));
QString query =tr( "");
if(type <sqlCmd.size())
query =sqlCmd.at(type);
QAxObject *objInterList = objWMIService - >querySubObject( "ExecQuery(QString&))", query);
QAxObject *enum1 = objInterList - >querySubObject( "_NewEnum");
//需要 include windows.h
IEnumVARIANT * enumInterface = 0;
enum1 - >queryInterface(IID_IEnumVARIANT, ( void * *) &enumInterface);
enumInterface - >Reset();
for ( int i = 0; i < objInterList - >dynamicCall( "Count").toInt(); i ++) {
VARIANT *theItem = (VARIANT *)malloc( sizeof(VARIANT));
if (enumInterface - >Next( 1,theItem,NULL) != S_FALSE){
QAxObject *item = new QAxObject((IUnknown *)theItem - >punkVal);
if(item){
if(type <columnName.size()){
QByteArray datagram(columnName.at(type).toAscii()); //Or
const char * tempConstChar = datagram.data();
qDebug() << "the query is " <<query << " and cn is " <<QString : :fromAscii(tempConstChar);
hwInfo =item - >dynamicCall(tempConstChar).toString();
}
qDebug() << " string is " <<hwInfo;
} else{
qDebug() << " item is null";
}
} else{
qDebug() << " item is false";
}
}
return hwInfo;
}
/*
//0.当前原生网卡地址:
SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))
// 1.硬盘序列号
SELECT PNPDeviceID FROM Win32_DiskDrive WHERE(SerialNumber IS NOT NULL) AND (MediaType LIKE 'Fixed hard disk%')
//2.获取主板序列号
SELECT SerialNumber FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)
// 3.处理器ID
SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)
// 4.BIOS序列号
SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)
// 5.主板型号
SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)*/
QString hwInfo =tr( "");
QStringList sqlCmd;
sqlCmd.clear();
sqlCmd <<tr( "SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))");
//注意qt调用 wmi时,对查询语句要求很严格,所以 like之类的句子务必精确才能有结果出来
sqlCmd <<tr( "SELECT PNPDeviceID FROM Win32_DiskDrive WHERE( PNPDeviceID IS NOT NULL) AND (MediaType LIKE 'Fixed%')");
sqlCmd <<tr( "SELECT SerialNumber FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)");
sqlCmd <<tr( "SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)");
sqlCmd <<tr( "SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)");
sqlCmd <<tr( "SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)");
QStringList columnName;
columnName.clear();
columnName <<tr( "MACAddress");
columnName <<tr( "PNPDeviceID");
columnName <<tr( "SerialNumber");
columnName <<tr( "ProcessorId");
columnName <<tr( "SerialNumber");
columnName <<tr( "Product");
QAxObject *objIWbemLocator = new QAxObject( "WbemScripting.SWbemLocator");
QAxObject *objWMIService =objIWbemLocator - >querySubObject( "ConnectServer(QString&,QString&)",QString( "."),QString( "root\\cimv2"));
QString query =tr( "");
if(type <sqlCmd.size())
query =sqlCmd.at(type);
QAxObject *objInterList = objWMIService - >querySubObject( "ExecQuery(QString&))", query);
QAxObject *enum1 = objInterList - >querySubObject( "_NewEnum");
//需要 include windows.h
IEnumVARIANT * enumInterface = 0;
enum1 - >queryInterface(IID_IEnumVARIANT, ( void * *) &enumInterface);
enumInterface - >Reset();
for ( int i = 0; i < objInterList - >dynamicCall( "Count").toInt(); i ++) {
VARIANT *theItem = (VARIANT *)malloc( sizeof(VARIANT));
if (enumInterface - >Next( 1,theItem,NULL) != S_FALSE){
QAxObject *item = new QAxObject((IUnknown *)theItem - >punkVal);
if(item){
if(type <columnName.size()){
QByteArray datagram(columnName.at(type).toAscii()); //Or
const char * tempConstChar = datagram.data();
qDebug() << "the query is " <<query << " and cn is " <<QString : :fromAscii(tempConstChar);
hwInfo =item - >dynamicCall(tempConstChar).toString();
}
qDebug() << " string is " <<hwInfo;
} else{
qDebug() << " item is null";
}
} else{
qDebug() << " item is false";
}
}
return hwInfo;
}