⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmicollector.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	CMyString sPropName; sPropName = bsName;	long iSize = sPropName.GetLength();	Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,		"WMICollector::getProperty() - Property Name is %s, type is %x, CIMTYPE is %x", 		(LPCTSTR)sPropName, vValue.vt, type);	// put this in to check XP - @bbp	if (VT_BSTR == vValue.vt)	{		CComBSTR bs;		bs.Empty();		bs.Append(vValue.bstrVal);		sPropName = bs;		iSize = sPropName.GetLength();		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,			"WMICollector::getProperty() - Property Value is %s, size is %x", 			(LPCTSTR)sPropName, iSize);	}	CComPtr<IWbemQualifierSet> pQualifiers;	// get the qualifier set for the properties	sMessage = "GetPropertyQualifierSet()";	hr = pClass->GetPropertyQualifierSet(bsName, &pQualifiers);	if (SUCCEEDED(hr))	{		property = WMIProperty(bsName, vValue, type, pQualifiers, includeQualifiers);		// set the property qualifier		property.setPropagated(bPropagated);	}	// check if requested ClassOrigin qualifier	// ATTN:	// This is a bug in Pegasus.  It will put it	//	the current class for GetClass if it isn't	//	there.	if ((includeClassOrigin /*|| bPropagated*/) && SUCCEEDED(hr))	{		CComBSTR		bsClassOrigin;		sMessage = "GetPropertyOrigin()";		hr = pClass->GetPropertyOrigin(bsName, & bsClassOrigin);		if (SUCCEEDED(hr))		{			property.setClassOrigin(WMIString(bsClassOrigin));		}	}	if (pQualifiers)		pQualifiers.Release();	if (FAILED(hr))	{		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,			"WMICollector::getProperty() - %s result is %x", sMessage, hr);		throw CIMException(CIM_ERR_FAILED);	}	PEG_METHOD_EXIT();	return property;}/////////////////////////////////////////////////////////////////////////////// WMICollector::getClassMethods - retrieves the //		class method definitions and parameters, if any,//		and adds them to the CIMClass instance///////////////////////////////////////////////////////////////////////////////bool WMICollector::getClassMethods(IWbemClassObject *pObject, 									  CIMClass & cimClass,									  Boolean localOnly,									  Boolean includeQualifiers,									  Boolean includeClassOrigin){ 	PEG_METHOD_ENTER(TRC_WMIPROVIDER,"WMICollector::getClasslMethods()");	long lFlags = (localOnly) ? WBEM_FLAG_LOCAL_ONLY : 0L;	// we want all the methods...	getAllMethods(pObject, lFlags, includeQualifiers, includeClassOrigin, cimClass);	PEG_METHOD_EXIT();	return true;}/////////////////////////////////////////////////////////////////////////////// WMICollector::getMethod//		create a CIMMethod object from//		WMI data ///////////////////////////////////////////////////////////////////////////////CIMMethod WMICollector::getMethod(IWbemClassObject *pClass, 								  const CComBSTR &bsName, 								  const CComPtr<IWbemClassObject> &inParameters,								  const CComPtr<IWbemClassObject> &outParameters,								  Boolean includeClassOrigin, 								  Boolean includeQualifiers,								  Boolean bPropagated){	PEG_METHOD_ENTER(TRC_WMIPROVIDER,"WMICollector::getMethod()");		HRESULT hr = S_OK;	String sMessage;	CIMMethod method;	CMyString sMethodName; sMethodName = bsName;	long iSize = sMethodName.GetLength();	Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,		"WMICollector::getMethod() - Method Name is %s", 		(LPCTSTR)sMethodName);	CComPtr<IWbemQualifierSet> pQualifiers;	// get the qualifier set for the method	sMessage = "GetMethodQualifierSet()";	hr = pClass->GetMethodQualifierSet(bsName, &pQualifiers);	if (SUCCEEDED(hr))	{		method = WMIMethod(bsName, inParameters, outParameters, pQualifiers, includeQualifiers);		// set the method qualifier		method.setPropagated(bPropagated);	}	// check if requested ClassOrigin qualifier	// ATTN:	// This is a bug in Pegasus.  It will put it	//	the current class for GetClass if it isn't	//	there.	if ((includeClassOrigin /*|| bPropagated*/) && SUCCEEDED(hr))	{		CComBSTR		bsClassOrigin;		sMessage = "GetMethodOrigin()";		hr = pClass->GetMethodOrigin(bsName, & bsClassOrigin);		if (SUCCEEDED(hr))		{			method.setClassOrigin(WMIString(bsClassOrigin));		}	}	if (pQualifiers)		pQualifiers.Release();	if (FAILED(hr))	{		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,			"WMICollector::getMethod() - %s result is %x", sMessage, hr);		throw CIMException(CIM_ERR_FAILED);	}	PEG_METHOD_EXIT();	return method;}/////////////////////////////////////////////////////////////////////////////// WMICollector::setNamespace//	 ///////////////////////////////////////////////////////////////////////////////void WMICollector::setNamespace(const String & sNamespace){	String s;	String sLower = sNamespace;	sLower.toLower();	Uint32 pos = sLower.find("root");		m_bIsLocalNamespace = (0 == pos);	if (m_bIsLocalNamespace)	{		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,			"WMICollector::setNamespace() - Namespace %s is local", sNamespace.getCString());		s = sNamespace;	}	else	{		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,			"WMICollector::setNamespace() - Namespace %s is remote", sNamespace.getCString());		// by Jair 		// adjust the namespace to accept DNS fully qualified names		// and IP addresses.		String str = sNamespace;		for (Uint32 i = 0; i < pos - 1; i++)		{			if (str[i] == '/') 			{                // have a '.' encoded as '/' -- convert back to '.':				str[i] = '.';			}			else if (str[i] == '_')			{                if (str[i + 1] == '_' &&                    iswxdigit(str[i + 2]) &&                    iswxdigit(str[i + 3]))                {                    // have a non-alpha char (punctuation, etc.) encoded as                    // "__XX", where XX is the hex representation of the char                    String hexStr = str.subString(i+2, 2);                    Char16 punctChar = (Char16)wcstol(                        (const wchar_t *)hexStr.getChar16Data(), NULL, 16);                    // replace the first underscore with the non-alpha char:                    str[i] = punctChar;                    // remove the second underscore + 2 hex chars:                    str.remove(i+1, 3);                    pos -= 3;                }                else if (iswdigit(str[i + 1]))				{                    if ((i == 0) || (str[i - 1] == '.'))					{                        // have a leading digit pre-pended with an underscore                        // remove the underscore:						str.remove(i, 1);						pos--;					}				}			}		}		//prepend "//" to namespace		s = "//";		s.append(str);	}	m_bsNamespace = s.getCString();}/////////////////////////////////////////////////////////////////////////////// WMICollector::setUserName//	 ///////////////////////////////////////////////////////////////////////////////void WMICollector::setUserName(const String & sUserName){	String sUser = sUserName;	String sDomain = ".";	Uint32 pos = sUser.find("/");		if (PEG_NOT_FOUND == pos)		pos = sUser.find("\\");	if (pos != PEG_NOT_FOUND)	{		sDomain = sUser.subString(0, pos);		sUser.remove(0, pos + 1);	}	Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,				"WMICollector::setUserName() - UserName [%s], Domain [%s]", 				sUser.getCString(), sDomain.getCString());	m_bsUserName = sUser.getCString();	m_bsDomain = sDomain.getCString();}/////////////////////////////////////////////////////////////////////////////// WMICollector::setPassword//	 //// ///////////////////////////////////////////////////////////////////////////void WMICollector::setPassword(const String & sPassword){	Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,				"WMICollector::setPassword() - Password %s", sPassword.getCString());	m_bsPassword = sPassword.getCString();}/////////////////////////////////////////////////////////////////////////////// WMICollector::setProxySecurity//	 ///////////////////////////////////////////////////////////////////////////////bool WMICollector::setProxySecurity(IUnknown * pProxy){	PEG_METHOD_ENTER(TRC_WMIPROVIDER,"WMICollector::setProxySecurity()");    HRESULT hr;	if(m_bIsLocalNamespace)	{		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,				"WMICollector::setProxySecurity() - m_bIsLocalNamespace is true");        hr = CoSetProxyBlanket(			pProxy,			RPC_C_AUTHN_WINNT,    // NTLM authentication service			RPC_C_AUTHZ_NONE,     // default authorization service...			NULL,                 // no mutual authentication			RPC_C_AUTHN_LEVEL_PKT,      // authentication Tracer::LEVEL			RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation Tracer::LEVEL			NULL,                			EOAC_DYNAMIC_CLOAKING);     // enable dynamic cloaking, so                                         // impersonation token is propagated to WMI	}	else	{		Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,				"WMICollector::setProxySecurity() - m_bIsLocalNamespace is false");        // set security attributes on pProxy		COAUTHIDENTITY authident;					memset((void *)&authident,0,sizeof(COAUTHIDENTITY));		authident.UserLength = (ULONG)m_bsUserName.Length();		authident.User = (LPWSTR)m_bsUserName.m_str;		authident.PasswordLength = (ULONG)m_bsPassword.Length();		authident.Password = (LPWSTR)m_bsPassword.m_str;		authident.DomainLength = (ULONG)m_bsDomain.Length();		authident.Domain = (LPWSTR)m_bsDomain.m_str;		authident.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;		hr = CoSetProxyBlanket(				pProxy,				RPC_C_AUTHN_WINNT,    // NTLM authentication service				RPC_C_AUTHZ_NONE,     // default authorization service...				NULL,                 // no mutual authentication				RPC_C_AUTHN_LEVEL_PKT,      // authentication Tracer::LEVEL				RPC_C_IMP_LEVEL_IMPERSONATE,    // impersonation Tracer::LEVEL				&authident, 			    EOAC_NONE); // EOAC_DYNAMIC_CLOAKING seems to fail on remote WMI calls,                            // or when COAUTHIDENTITY info is sent (as in this case),                            // so going back to EOC_NONE for this case only.	}    Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,			"WMICollector::setProxySecurity() - return from CoSetProxyBlanket() is %x", hr); 	PEG_METHOD_EXIT();	return SUCCEEDED(hr);}/////////////////////////////////////////////////////////////////////////////// WMICollector::logonUser//	 ///////////////////////////////////////////////////////////////////////////////void WMICollector::logonUser(){	CMyString sUserName, sDomain, sPassword;	sUserName = (LPWSTR)m_bsUserName.m_str;	sDomain   = (LPWSTR)m_bsDomain.m_str;	sPassword = (LPWSTR)m_bsPassword.m_str;	LPTSTR pszUserName  = (LPTSTR)(LPCTSTR)sUserName;	LPTSTR pszDomain    = (LPTSTR)(LPCTSTR)sDomain;	LPTSTR pszPassword  = (LPTSTR)(LPCTSTR)sPassword;    //Logon and impersonate the user	if(!RevertToSelf())	{		DWORD error = GetLastError();				Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,				"WMICollector::logonUser() - return from RevertToSelf() is %d", error);		throw CIMException(CIM_ERR_ACCESS_DENIED, "RevertToSelf()");	}	HANDLE htok = 0;	if(!LogonUser(pszUserName,		          pszDomain,				  pszPassword,				  LOGON32_LOGON_INTERACTIVE,				  LOGON32_PROVIDER_DEFAULT,				  &htok))	{		DWORD error = GetLastError();			Tracer::trace(TRC_WMIPROVIDER, Tracer::LEVEL3,				"WMICollector::logonUser() - return from LogonUser() is %d", error);				        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,                    "Failed to login user \"$0/$1\". Invalid username or password.",                    pszDomain, pszUserName);		        throw CIMException(CIM_ERR_ACCESS_DENIED, "LogonUser()");	}	if(!ImpersonateLoggedOnUser(htok))	{		DWORD error = GetLastError();		CloseHandle(htok);        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,                    "Failed to impersonate logged-in user \"$0/$1\".",                    pszDomain, pszUserName);				throw CIMException(CIM_ERR_ACCESS_DENIED, "ImpersonateLoggedOnUser()");	}	CloseHandle(htok);	m_bImpersonate = true;}/////////////////////////////////////////////////////////////////////////////// WMICollector::revertToSelf//	 ///////////////////////////////////////////////////////////////////////////////void WMICollector::revertToSelf(){	if(!RevertToSelf())	{		throw CIMException(CIM_ERR_FAILED, "RevertToSelf()");	}}PEGASUS_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -