host/common/win32/wmiusers.cpp (773 lines of code) (raw):
#include <windows.h>
#include <atlbase.h>
#include <WinIoCtl.h>
#include "wmiusers.h"
#include "logger.h"
#include "portablehelpers.h"
#include "configwrapper.h"
#include "portablehelpersmajor.h"
#include "hostagenthelpers.h"
const char MACADDRESSCOLUMNNAME[] = "MACAddress";
const char DHCPENABLEDCOLUMNNAME[] = "DHCPEnabled";
const char IPADDRESSCOLUMNNAME[] = "IPAddress";
const char IPSUBNETCOLUMNNAME[] = "IPSubnet";
const char DEFAULTIPGATEWAYCOLUMNNAME[] = "DefaultIPGateway";
const char INDEXCOLUMNNAME[] = "Index";
const char DNSSERVERSEARCHORDERCOLUMNNAME[] = "DNSServerSearchOrder";
const char DNSHOSTNAMECOLUMNNAME[] = "DNSHostName";
const char NAMECOLUMNNAME[] = "Name";
const char MANUFACTURERCOLUMNNAME[] = "Manufacturer";
const char MAXSPEEDCOLUMNNAME[] = "MaxSpeed";
const char MODELCOLUMNNAME[] = "Model";
void CopyFromBstrSafeArrayToOutParams(VARIANT *pvt, std::string &valueString, const char &delim,
const bool fillVector = false, std::vector<std::string>& valuesVector = std::vector<std::string>());
void UpdateDiskType(const std::string &diskname, Object *pdiskobj);
bool WmiComputerSystemRecordProcessor::Process(IWbemClassObject *precordobj)
{
if (0 == m_pWmiComputerSystemClass)
{
m_ErrMsg = "wmi computer system class to fill is not supplied in its record processor";
return false;
}
if (0 == precordobj)
{
m_ErrMsg = "record object is not specified for wmi computer system class";
return false;
}
bool bprocessed = true;
USES_CONVERSION;
/* copy model */
VARIANT vtProp;
HRESULT hrCol;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MODELCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (V_VT(&vtProp) == VT_BSTR)
{
m_pWmiComputerSystemClass->model = W2A(vtProp.bstrVal);
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MODELCOLUMNNAME;
m_ErrMsg += " from computer system wmi class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MANUFACTURERCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (V_VT(&vtProp) == VT_BSTR)
{
m_pWmiComputerSystemClass->manufacturer = W2A(vtProp.bstrVal);
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MANUFACTURERCOLUMNNAME;
m_ErrMsg += " from computer system wmi class";
}
return bprocessed;
}
void WmiComputerSystemRecordProcessor::WmiComputerSystemClass::Print(void)
{
DebugPrintf(SV_LOG_DEBUG, "model: %s\n", model.c_str());
DebugPrintf(SV_LOG_DEBUG, "manufacturer: %s\n", manufacturer.c_str());
}
bool WmiNetworkAdapterRecordProcessor::Process(IWbemClassObject *precordobj)
{
if (0 == m_pNicInfos)
{
m_ErrMsg = "nic infos to fill is not supplied in process wmi network adapter class";
return false;
}
if (0 == precordobj)
{
m_ErrMsg = "record object is not specified for wmi network adapter class";
return false;
}
bool bprocessed = true;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
std::stringstream ssmessage;
std::string hardwareaddress;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MACADDRESSCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
hardwareaddress = W2A(V_BSTR(&vtProp));
}
VariantClear(&vtProp);
ssmessage << MACADDRESSCOLUMNNAME << " : " << hardwareaddress << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MACADDRESSCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
return bprocessed;
}
unsigned int index = ~0;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INDEXCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_I4 == V_VT(&vtProp))
{
index = V_I4(&vtProp);
}
VariantClear(&vtProp);
ssmessage << INDEXCOLUMNNAME << " : " << index << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INDEXCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
return bprocessed;
}
if (~0 == index)
{
bprocessed = false;
m_ErrMsg = "failed to get correct type for ";
m_ErrMsg += INDEXCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
return bprocessed;
}
if (hardwareaddress.empty())
{
ssmessage << "Skipping record as " << MACADDRESSCOLUMNNAME << " is empty.";
m_TraceMsg = ssmessage.str();
return bprocessed;
}
Objects_t *pnicobjs;
NicInfosIter_t nicinfoiter = m_pNicInfos->find(hardwareaddress);
if (nicinfoiter != m_pNicInfos->end())
{
ssmessage << "Found existing NicInfo object for MAC address " << hardwareaddress << std::endl;
Objects_t &nicobjs = nicinfoiter->second;
pnicobjs = &nicobjs;
}
else
{
ssmessage << "Creating new NicInfo object for MAC address " << hardwareaddress << std::endl;
std::pair<NicInfosIter_t, bool> pr = m_pNicInfos->insert(std::make_pair(hardwareaddress, Objects_t()));
Objects_t &nicobjs = pr.first->second;
pnicobjs = &nicobjs;
}
std::stringstream ssindex;
ssindex << index;
Object *p;
ObjectsIter_t nicobjiter = std::find_if(pnicobjs->begin(), pnicobjs->end(), ObjectEqAttr(NSNicInfo::INDEX, ssindex.str()));
if (nicobjiter != pnicobjs->end())
{
ssmessage << "Found existing NicInfo object for index " << index << std::endl;
Object &nicobj = *nicobjiter;
p = &nicobj;
}
else
{
ssmessage << "Creating new NicInfo object for index " << index << std::endl;
ObjectsIter_t nit = pnicobjs->insert(pnicobjs->end(), Object());
Object &nicobj = *nit;
p = &nicobj;
p->m_Attributes.insert(std::make_pair(NSNicInfo::INDEX, ssindex.str()));
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(NAMECOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
p->m_Attributes.insert(std::make_pair(NSNicInfo::NAME, W2A(V_BSTR(&vtProp))));
ssmessage << NAMECOLUMNNAME << " : " << W2A(V_BSTR(&vtProp)) << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += NAMECOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MANUFACTURERCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
p->m_Attributes.insert(std::make_pair(NSNicInfo::MANUFACTURER, W2A(V_BSTR(&vtProp))));
ssmessage << MANUFACTURERCOLUMNNAME << " : " << W2A(V_BSTR(&vtProp)) << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MANUFACTURERCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MAXSPEEDCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
/* TODO: this is not supported as of now;
* but will this occur as I8 ? */
if (VT_I8 == V_VT(&vtProp))
{
std::stringstream ssmaxspeed;
ssmaxspeed << V_I8(&vtProp);
p->m_Attributes.insert(std::make_pair(NSNicInfo::MAX_SPEED, ssmaxspeed.str()));
ssmessage << MAXSPEEDCOLUMNNAME << " : " << ssmaxspeed.str() << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MAXSPEEDCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
}
m_TraceMsg = ssmessage.str();
return bprocessed;
}
bool WmiNetworkAdapterConfRecordProcessor::Process(IWbemClassObject *precordobj)
{
if (0 == m_pNicInfos)
{
m_ErrMsg = "nic infos to fill is not supplied in process wmi network adapter configuration class";
return false;
}
if (0 == precordobj)
{
m_ErrMsg = "record object is not specified for wmi network adapter configuration class";
return false;
}
bool bprocessed = true;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
std::stringstream ssmessage;
std::string hardwareaddress;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MACADDRESSCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
hardwareaddress = W2A(V_BSTR(&vtProp));
}
VariantClear(&vtProp);
ssmessage << MACADDRESSCOLUMNNAME << " : " << hardwareaddress << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MACADDRESSCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
return bprocessed;
}
unsigned int index = ~0;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INDEXCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_I4 == V_VT(&vtProp))
{
index = V_I4(&vtProp);
}
VariantClear(&vtProp);
ssmessage << INDEXCOLUMNNAME << " : " << index << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INDEXCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
return bprocessed;
}
if (~0 == index)
{
bprocessed = false;
m_ErrMsg = "failed to get correct type for ";
m_ErrMsg += INDEXCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
return bprocessed;
}
if (hardwareaddress.empty())
{
ssmessage << "Skipping record as " << MACADDRESSCOLUMNNAME << " is empty.";
m_TraceMsg = ssmessage.str();
return bprocessed;
}
Objects_t *pnicobjs;
NicInfosIter_t nicinfoiter = m_pNicInfos->find(hardwareaddress);
if (nicinfoiter != m_pNicInfos->end())
{
ssmessage << "Found existing NicInfo object for MAC address " << hardwareaddress << std::endl;
Objects_t &nicobjs = nicinfoiter->second;
pnicobjs = &nicobjs;
}
else
{
ssmessage << "Creating new NicInfo object for MAC address " << hardwareaddress << std::endl;
std::pair<NicInfosIter_t, bool> pr = m_pNicInfos->insert(std::make_pair(hardwareaddress, Objects_t()));
Objects_t &nicobjs = pr.first->second;
pnicobjs = &nicobjs;
}
std::stringstream ssindex;
ssindex << index;
Object *p;
ObjectsIter_t nicobjiter = std::find_if(pnicobjs->begin(), pnicobjs->end(), ObjectEqAttr(NSNicInfo::INDEX, ssindex.str()));
if (nicobjiter != pnicobjs->end())
{
ssmessage << "Found existing NicInfo object for index " << index << std::endl;
Object &nicobj = *nicobjiter;
p = &nicobj;
}
else
{
ssmessage << "Creating new NicInfo object for index " << index << std::endl;
ObjectsIter_t nit = pnicobjs->insert(pnicobjs->end(), Object());
Object &nicobj = *nit;
p = &nicobj;
p->m_Attributes.insert(std::make_pair(NSNicInfo::INDEX, ssindex.str()));
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(DHCPENABLEDCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BOOL == V_VT(&vtProp))
{
p->m_Attributes.insert(std::make_pair(NSNicInfo::IS_DHCP_ENABLED, STRBOOL(V_BOOL(&vtProp))));
ssmessage << DHCPENABLEDCOLUMNNAME << " : " << STRBOOL(V_BOOL(&vtProp)) << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += DHCPENABLEDCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(IPADDRESSCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
std::pair<AttributesIter_t, bool> pr = p->m_Attributes.insert(std::make_pair(NSNicInfo::IP_ADDRESSES, std::string()));
AttributesIter_t nit = pr.first;
std::vector<std::string> ipVector;
CopyFromBstrSafeArrayToOutParams(&vtProp, nit->second, NSNicInfo::DELIM, true, ipVector);
VariantClear(&vtProp);
ssmessage << IPADDRESSCOLUMNNAME << " : ";
std::vector<std::string>::iterator ipvecIter = ipVector.begin();
for (/**/; ipvecIter != ipVector.end(); ipvecIter++)
ssmessage << *ipvecIter << ", ";
ssmessage << std::endl;
/* insert ip_types attribute for all the ips */
do
{
std::vector<std::string> physicalIPs;
LONG result = GetAllPhysicalIPsOfSystem(physicalIPs);
if (result)
{
DebugPrintf(SV_LOG_ERROR, "Failed to fetch physical ips, not registering ip_types attribute in NicInfo.\n");
break;
}
ssmessage << "physicalIPs" << " : ";
std::vector<std::string>::iterator pipvecIter = physicalIPs.begin();
for (/**/; pipvecIter != physicalIPs.end(); pipvecIter++)
ssmessage << *pipvecIter << ", ";
ssmessage << std::endl;
/* physicalIPs has physical IPs; mark them as such and rest as 'unknown'*/
pr = p->m_Attributes.insert(std::make_pair(NSNicInfo::IP_TYPES, std::string()));
nit = pr.first;
for (int i = 0; i < ipVector.size(); ++i)
{
if (std::find(physicalIPs.begin(), physicalIPs.end(), ipVector[i]) != physicalIPs.end())
{
nit->second += NSNicInfo::IP_TYPE_PHYSICAL;
}
else
{
nit->second += NSNicInfo::IP_TYPE_UNKNOWN;
}
if (i < ipVector.size() - 1) // avoid delim at the end
{
nit->second += NSNicInfo::DELIM;
}
}
} while (0);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += IPADDRESSCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(IPSUBNETCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
std::pair<AttributesIter_t, bool> pr = p->m_Attributes.insert(std::make_pair(NSNicInfo::IP_SUBNET_MASKS, std::string()));
AttributesIter_t nit = pr.first;
std::vector<std::string> subnetVector;
CopyFromBstrSafeArrayToOutParams(&vtProp, nit->second, NSNicInfo::DELIM, true, subnetVector);
VariantClear(&vtProp);
ssmessage << IPSUBNETCOLUMNNAME << " : ";
std::vector<std::string>::iterator subnetvecIter = subnetVector.begin();
for (/**/; subnetvecIter != subnetVector.end(); subnetvecIter++)
ssmessage << *subnetvecIter << ", ";
ssmessage << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += IPSUBNETCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(DEFAULTIPGATEWAYCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
std::pair<AttributesIter_t, bool> pr = p->m_Attributes.insert(std::make_pair(NSNicInfo::DEFAULT_IP_GATEWAYS, std::string()));
AttributesIter_t nit = pr.first;
std::vector<std::string> gtwVector;
CopyFromBstrSafeArrayToOutParams(&vtProp, nit->second, NSNicInfo::DELIM, true, gtwVector);
VariantClear(&vtProp);
ssmessage << DEFAULTIPGATEWAYCOLUMNNAME << " : ";
std::vector<std::string>::iterator gtwvecIter = gtwVector.begin();
for (/**/; gtwvecIter != gtwVector.end(); gtwvecIter++)
ssmessage << *gtwvecIter << ", ";
ssmessage << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += DEFAULTIPGATEWAYCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(DNSSERVERSEARCHORDERCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
std::pair<AttributesIter_t, bool> pr = p->m_Attributes.insert(std::make_pair(NSNicInfo::DNS_SERVER_ADDRESSES, std::string()));
AttributesIter_t nit = pr.first;
std::vector<std::string> dnsVector;
CopyFromBstrSafeArrayToOutParams(&vtProp, nit->second, NSNicInfo::DELIM, true, dnsVector);
VariantClear(&vtProp);
ssmessage << DNSSERVERSEARCHORDERCOLUMNNAME << " : ";
std::vector<std::string>::iterator dnsvecIter = dnsVector.begin();
for (/**/; dnsvecIter != dnsVector.end(); dnsvecIter++)
ssmessage << *dnsvecIter << ", ";
ssmessage << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += DNSSERVERSEARCHORDERCOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(DNSHOSTNAMECOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
p->m_Attributes.insert(std::make_pair(NSNicInfo::DNS_HOST_NAME, W2A(V_BSTR(&vtProp))));
ssmessage << DNSHOSTNAMECOLUMNNAME << " : " << W2A(V_BSTR(&vtProp)) << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += DNSHOSTNAMECOLUMNNAME;
m_ErrMsg += " from wmi network adapter configuration class";
}
m_TraceMsg = ssmessage.str();
return bprocessed;
}
bool InstalledProductsProcessor::Process(IWbemClassObject *precordobj)
{
if( precordobj == 0 )
{
m_ErrMsg = "record object is not specified for wmi product class class" ;
return false;
}
const char INSTALLEDPRODUCT_PACKAGENAME_COLUMNNAME[] = "PackageName";
const char INSTALLEDPRODUCT_NAME_COLUMNNAME[] = "Name";
const char INSTALLEDPRODUCT_VENDOR_COLUMNNAME[] = "Vendor";
const char INSTALLEDPRODUCT_VERSION_COLUMNNAME[] = "Version";
const char INSTALLEDPRODUCT_INSTALLPATH_COLUMNNAME[] = "InstallLocation" ;
bool bprocessed = true ;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
VariantInit(&vtProp);
InstalledProduct product ;
hrCol = precordobj->Get(A2W(INSTALLEDPRODUCT_PACKAGENAME_COLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
product.pkgname = W2A(V_BSTR(&vtProp)) ;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INSTALLEDPRODUCT_PACKAGENAME_COLUMNNAME;
m_ErrMsg += " from wmi product class";
return bprocessed;
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INSTALLEDPRODUCT_NAME_COLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
product.name = W2A(V_BSTR(&vtProp)) ;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INSTALLEDPRODUCT_NAME_COLUMNNAME;
m_ErrMsg += " from wmi product class";
return bprocessed;
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INSTALLEDPRODUCT_VENDOR_COLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
product.pkgname = W2A(V_BSTR(&vtProp)) ;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INSTALLEDPRODUCT_VENDOR_COLUMNNAME;
m_ErrMsg += " from wmi product class";
return bprocessed;
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INSTALLEDPRODUCT_VERSION_COLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
product.version = W2A(V_BSTR(&vtProp)) ;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INSTALLEDPRODUCT_VERSION_COLUMNNAME;
m_ErrMsg += " from wmi product class";
return bprocessed;
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INSTALLEDPRODUCT_INSTALLPATH_COLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
product.installLocation = W2A(V_BSTR(&vtProp)) ;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INSTALLEDPRODUCT_INSTALLPATH_COLUMNNAME;
m_ErrMsg += " from wmi product class";
return bprocessed;
}
m_InstalledProducts->push_back( product ) ;
return bprocessed;
}
bool QuickFixEngineeringProcessor::Process(IWbemClassObject *precordobj)
{
if( precordobj == 0 )
{
m_ErrMsg = "record object is not specified for wmi quick fix engglass" ;
return false;
}
const char HOTFIXIDCOLUMNNAME[] = "HotFixID";
bool bprocessed = true ;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(HOTFIXIDCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
m_WMIHotFixInfoClass->hotfixList.push_back(W2A(V_BSTR(&vtProp)));
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += HOTFIXIDCOLUMNNAME;
m_ErrMsg += " from wmi quick fix engg class";
return bprocessed;
}
return bprocessed ;
}
bool BaseBoardProcessor::Process(IWbemClassObject *precordobj)
{
if( precordobj == 0 )
{
m_ErrMsg = "record object is not specified for wmi bios class";
return false;
}
const char BASEBOARDCOLUMNNAME[] = "SerialNumber";
bool bprocessed = true ;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(BASEBOARDCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
m_wmibasebrdclass->serialNo = W2A(V_BSTR(&vtProp));
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += BASEBOARDCOLUMNNAME;
m_ErrMsg += " from wmi bios class";
return bprocessed;
}
return bprocessed ;
}
bool BIOSRecordProcessor::Process(IWbemClassObject *precordobj)
{
if( precordobj == 0 )
{
m_ErrMsg = "record object is not specified for wmi bios class";
return false;
}
const char BIOSSERIALCOLUMNNAME[] = "SerialNumber";
bool bprocessed = true ;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(BIOSSERIALCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
m_wmibiosclass->serialNo = W2A(V_BSTR(&vtProp));
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += BIOSSERIALCOLUMNNAME;
m_ErrMsg += " from wmi bios class";
return bprocessed;
}
return bprocessed ;
}
bool WmiComputerSystemProductProcessor::Process(IWbemClassObject *precordobj)
{
if (precordobj == 0)
{
m_ErrMsg = "record object is not specified for wmi computer system product class";
return false;
}
const char UUID[] = "UUID";
bool bprocessed = true;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(UUID), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
m_wmicsproductclass->uuid = W2A(V_BSTR(&vtProp));
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += UUID;
m_ErrMsg += " from wmi computer system product class";
return bprocessed;
}
return bprocessed;
}
bool WmiSystemEnclosureProcessor::Process(IWbemClassObject *precordobj)
{
USES_CONVERSION;
std::stringstream ssError;
if (NULL == precordobj)
{
m_ErrMsg = "record object is not specified for wmi SystemEnclosure class";
DebugPrintf(SV_LOG_ERROR, m_ErrMsg.c_str());
return false;
}
CComVariant vtSMBIOSAssetTag;
HRESULT hr;
hr = precordobj->Get(L"SMBIOSAssetTag", 0, &vtSMBIOSAssetTag, 0, 0);
if (FAILED(hr)) {
ssError << "Failed to get SMBIOSAssetTag from Win32_SystemEnclosure hr=" << std::hex << hr;
m_ErrMsg = ssError.str();
DebugPrintf(SV_LOG_ERROR, m_ErrMsg.c_str());
return false;
}
if (VT_BSTR != V_VT(&vtSMBIOSAssetTag)) {
ssError << "SMBIOSAssetTag from Win32_SystemEnclosure has unexpected type=" << V_VT(&vtSMBIOSAssetTag);
m_ErrMsg = ssError.str();
DebugPrintf(SV_LOG_ERROR, m_ErrMsg.c_str());
return false;
}
m_SMBIOSAssetTag = W2A(vtSMBIOSAssetTag.bstrVal);
return true;
}