//*************************************************************************** // // UTILS.CPP // // Module: WBEM Instance provider // // Purpose: General purpose utilities. // // Copyright (c)1998 Microsoft Corporation, All Rights Reserved // //*************************************************************************** #include "iisprov.h" //define the static synch object CSynchObject CUtils::s_synObject; ///////////////////////////////////////////////////////////////////////////// // // CUtils::MzCat // // Synopsis: // The metabase has this animal called METADATA_STRINGSZ which has the // following form: . MzCat concatenates // strings in the defined way. *a_ppdst has the new pointer upon exit. The // previous value of *a_ppdst is delelted. *a_ppdst == NULL is handled. // ///////////////////////////////////////////////////////////////////////////// void CUtils::MzCat ( WCHAR** a_ppdst, const WCHAR* a_psz ) { WCHAR *t_psrc, *t_pdst, *t_pnew; int t_ilen; if (a_psz == NULL) throw WBEM_E_FAILED; if (*a_ppdst) { for ( t_ilen=0, t_psrc = *a_ppdst ; *t_psrc || *(t_psrc+1) ; t_psrc++, t_ilen++ ) { ; } t_ilen = t_ilen + wcslen(a_psz)+3; } else t_ilen = wcslen(a_psz)+2; t_pnew = t_pdst = new WCHAR[t_ilen]; if (!t_pdst) throw WBEM_E_OUT_OF_MEMORY; if (*a_ppdst) { for ( t_psrc = *a_ppdst ; *t_psrc || *(t_psrc+1) ; t_pdst++, t_psrc++ ) { *t_pdst = *t_psrc; } *t_pdst = L'\0'; *t_pdst++; } wcscpy(t_pdst,a_psz); *(t_pnew+t_ilen-1)=L'\0'; delete *a_ppdst; *a_ppdst=t_pnew; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetToken // // Synopsis: // *a_ppsz is a pointer to string being parsed. a_pszTok returns the next // token. // ///////////////////////////////////////////////////////////////////////////// void CUtils::GetToken( WCHAR** a_ppsz, WCHAR* a_pszTok ) { if (*a_ppsz == NULL) { *a_pszTok = L'\0'; return; } while ( **a_ppsz != L' ' && **a_ppsz ) { *a_pszTok++ = **a_ppsz,(*a_ppsz)++; } *a_pszTok = L'\0'; while ( **a_ppsz == L' ' ) { (*a_ppsz)++; } } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetKey // // Synopsis: // Return the KeyRef pointer from the ParsedObjectPath for the given string. // ///////////////////////////////////////////////////////////////////////////// KeyRef* CUtils::GetKey( ParsedObjectPath* a_p, WCHAR* a_psz ) { KeyRef* t_pkr; DWORD t_numkeys = a_p->m_dwNumKeys; DWORD t_c; for ( t_c=0; t_numkeys; t_numkeys--,t_c++ ) { t_pkr = *(a_p->m_paKeys + t_c); if (!lstrcmpiW(t_pkr->m_pName,a_psz)) return t_pkr; } return NULL; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetAssociation // // Synopsis: // Association a_pszAssociationName is returned in a_ppAssociation if found. // Returns true if association is found false otherwise. // ///////////////////////////////////////////////////////////////////////////// bool CUtils::GetAssociation( LPCWSTR a_pszAssociationName, WMI_ASSOCIATION** a_ppassociation ) { WMI_ASSOCIATION** t_ppassociation; if (a_pszAssociationName == NULL || a_ppassociation==NULL) throw WBEM_E_INVALID_CLASS; for ( t_ppassociation = WMI_ASSOCIATION_DATA::s_WmiAssociations ; *t_ppassociation != NULL ;t_ppassociation++ ) { if (_wcsicmp(a_pszAssociationName,(*t_ppassociation)->pszAssociationName) ==0) { *a_ppassociation = *t_ppassociation; return true; } } return false; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetMetabasePath // // Synopsis: // ///////////////////////////////////////////////////////////////////////////// void CUtils::GetMetabasePath( IWbemClassObject* a_pObj, ParsedObjectPath* a_p, WMI_CLASS* a_pclass, _bstr_t& a_bstrPath ) { KeyRef* t_pkr; WCHAR* t_pszKey = a_pclass->pszKeyName; WCHAR* t_psz; if (a_p == NULL || a_pclass == NULL) throw WBEM_E_FAILED; if (a_pclass->pszKeyName == NULL) { a_bstrPath = a_pclass->pszMetabaseKey; return; } t_psz = new WCHAR[wcslen(t_pszKey) + 1]; if(!t_psz) throw WBEM_E_OUT_OF_MEMORY; try { a_bstrPath = a_pclass->pszMetabaseKey; for ( GetToken(&t_pszKey,t_psz); *t_psz; GetToken(&t_pszKey,t_psz) ) { if (*t_psz == L'/') a_bstrPath += t_psz; else { if (*t_psz == L'#') t_pkr = GetKey(a_p,&t_psz[1]); else t_pkr = GetKey(a_p,t_psz); if(t_pkr == NULL) break; if (a_pObj) { _bstr_t t_bstr = t_pkr->m_pName; HRESULT t_hr = a_pObj->Put(t_bstr, 0, &t_pkr->m_vValue, 0); THROW_ON_ERROR(t_hr); } switch ((t_pkr)->m_vValue.vt) { case VT_I4: swprintf(t_psz,L"/%d",t_pkr->m_vValue.lVal); a_bstrPath += t_psz; break; case VT_BSTR: a_bstrPath += L"/"; a_bstrPath += t_pkr->m_vValue.bstrVal; break; } } } delete [] t_psz; } catch(...) { delete [] t_psz; } return; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetClass // // Synopsis: // Class a_pszClass is returned in a_ppclass if found. // Returns true if association is found false otherwise. // ///////////////////////////////////////////////////////////////////////////// bool CUtils::GetClass( LPCWSTR a_pszClass, WMI_CLASS** a_ppclass ) { WMI_CLASS** t_ppclass; if (a_pszClass == NULL || a_ppclass==NULL) throw WBEM_E_INVALID_CLASS; for (t_ppclass = WMI_CLASS_DATA::s_WmiClasses; *t_ppclass != NULL;t_ppclass++) if (_wcsicmp(a_pszClass,(*t_ppclass)->pszClassName) ==0) { *a_ppclass = *t_ppclass; return true; } return false; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetMethod // // Synopsis: // The Method descriptor for a_pszMethod is returned via a_ppMethod if found // NULL otherwise. Returns true if found false otherwise. // ///////////////////////////////////////////////////////////////////////////// bool CUtils::GetMethod( LPCWSTR a_pszMethod, WMI_METHOD** a_ppmethodList, WMI_METHOD** a_ppmethod ) { WMI_METHOD** t_ppmethod; if (a_pszMethod == NULL || a_ppmethod == NULL) throw WBEM_E_FAILED; for (t_ppmethod = a_ppmethodList; *t_ppmethod != NULL;t_ppmethod++) if (_wcsicmp(a_pszMethod,(*t_ppmethod)->pszMethodName) ==0) { *a_ppmethod = *t_ppmethod; return true; } return false; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::ExecMethodAsync // // Synopsis: // ///////////////////////////////////////////////////////////////////////////// void CUtils::ExecMethodAsync( BSTR a_strObjectPath, BSTR a_strMethodName, IWbemContext* a_pCtx, IWbemClassObject* a_pInParams, IWbemObjectSink* a_pHandler, CWbemServices* a_pNameSpace ) { WMI_CLASS* t_pWMIClass; CObjectPathParser t_PathParser(e_ParserAcceptRelativeNamespace); ParsedObjectPath* t_pParsedObject = NULL; _bstr_t t_bstrMbPath; WMI_METHOD* t_ppmethod; METADATA_HANDLE t_hKey = NULL; try { if (t_PathParser.Parse(a_strObjectPath, &t_pParsedObject) != CObjectPathParser::NoError) throw WBEM_E_INVALID_PARAMETER; if (t_pParsedObject == NULL) throw WBEM_E_FAILED; if (!GetClass(t_pParsedObject->m_pClass,&t_pWMIClass)) throw WBEM_E_INVALID_CLASS; if (!GetMethod(a_strMethodName, t_pWMIClass->ppMethod, &t_ppmethod )) throw WBEM_E_NOT_SUPPORTED; GetMetabasePath(NULL,t_pParsedObject,t_pWMIClass,t_bstrMbPath); switch(t_pWMIClass->eKeyType) { case IIsFtpService: if(a_pHandler == NULL) throw WBEM_E_INVALID_PARAMETER; ExecFtpServiceMethod( t_bstrMbPath, t_pWMIClass->pszClassName, t_ppmethod->pszMethodName, a_pCtx, a_pInParams, a_pHandler, a_pNameSpace ); break; case IIsWebService: if(a_pHandler == NULL) throw WBEM_E_INVALID_PARAMETER; ExecWebServiceMethod( t_bstrMbPath, t_pWMIClass->pszClassName, t_ppmethod->pszMethodName, a_pCtx, a_pInParams, a_pHandler, a_pNameSpace ); break; case IIsFtpServer: case IIsWebServer: { CMetabase t_metabase; t_hKey = t_metabase.OpenKey(t_bstrMbPath, true); t_metabase.PutMethod(t_hKey, t_ppmethod->dwMDId); t_metabase.CloseKey(t_hKey); // check if the method call is successful. Sleep(500); // 0.5 sec t_hKey = t_metabase.OpenKey(t_bstrMbPath, false); long lWin32Error = t_metabase.GetWin32Error(t_hKey); t_metabase.CloseKey(t_hKey); THROW_ON_ERROR(HRESULT_FROM_WIN32(lWin32Error)); } break; case IIsWebVirtualDir: case IIsWebDirectory: if(a_pHandler == NULL) throw WBEM_E_INVALID_PARAMETER; ExecWebAppMethod( t_bstrMbPath, t_pWMIClass->pszClassName, t_ppmethod->pszMethodName, a_pCtx, a_pInParams, a_pHandler, a_pNameSpace ); break; case IIsComputer: if(a_pHandler == NULL) throw WBEM_E_INVALID_PARAMETER; ExecComputerMethod( t_bstrMbPath, t_pWMIClass->pszClassName, t_ppmethod->pszMethodName, a_pCtx, a_pInParams, a_pHandler, a_pNameSpace ); break; case IIsCertMapper: if(a_pHandler == NULL) throw WBEM_E_INVALID_PARAMETER; ExecCertMapperMethod( t_bstrMbPath, t_pWMIClass->pszClassName, t_ppmethod->pszMethodName, a_pCtx, a_pInParams, a_pHandler, a_pNameSpace ); break; default: break; } if (t_pParsedObject) t_PathParser.Free(t_pParsedObject); } catch (...) { if (t_pParsedObject) t_PathParser.Free(t_pParsedObject); throw; }; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::DeleteObjectAsync // // Synopsis: // ///////////////////////////////////////////////////////////////////////////// void CUtils::DeleteObjectAsync( CWbemServices* m_pNamespace, ParsedObjectPath* a_pParsedObject, CMetabase& a_metabase ) { HRESULT t_hr = ERROR_SUCCESS; _bstr_t t_bstrMbPath; WMI_CLASS* t_pWMIClass; METADATA_HANDLE t_hKey = NULL; if (m_pNamespace==NULL || a_pParsedObject==NULL) throw WBEM_E_INVALID_PARAMETER; if (!GetClass(a_pParsedObject->m_pClass,&t_pWMIClass)) throw WBEM_E_INVALID_CLASS; // get the mata path of object GetMetabasePath(NULL,a_pParsedObject,t_pWMIClass,t_bstrMbPath); // check if the path is not existed if(!a_metabase.CheckKey(t_bstrMbPath)) throw WBEM_E_INVALID_PARAMETER; try { // if AdminACL if( t_pWMIClass->eKeyType == TYPE_AdminACL ) throw WBEM_E_NOT_SUPPORTED; else if(t_pWMIClass->eKeyType == TYPE_IPSecurity ) { t_hKey = a_metabase.OpenKey(t_bstrMbPath, true); a_metabase.DeleteData(t_hKey, MD_IP_SEC, BINARY_METADATA); a_metabase.CloseKey(t_hKey); return; } else if(t_pWMIClass->eKeyType == TYPE_AdminACE) { CAdminACL objACL; t_hr = objACL.OpenSD(t_bstrMbPath); if(SUCCEEDED(t_hr)) t_hr = objACL.DeleteObjectAsync(a_pParsedObject); THROW_ON_ERROR(t_hr); return; } t_hKey = a_metabase.OpenKey(METADATA_MASTER_ROOT_HANDLE, true); t_hr = a_metabase.DeleteKey(t_hKey, t_bstrMbPath); THROW_ON_ERROR(t_hr); a_metabase.CloseKey(t_hKey); } catch (...) { a_metabase.CloseKey(t_hKey); throw; }; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::GetObjectAsync // // Synopsis: // ///////////////////////////////////////////////////////////////////////////// HRESULT CUtils::GetObjectAsync( CWbemServices* m_pNamespace, IWbemClassObject** a_ppObj, ParsedObjectPath* a_pParsedObject, CMetabase& a_metabase ) { HRESULT t_hr = WBEM_E_FAILED; IWbemClassObject* t_pClass = NULL; METABASE_PROPERTY** t_ppmbp; _bstr_t t_bstrMbPath; WMI_CLASS* t_pWMIClass; METADATA_HANDLE t_hKey = NULL; if (m_pNamespace==NULL || a_ppObj==NULL || a_pParsedObject==NULL) return WBEM_E_INVALID_PARAMETER; try { if (!GetClass(a_pParsedObject->m_pClass,&t_pWMIClass)) return WBEM_E_INVALID_CLASS; t_hr = m_pNamespace->GetObject( a_pParsedObject->m_pClass, 0, NULL, &t_pClass, NULL ); THROW_ON_ERROR(t_hr); t_hr = t_pClass->SpawnInstance(0, a_ppObj); t_pClass->Release(); THROW_ON_ERROR(t_hr); GetMetabasePath(*a_ppObj,a_pParsedObject,t_pWMIClass,t_bstrMbPath); // if AdminACL if( t_pWMIClass->eKeyType == TYPE_AdminACL || t_pWMIClass->eKeyType == TYPE_AdminACE ) { CAdminACL objACL; t_hr = objACL.OpenSD(t_bstrMbPath); if(SUCCEEDED(t_hr)) t_hr = objACL.GetObjectAsync(*a_ppObj, a_pParsedObject, t_pWMIClass); return t_hr; } else if( t_pWMIClass->eKeyType == TYPE_IPSecurity ) // IPSecurity { CIPSecurity IPSecurity; t_hr = IPSecurity.OpenSD(t_bstrMbPath); if(SUCCEEDED(t_hr)) t_hr = IPSecurity.GetObjectAsync(*a_ppObj); return t_hr; } t_hKey = a_metabase.OpenKey(t_bstrMbPath, false); _variant_t t_vt; for (t_ppmbp=t_pWMIClass->ppmbp;*t_ppmbp; t_ppmbp++) { switch ((*t_ppmbp)->dwMDDataType) { case DWORD_METADATA: a_metabase.GetDword(t_hKey, *t_ppmbp, t_vt); break; case EXPANDSZ_METADATA: case STRING_METADATA: a_metabase.GetString(t_hKey, *t_ppmbp, t_vt); break; case MULTISZ_METADATA: a_metabase.GetMultiSz(t_hKey, *t_ppmbp, t_vt); break; default: break; } _bstr_t t_bstr = (*t_ppmbp)->pszPropName; t_hr = (*a_ppObj)->Put(t_bstr, 0, &t_vt, 0); t_vt.Clear(); if(FAILED(t_hr)) break; } a_metabase.CloseKey(t_hKey); } catch (...) { a_metabase.CloseKey(t_hKey); if (*a_ppObj) { (*a_ppObj)->Release(); *a_ppObj = NULL; } }; return t_hr; } ///////////////////////////////////////////////////////////////////////////// // // CUtils::PutObjectAsync // // Synopsis: // // ///////////////////////////////////////////////////////////////////////////// void CUtils::PutObjectAsync( IWbemClassObject* a_pObj, IWbemClassObject* a_pObjOld, ParsedObjectPath* a_pParsedObject, long a_lFlags ) { HRESULT t_hr = ERROR_SUCCESS; METABASE_PROPERTY** t_ppmbp; _bstr_t t_bstrMbPath; WMI_CLASS* t_pWMIClass; METADATA_HANDLE t_hKey = NULL; bool t_boolOverrideParent = false; if (a_pObj==NULL || a_pParsedObject==NULL) throw WBEM_E_INVALID_PARAMETER; if (!GetClass(a_pParsedObject->m_pClass,&t_pWMIClass)) throw WBEM_E_INVALID_CLASS; GetMetabasePath(NULL,a_pParsedObject,t_pWMIClass,t_bstrMbPath); // if AdminACL if( t_pWMIClass->eKeyType == TYPE_AdminACL || t_pWMIClass->eKeyType == TYPE_AdminACE ) { CAdminACL objACL; t_hr = objACL.OpenSD(t_bstrMbPath); if( SUCCEEDED(t_hr) ) t_hr = objACL.PutObjectAsync(a_pObj, a_pParsedObject, t_pWMIClass); THROW_ON_ERROR(t_hr); return; } if( t_pWMIClass->eKeyType == TYPE_IPSecurity ) // IPSecurity { CIPSecurity objIPSec; t_hr = objIPSec.OpenSD(t_bstrMbPath); if( SUCCEEDED(t_hr) ) t_hr = objIPSec.PutObjectAsync(a_pObj); THROW_ON_ERROR(t_hr); return; } // Get Instance Qualifiers IWbemQualifierSet* t_pQualSet = NULL; BSTR t_bstrQualName = NULL; VARIANT t_varQualValue; t_hr = a_pObj->GetQualifierSet(&t_pQualSet); if(SUCCEEDED(t_hr)) { t_hr = t_pQualSet->BeginEnumeration(0); } THROW_ON_ERROR(t_hr); // Looking for OverrideParent qualifier while(!t_boolOverrideParent) { t_hr = t_pQualSet->Next(0, &t_bstrQualName, &t_varQualValue, NULL); if(t_hr == WBEM_S_NO_MORE_DATA || !SUCCEEDED(t_hr)) { // No more qualifiers. // We don't need to worry about cleanup - nothing was allocated. break; } if(lstrcmpW(t_bstrQualName, WSZ_OVERRIDE_PARENT) == 0) { if(t_varQualValue.vt == VT_BOOL) { if(t_varQualValue.boolVal) { t_boolOverrideParent = true; } } } SysFreeString(t_bstrQualName); VariantClear(&t_varQualValue); } t_pQualSet->Release(); if(!SUCCEEDED(t_hr)) THROW_ON_ERROR(t_hr); t_hr = ERROR_SUCCESS; // open key CMetabase t_metabase; t_hKey = t_metabase.CreateKey(t_bstrMbPath); try { _variant_t t_vt; _variant_t t_vtOld; _bstr_t t_bstr; for (t_ppmbp=t_pWMIClass->ppmbp;*t_ppmbp && t_hr==ERROR_SUCCESS; t_ppmbp++) { t_bstr = (*t_ppmbp)->pszPropName; t_hr = a_pObj->Get(t_bstr, 0, &t_vt, NULL, NULL); THROW_E_ON_ERROR(t_hr,*t_ppmbp); if(a_pObjOld != NULL) { t_hr = a_pObjOld->Get(t_bstr, 0, &t_vtOld, NULL, NULL); THROW_E_ON_ERROR(t_hr,*t_ppmbp); } if (t_vt.vt == VT_NULL) { // Only delete non-flag properties. if ((*t_ppmbp)->dwMDMask == 0) { t_metabase.DeleteData(t_hKey, *t_ppmbp); } continue; } switch ((*t_ppmbp)->dwMDDataType) { case DWORD_METADATA: t_metabase.PutDword(t_hKey, *t_ppmbp,t_vt,&t_vtOld,t_boolOverrideParent); break; case EXPANDSZ_METADATA: case STRING_METADATA: t_metabase.PutString(t_hKey, *t_ppmbp,t_vt,&t_vtOld,t_boolOverrideParent); break; case MULTISZ_METADATA: t_metabase.PutMultiSz(t_hKey, *t_ppmbp,t_vt,&t_vtOld,t_boolOverrideParent); break; default: break; } t_vt.Clear(); t_vtOld.Clear(); } WCHAR szBuffer[MAX_KEY_TYPE_SIZE]; if(TypeEnumToString(szBuffer, t_pWMIClass->eKeyType)) { t_vt = szBuffer; t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_KeyType, t_vt, NULL); } t_metabase.CloseKey(t_hKey); } catch(...) { t_metabase.CloseKey(t_hKey); throw; } } ///////////////////////////////////////////////////////////////////////////// // // CUtils::EnumObjectAsync // // Synopsis: // // ///////////////////////////////////////////////////////////////////////////// void CUtils::EnumObjectAsync( BSTR a_ClassName, CWbemServices* m_pNamespace, IWbemObjectSink FAR* a_pHandler ) { WMI_CLASS* t_pClass; WMI_ASSOCIATION* t_pAssociation = NULL; ParsedObjectPath t_ParsedObject; //deconstructer frees memory CObjectPathParser t_PathParser(e_ParserAcceptRelativeNamespace); if (GetAssociation(a_ClassName,&t_pAssociation)) { CEnum EnumAssociation; EnumAssociation.Init( a_pHandler, m_pNamespace, &t_ParsedObject, t_pAssociation->pcRight->pszMetabaseKey, t_pAssociation ); EnumAssociation.Recurse( NULL, IIsComputer, NULL, t_pAssociation->pcRight->pszKeyName, t_pAssociation->pcRight->eKeyType ); } else if (GetClass(a_ClassName,&t_pClass)) { if (!t_ParsedObject.SetClassName(t_pClass->pszClassName)) throw WBEM_E_FAILED; CEnum EnumObject; EnumObject.Init( a_pHandler, m_pNamespace, &t_ParsedObject, t_pClass->pszMetabaseKey, NULL ); EnumObject.Recurse( NULL, NO_TYPE, NULL, t_pClass->pszKeyName, t_pClass->eKeyType ); } else throw WBEM_E_INVALID_CLASS; } bool CUtils::TypeStringToEnum( enum_KEY_TYPE& a_eType, LPCWSTR a_szTypeString ) { if(!lstrcmpiW(a_szTypeString, L"IIsWebVirtualDir")) a_eType = IIsWebVirtualDir; else if(!lstrcmpiW(a_szTypeString, L"IIsWebDirectory")) a_eType = IIsWebDirectory; else if(!lstrcmpiW(a_szTypeString, L"IIsWebFile")) a_eType = IIsWebFile; else if(!lstrcmpiW(a_szTypeString, L"IIsWebServer")) a_eType = IIsWebServer; else if(!lstrcmpiW(a_szTypeString, L"IIsWebService")) a_eType = IIsWebService; else if(!lstrcmpiW(a_szTypeString, L"IIsFtpVirtualDir")) a_eType = IIsFtpVirtualDir; else if(!lstrcmpiW(a_szTypeString, L"IIsFtpServer")) a_eType = IIsFtpServer; else if(!lstrcmpiW(a_szTypeString, L"IIsFtpService")) a_eType = IIsFtpService; else if(!lstrcmpiW(a_szTypeString, L"IIsFilters")) a_eType = IIsFilters; else if(!lstrcmpiW(a_szTypeString, L"IIsFilter")) a_eType = IIsFilter; else if(!lstrcmpiW(a_szTypeString, L"IIsWebInfo")) a_eType = IIsWebInfo; else if(!lstrcmpiW(a_szTypeString, L"IIsFtpInfo")) a_eType = IIsFtpInfo; else if(!lstrcmpiW(a_szTypeString, L"IIsCertMapper")) a_eType = IIsCertMapper; else if(!lstrcmpiW(a_szTypeString, L"IIsComputer")) a_eType = IIsComputer; else if(!lstrcmpiW(a_szTypeString, L"IIsMimeMap")) a_eType = IIsMimeMap; else if(!lstrcmpiW(a_szTypeString, L"IIsLogModules")) a_eType = IIsLogModules; else if(!lstrcmpiW(a_szTypeString, L"IIsLogModule")) a_eType = IIsLogModule; else if(!lstrcmpiW(a_szTypeString, L"IIsCompressionSchemes")) a_eType = IIsCompressionSchemes; else if(!lstrcmpiW(a_szTypeString, L"IIsCompressionScheme")) a_eType = IIsCompressionScheme; else return false; return true; } bool CUtils::TypeEnumToString( LPWSTR a_szTypeString, enum_KEY_TYPE a_eType ) { bool bRet = true; switch(a_eType) { case IIsComputer: lstrcpyW(a_szTypeString, L"IIsComputer"); break; case IIsMimeMap: lstrcpyW(a_szTypeString, L"IIsMimeMap"); break; case IIsLogModules: lstrcpyW(a_szTypeString, L"IIsLogModules"); break; case IIsLogModule: lstrcpyW(a_szTypeString, L"IIsLogModule"); break; case IIsFtpService: lstrcpyW(a_szTypeString, L"IIsFtpService"); break; case IIsFtpInfo: lstrcpyW(a_szTypeString, L"IIsFtpInfo"); break; case IIsFtpServer: lstrcpyW(a_szTypeString, L"IIsFtpServer"); break; case IIsFtpVirtualDir: lstrcpyW(a_szTypeString, L"IIsFtpVirtualDir"); break; case IIsWebService: lstrcpyW(a_szTypeString, L"IIsWebService"); break; case IIsWebInfo: lstrcpyW(a_szTypeString, L"IIsWebInfo"); break; case IIsFilters: lstrcpyW(a_szTypeString, L"IIsFilters"); break; case IIsFilter: lstrcpyW(a_szTypeString, L"IIsFilter"); break; case IIsWebServer: lstrcpyW(a_szTypeString, L"IIsWebServer"); break; case IIsCertMapper: lstrcpyW(a_szTypeString, L"IIsCertMapper"); break; case IIsWebVirtualDir: lstrcpyW(a_szTypeString, L"IIsWebVirtualDir"); break; case IIsWebDirectory: lstrcpyW(a_szTypeString, L"IIsWebDirectory"); break; case IIsWebFile: lstrcpyW(a_szTypeString, L"IIsWebFile"); break; case IIsCompressionSchemes: lstrcpyW(a_szTypeString, L"IIsCompressionSchemes"); break; case IIsCompressionScheme: lstrcpyW(a_szTypeString, L"IIsCompressionScheme"); break; default: bRet = false; break; } return bRet; } void CUtils::ExecWebAppMethod( LPCWSTR a_szMbPath, LPCWSTR a_szClassName, LPCWSTR a_szMethodName, IWbemContext* a_pCtx, IWbemClassObject* a_pInParams, IWbemObjectSink* a_pHandler, CWbemServices* a_pNameSpace ) { HRESULT hr; _variant_t t_vt; CWebAppMethod obj; if(!lstrcmpiW(a_szMethodName, L"AppCreate")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"InProcFlag", 0, &t_vt, NULL, NULL); hr = obj.AppCreate(a_szMbPath, t_vt); } else if(!lstrcmpiW(a_szMethodName, L"AppCreate2")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"AppMode", 0, &t_vt, NULL, NULL); hr = obj.AppCreate2(a_szMbPath, t_vt); } else if(!lstrcmpiW(a_szMethodName, L"AppDelete")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"Recursive", 0, &t_vt, NULL, NULL); hr = obj.AppDelete(a_szMbPath, t_vt); } else if(!lstrcmpiW(a_szMethodName, L"AppDisable")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"Recursive", 0, &t_vt, NULL, NULL); hr = obj.AppDisable(a_szMbPath, t_vt); } else if(!lstrcmpiW(a_szMethodName, L"AppEnable")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"Recursive", 0, &t_vt, NULL, NULL); hr = obj.AppEnable(a_szMbPath, t_vt); } else if(!lstrcmpiW(a_szMethodName, L"AppUnLoad")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"Recursive", 0, &t_vt, NULL, NULL); hr = obj.AppUnLoad(a_szMbPath, t_vt); } else if(!lstrcmpiW(a_szMethodName, L"AppGetStatus")) { // call method - AppGetStatus DWORD dwStatus; hr = obj.AppGetStatus(a_szMbPath, &dwStatus); THROW_ON_ERROR(hr); IWbemClassObject* pClass = NULL; IWbemClassObject* pMethodClass = NULL; IWbemClassObject* pOutParams = NULL; hr = a_pNameSpace->GetObject(_bstr_t(a_szClassName), 0, a_pCtx, &pClass, NULL); THROW_ON_ERROR(hr); // This method returns values, and so create an instance of the // output argument class. hr = pClass->GetMethod(a_szMethodName, 0, NULL, &pMethodClass); pClass->Release(); THROW_ON_ERROR(hr); hr = pMethodClass->SpawnInstance(0, &pOutParams); pMethodClass->Release(); THROW_ON_ERROR(hr); // put it into the output object t_vt.vt = VT_I4; t_vt.lVal = dwStatus; hr = pOutParams->Put(L"ReturnValue", 0, &t_vt, 0); THROW_ON_ERROR(hr); // Send the output object back to the client via the sink. Then // release the pointers and free the strings. hr = a_pHandler->Indicate(1, &pOutParams); pOutParams->Release(); } else if(!lstrcmpiW(a_szMethodName, L"AspAppRestart")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; hr = obj.AspAppRestart(a_szMbPath); } else hr = WBEM_E_NOT_SUPPORTED; THROW_ON_ERROR(hr); } void CUtils::ExecFtpServiceMethod( LPCWSTR a_szMbPath, LPCWSTR a_szClassName, LPCWSTR a_szMethodName, IWbemContext* a_pCtx, IWbemClassObject* a_pInParams, IWbemObjectSink* a_pHandler, CWbemServices* a_pNameSpace ) { HRESULT hr = ERROR_SUCCESS; _variant_t t_vt1, t_vt2, t_vt3, t_vt4; CMetabase t_metabase; METADATA_HANDLE t_hKey; if(!lstrcmpiW(a_szMethodName, L"CreateNewServer")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; // synchronize s_synObject.Enter(); try { // get in params a_pInParams->Get(L"ServerComment", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"ServerBindings", 0, &t_vt3, NULL, NULL); a_pInParams->Get(L"PathOfRootVitualDir", 0, &t_vt4, NULL, NULL); _bstr_t t_bstrServicePath = a_szMbPath; _bstr_t t_bstrServerPath = t_bstrServicePath; // check the optional [in] parameter "ServerNumber" a_pInParams->Get(L"ServerNumber", 0, &t_vt1, NULL, NULL); if( t_vt1.vt == VT_BSTR ) { t_bstrServerPath += L"/"; t_bstrServerPath += t_vt1.bstrVal; // check if the server path is not existed if(t_metabase.CheckKey(t_bstrServerPath)) throw WBEM_E_INVALID_PARAMETER; } else // if no server is specified { // find an unique server name(number) and create it FindUniqueServerName(t_bstrServicePath, t_bstrServerPath); } // create new server _bstr_t t_bstrKeyPath = t_bstrServerPath; t_hKey = t_metabase.CreateKey(t_bstrKeyPath); t_vt1 = L"IIsFtpServer"; t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_KeyType, t_vt1, NULL); t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_ServerComment, t_vt2, NULL); t_metabase.PutMultiSz(t_hKey, &METABASE_PROPERTY_DATA::s_ServerBindings, t_vt3, NULL); t_metabase.CloseKey(t_hKey); // create root of virtualdir t_bstrKeyPath += L"/"; t_bstrKeyPath += L"ROOT"; t_hKey = t_metabase.CreateKey(t_bstrKeyPath); t_vt1 = L"IIsFtpVirtualDir"; t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_KeyType, t_vt1, NULL); t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_Path, t_vt4, NULL); t_metabase.CloseKey(t_hKey); // out server name IWbemClassObject* pClass = NULL; IWbemClassObject* pMethodClass = NULL; IWbemClassObject* pOutParams = NULL; hr = a_pNameSpace->GetObject(_bstr_t(a_szClassName), 0, a_pCtx, &pClass, NULL); THROW_ON_ERROR(hr); // This method returns values, and so create an instance of the // output argument class. hr = pClass->GetMethod(a_szMethodName, 0, NULL, &pMethodClass); pClass->Release(); THROW_ON_ERROR(hr); hr = pMethodClass->SpawnInstance(0, &pOutParams); pMethodClass->Release(); THROW_ON_ERROR(hr); // find root key of server and make server name WCHAR szServerName[METADATA_MAX_NAME_LEN]; lstrcpy(szServerName, t_bstrServerPath); WMI_CLASS* t_pWMIClass = NULL; _bstr_t t_bstrRootKey = L"/LM"; _bstr_t t_bstrServerName = L"IIs_FtpServer.Name = \""; if(GetClass(L"IIs_FtpServer",&t_pWMIClass)) { t_bstrRootKey = t_pWMIClass->pszMetabaseKey; t_bstrServerName = t_pWMIClass->pszClassName; t_bstrServerName += L"."; t_bstrServerName += t_pWMIClass->pszKeyName; t_bstrServerName += L" = \""; } t_bstrServerName += szServerName + t_bstrRootKey.length() + 1; // remove root key from server path t_bstrServerName += L"\""; // put it into the output object // out "Server name" t_vt1 = t_bstrServerName; hr = pOutParams->Put(L"ReturnValue", 0, &t_vt1, 0); THROW_ON_ERROR(hr); // Send the output object back to the client via the sink. Then // release the pointers and free the strings. hr = a_pHandler->Indicate(1, &pOutParams); pOutParams->Release(); } catch(...) { hr = WBEM_E_FAILED; } // synchronize: release s_synObject.Leave(); } else hr = WBEM_E_NOT_SUPPORTED; THROW_ON_ERROR(hr); } void CUtils::ExecWebServiceMethod( LPCWSTR a_szMbPath, LPCWSTR a_szClassName, LPCWSTR a_szMethodName, IWbemContext* a_pCtx, IWbemClassObject* a_pInParams, IWbemObjectSink* a_pHandler, CWbemServices* a_pNameSpace ) { HRESULT hr = ERROR_SUCCESS; _variant_t t_vt1, t_vt2, t_vt3, t_vt4; CMetabase t_metabase; METADATA_HANDLE t_hKey; if(!lstrcmpiW(a_szMethodName, L"CreateNewServer")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; // synchronize s_synObject.Enter(); try { // get in params a_pInParams->Get(L"ServerComment", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"ServerBindings", 0, &t_vt3, NULL, NULL); a_pInParams->Get(L"PathOfRootVitualDir", 0, &t_vt4, NULL, NULL); _bstr_t t_bstrServicePath = a_szMbPath; _bstr_t t_bstrServerPath = t_bstrServicePath; // check the optional [in] parameter "ServerNumber" a_pInParams->Get(L"ServerNumber", 0, &t_vt1, NULL, NULL); if( t_vt1.vt == VT_BSTR ) { t_bstrServerPath += L"/"; t_bstrServerPath += t_vt1.bstrVal; // check if the server path is not existed if(t_metabase.CheckKey(t_bstrServerPath)) throw WBEM_E_INVALID_PARAMETER; } else // if no server is specified { // find an unique server name(number) and create it FindUniqueServerName(t_bstrServicePath, t_bstrServerPath); } // create new server _bstr_t t_bstrKeyPath = t_bstrServerPath; t_hKey = t_metabase.CreateKey(t_bstrKeyPath); t_vt1 = L"IIsWebServer"; t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_KeyType, t_vt1, NULL); t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_ServerComment, t_vt2, NULL); t_metabase.PutMultiSz(t_hKey, &METABASE_PROPERTY_DATA::s_ServerBindings, t_vt3, NULL); t_metabase.CloseKey(t_hKey); // create root of virtualdir t_bstrKeyPath += L"/"; t_bstrKeyPath += L"ROOT"; t_hKey = t_metabase.CreateKey(t_bstrKeyPath); t_vt1 = L"IIsWebVirtualDir"; t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_KeyType, t_vt1, NULL); t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_Path, t_vt4, NULL); t_vt1 = t_bstrKeyPath; t_metabase.PutString(t_hKey, &METABASE_PROPERTY_DATA::s_AppRoot, t_vt1, NULL); t_metabase.CloseKey(t_hKey); // out server name IWbemClassObject* pClass = NULL; IWbemClassObject* pMethodClass = NULL; IWbemClassObject* pOutParams = NULL; hr = a_pNameSpace->GetObject(_bstr_t(a_szClassName), 0, a_pCtx, &pClass, NULL); THROW_ON_ERROR(hr); // This method returns values, and so create an instance of the // output argument class. hr = pClass->GetMethod(a_szMethodName, 0, NULL, &pMethodClass); pClass->Release(); THROW_ON_ERROR(hr); hr = pMethodClass->SpawnInstance(0, &pOutParams); pMethodClass->Release(); THROW_ON_ERROR(hr); // find root key of server and make server name WCHAR szServerName[METADATA_MAX_NAME_LEN]; lstrcpy(szServerName, t_bstrServerPath); WMI_CLASS* t_pWMIClass = NULL; _bstr_t t_bstrRootKey = L"/LM"; _bstr_t t_bstrServerName = L"IIs_WebServer.Name = \""; if(GetClass(L"IIs_WebServer",&t_pWMIClass)) { t_bstrRootKey = t_pWMIClass->pszMetabaseKey; t_bstrServerName = t_pWMIClass->pszClassName; t_bstrServerName += L"."; t_bstrServerName += t_pWMIClass->pszKeyName; t_bstrServerName += L" = \""; } t_bstrServerName += szServerName + t_bstrRootKey.length() + 1; // remove root key from server path t_bstrServerName += L"\""; // put it into the output object // out "Server name" t_vt1 = t_bstrServerName; hr = pOutParams->Put(L"ReturnValue", 0, &t_vt1, 0); THROW_ON_ERROR(hr); // Send the output object back to the client via the sink. Then // release the pointers and free the strings. hr = a_pHandler->Indicate(1, &pOutParams); pOutParams->Release(); } catch(...) { hr = WBEM_E_FAILED; } // synchronize: release s_synObject.Leave(); } else hr = WBEM_E_NOT_SUPPORTED; THROW_ON_ERROR(hr); } void CUtils::ExecComputerMethod( LPCWSTR a_szMbPath, LPCWSTR a_szClassName, LPCWSTR a_szMethodName, IWbemContext* a_pCtx, IWbemClassObject* a_pInParams, IWbemObjectSink* a_pHandler, CWbemServices* a_pNameSpace ) { HRESULT hr; _variant_t t_vt1, t_vt2, t_vt3, t_vt4; CMetabase obj; if(!lstrcmpiW(a_szMethodName, L"EnumBackups")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; // get in params a_pInParams->Get(L"BackupLocation", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"IndexIn", 0, &t_vt2, NULL, NULL); // make in/out params WCHAR BackupLocation[MD_BACKUP_MAX_LEN]; lstrcpyW(BackupLocation, _bstr_t(t_vt1)); // define out params DWORD BackupVersionOut; FILETIME BackupDateTimeOut; // call method - EnumBackups. hr = obj.EnumBackups(BackupLocation, &BackupVersionOut, &BackupDateTimeOut, t_vt2.lVal); THROW_ON_ERROR(hr); IWbemClassObject* pClass = NULL; IWbemClassObject* pMethodClass = NULL; IWbemClassObject* pOutParams = NULL; hr = a_pNameSpace->GetObject(_bstr_t(a_szClassName), 0, a_pCtx, &pClass, NULL); THROW_ON_ERROR(hr); // This method returns values, and so create an instance of the // output argument class. hr = pClass->GetMethod(a_szMethodName, 0, NULL, &pMethodClass); pClass->Release(); THROW_ON_ERROR(hr); hr = pMethodClass->SpawnInstance(0, &pOutParams); pMethodClass->Release(); THROW_ON_ERROR(hr); // put it into the output object // out BackupLocation t_vt1 = BackupLocation; hr = pOutParams->Put(L"BackupLocation", 0, &t_vt1, 0); THROW_ON_ERROR(hr); // out BackupVersionOut t_vt1.vt = VT_I4; t_vt1.lVal = BackupVersionOut; hr = pOutParams->Put(L"BackupVersionOut", 0, &t_vt1, 0); THROW_ON_ERROR(hr); // out BackupDateTimeOut (UTC time) SYSTEMTIME systime; FileTimeToSystemTime(&BackupDateTimeOut, &systime); WCHAR datetime[30]; swprintf( datetime, L"%04d%02d%02d%02d%02d%02d.%06d+000", systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, systime.wMilliseconds ); t_vt1 = datetime; hr = pOutParams->Put(L"BackupDateTimeOut", 0, &t_vt1, 0); THROW_ON_ERROR(hr); // Send the output object back to the client via the sink. Then // release the pointers and free the strings. hr = a_pHandler->Indicate(1, &pOutParams); pOutParams->Release(); } else if(!lstrcmpiW(a_szMethodName, L"Backup")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"BackupLocation", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"BackupVersion", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"BackupFlags", 0, &t_vt3, NULL, NULL); hr = obj.Backup(_bstr_t(t_vt1), t_vt2.lVal, t_vt3.lVal); } else if(!lstrcmpiW(a_szMethodName, L"DeleteBackup")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"BackupLocation", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"BackupVersion", 0, &t_vt2, NULL, NULL); hr = obj.DeleteBackup(_bstr_t(t_vt1), t_vt2.lVal); } else if(!lstrcmpiW(a_szMethodName, L"Restore")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"BackupLocation", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"BackupVersion", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"BackupFlags", 0, &t_vt3, NULL, NULL); hr = obj.Restore(_bstr_t(t_vt1), t_vt2.lVal, t_vt3.lVal); } else hr = WBEM_E_NOT_SUPPORTED; THROW_ON_ERROR(hr); } void CUtils::ExecCertMapperMethod( LPCWSTR a_szMbPath, LPCWSTR a_szClassName, LPCWSTR a_szMethodName, IWbemContext* a_pCtx, IWbemClassObject* a_pInParams, IWbemObjectSink* a_pHandler, CWbemServices* a_pNameSpace ) { HRESULT hr; _variant_t t_vt1, t_vt2, t_vt3=L"1", t_vt4=L"1", t_vt5=L"1", t_vt6=L"1", t_vt7=L"1"; CCertMapperMethod obj(a_szMbPath); if(!lstrcmpiW(a_szMethodName, L"CreateMapping")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"vCert", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"NtAcct", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"NtPwd", 0, &t_vt3, NULL, NULL); a_pInParams->Get(L"strName", 0, &t_vt4, NULL, NULL); a_pInParams->Get(L"IEnabled", 0, &t_vt5, NULL, NULL); // call method - CreateMapping. hr = obj.CreateMapping(t_vt1, t_vt2.bstrVal, t_vt3.bstrVal, t_vt4.bstrVal, t_vt5); } else if(!lstrcmpiW(a_szMethodName, L"DeleteMapping")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"IMethod", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"vKey", 0, &t_vt2, NULL, NULL); // call method - DeleteMapping. hr = obj.DeleteMapping(t_vt1, t_vt2); } else if(!lstrcmpiW(a_szMethodName, L"GetMapping")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; // get in params a_pInParams->Get(L"IMethod", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"vKey", 0, &t_vt2, NULL, NULL); // call method - GetMapping. hr = obj.GetMapping( t_vt1, t_vt2, &t_vt3, &t_vt4, &t_vt5, &t_vt6, &t_vt7 ); THROW_ON_ERROR(hr); IWbemClassObject* pClass = NULL; IWbemClassObject* pMethodClass = NULL; IWbemClassObject* pOutParams = NULL; hr = a_pNameSpace->GetObject(_bstr_t(a_szClassName), 0, a_pCtx, &pClass, NULL); THROW_ON_ERROR(hr); // This method returns values, and so create an instance of the // output argument class. hr = pClass->GetMethod(a_szMethodName, 0, NULL, &pMethodClass); pClass->Release(); THROW_ON_ERROR(hr); hr = pMethodClass->SpawnInstance(0, &pOutParams); pMethodClass->Release(); THROW_ON_ERROR(hr); // put them into the output object hr = pOutParams->Put(L"vCert", 0, &t_vt3, 0); THROW_ON_ERROR(hr); hr = pOutParams->Put(L"NtAcct", 0, &t_vt4, 0); THROW_ON_ERROR(hr); hr = pOutParams->Put(L"NtPwd", 0, &t_vt5, 0); THROW_ON_ERROR(hr); hr = pOutParams->Put(L"strName", 0, &t_vt6, 0); THROW_ON_ERROR(hr); hr = pOutParams->Put(L"IEnabled", 0, &t_vt7, 0); THROW_ON_ERROR(hr); // Send the output object back to the client via the sink. Then // release the pointers and free the strings. hr = a_pHandler->Indicate(1, &pOutParams); pOutParams->Release(); } else if(!lstrcmpiW(a_szMethodName, L"SetAcct")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"IMethod", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"vKey", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"NtAcct", 0, &t_vt3, NULL, NULL); // call method - SetAcct. hr = obj.SetAcct(t_vt1, t_vt2, t_vt3.bstrVal); } else if(!lstrcmpiW(a_szMethodName, L"SetEnabled")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"IMethod", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"vKey", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"IEnabled", 0, &t_vt3, NULL, NULL); // call method - SetEnabled. hr = obj.SetEnabled(t_vt1, t_vt2, t_vt3); } else if(!lstrcmpiW(a_szMethodName, L"SetName")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"IMethod", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"vKey", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"strName", 0, &t_vt3, NULL, NULL); // call method - SetName. hr = obj.SetName(t_vt1, t_vt2, t_vt3.bstrVal); } else if(!lstrcmpiW(a_szMethodName, L"SetPwd")) { if(a_pInParams == NULL) throw WBEM_E_INVALID_PARAMETER; a_pInParams->Get(L"IMethod", 0, &t_vt1, NULL, NULL); a_pInParams->Get(L"vKey", 0, &t_vt2, NULL, NULL); a_pInParams->Get(L"NtPwd", 0, &t_vt3, NULL, NULL); // call method - SetPwd. hr = obj.SetPwd(t_vt1, t_vt2, t_vt3.bstrVal); } else hr = WBEM_E_NOT_SUPPORTED; THROW_ON_ERROR(hr); } void CUtils::FindUniqueServerName( LPCWSTR a_szMbPath, _bstr_t& a_bstrServerPath ) { CMetabase t_metabase; WCHAR t_szServerNumber[15]; _bstr_t t_bstrKeyPath; DWORD dwServerNumber = 0; do { dwServerNumber++; _ltow(dwServerNumber, t_szServerNumber, 10); // create server key t_bstrKeyPath = a_szMbPath; t_bstrKeyPath += L"/"; t_bstrKeyPath += t_szServerNumber; // check if the server is not existed if(!t_metabase.CheckKey(t_bstrKeyPath)) break; }while( 1 ); a_bstrServerPath = t_bstrKeyPath; } void CUtils::Throw_Exception( HRESULT a_hr, METABASE_PROPERTY* a_pmbp ) { CIIsProvException t_e; t_e.m_hr = a_hr; t_e.m_psz = a_pmbp->pszPropName; throw(t_e); }