/*++ Copyright (c) 2000 Microsoft Corporation Module Name: logger.cpp (cgenericlogger.h derivation) Abstract: This file contains derived class definitions for logging RSOP security extension data to WMI. There is one class defined for each schema RSOP security extension class (see .mof file). Author: Vishnu Patankar (VishnuP) 7-April-2000 Environment: User Mode - Win32 Revision History: --*/ /////////////////////////////////////////////////////////////////////////////// // // // Includes // // // /////////////////////////////////////////////////////////////////////////////// #include "logger.h" #include "kerberos.h" #ifndef Thread #define Thread __declspec( thread ) #endif //extern void Thread *tg_pWbemServices; ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_SecuritySettingNumeric schema class ////////////////////////////////////////////////////////////////////// RSOP_SecuritySettingNumericLogger::RSOP_SecuritySettingNumericLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_SecuritySettingNumeric"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrKeyName = L"KeyName"; if (!m_xbstrKeyName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSetting = L"Setting"; if (!m_xbstrSetting) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_SecuritySettingNumericLogger::~RSOP_SecuritySettingNumericLogger() { } HRESULT RSOP_SecuritySettingNumericLogger::Log( WCHAR *wcKeyName, DWORD dwValue, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrKeyName, wcKeyName); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSetting, (int)dwValue); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_SecuritySettingBoolean schema class ////////////////////////////////////////////////////////////////////// RSOP_SecuritySettingBooleanLogger::RSOP_SecuritySettingBooleanLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_SecuritySettingBoolean"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrKeyName = L"KeyName"; if (!m_xbstrKeyName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSetting = L"Setting"; if (!m_xbstrSetting) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_SecuritySettingBooleanLogger::~RSOP_SecuritySettingBooleanLogger() { } HRESULT RSOP_SecuritySettingBooleanLogger::Log( WCHAR *wcKeyName, DWORD dwValue, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrKeyName, wcKeyName); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSetting, (BOOL)(dwValue ? TRUE : FALSE)); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_SecuritySettingString schema class ////////////////////////////////////////////////////////////////////// RSOP_SecuritySettingStringLogger::RSOP_SecuritySettingStringLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_SecuritySettingString"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrKeyName = L"KeyName"; if (!m_xbstrKeyName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSetting = L"Setting"; if (!m_xbstrSetting) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_SecuritySettingStringLogger::~RSOP_SecuritySettingStringLogger() { } HRESULT RSOP_SecuritySettingStringLogger::Log( WCHAR *wcKeyName, PWSTR pwszValue, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrKeyName, wcKeyName); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSetting, pwszValue); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_AuditPolicy schema class ////////////////////////////////////////////////////////////////////// RSOP_AuditPolicyLogger::RSOP_AuditPolicyLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_AuditPolicy"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrCategory = L"Category"; if (!m_xbstrCategory) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSuccess = L"Success"; if (!m_xbstrSuccess) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrFailure = L"Failure"; if (!m_xbstrFailure) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_AuditPolicyLogger::~RSOP_AuditPolicyLogger() { } HRESULT RSOP_AuditPolicyLogger::Log( WCHAR *wcCategory, DWORD dwValue, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrCategory, wcCategory); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSuccess, (BOOL)(dwValue & POLICY_AUDIT_EVENT_SUCCESS ? TRUE : FALSE)); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrFailure, (BOOL)(dwValue & POLICY_AUDIT_EVENT_FAILURE ? TRUE : FALSE)); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_SecurityEventLogSettingNumeric schema class ////////////////////////////////////////////////////////////////////// RSOP_SecurityEventLogSettingNumericLogger::RSOP_SecurityEventLogSettingNumericLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_SecurityEventLogSettingNumeric"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrType = L"Type"; if (!m_xbstrType) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrKeyName = L"KeyName"; if (!m_xbstrKeyName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSetting = L"Setting"; if (!m_xbstrSetting) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_SecurityEventLogSettingNumericLogger::~RSOP_SecurityEventLogSettingNumericLogger() { } HRESULT RSOP_SecurityEventLogSettingNumericLogger::Log( WCHAR *wcKeyName, PWSTR pwszType, DWORD dwValue, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrKeyName, wcKeyName); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrType, pwszType); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSetting, (int)dwValue); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_SecurityEventLogSettingBoolean schema class ////////////////////////////////////////////////////////////////////// RSOP_SecurityEventLogSettingBooleanLogger::RSOP_SecurityEventLogSettingBooleanLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_SecurityEventLogSettingBoolean"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrType = L"Type"; if (!m_xbstrType) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrKeyName = L"KeyName"; if (!m_xbstrKeyName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSetting = L"Setting"; if (!m_xbstrSetting) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_SecurityEventLogSettingBooleanLogger::~RSOP_SecurityEventLogSettingBooleanLogger() { } HRESULT RSOP_SecurityEventLogSettingBooleanLogger::Log( WCHAR *wcKeyName, PWSTR pwszType, DWORD dwValue, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrKeyName, wcKeyName); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrType, pwszType); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSetting, (BOOL)(dwValue ? TRUE : FALSE)); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_RegistryValue schema class ////////////////////////////////////////////////////////////////////// RSOP_RegistryValueLogger::RSOP_RegistryValueLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_RegistryValue"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrType = L"Type"; if (!m_xbstrType) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrPath = L"Path"; if (!m_xbstrPath) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrData = L"Data"; if (!m_xbstrData) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_RegistryValueLogger::~RSOP_RegistryValueLogger() { } HRESULT RSOP_RegistryValueLogger::Log( WCHAR *wcPath, DWORD dwType, PWSTR pwszData, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPath, wcPath); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrType, (int)dwType); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrData, pwszData); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_UserPrivilegeRight schema class ////////////////////////////////////////////////////////////////////// RSOP_UserPrivilegeRightLogger::RSOP_UserPrivilegeRightLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_UserPrivilegeRight"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrUserRight = L"UserRight"; if (!m_xbstrUserRight) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrAccountList = L"AccountList"; if (!m_xbstrAccountList) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_UserPrivilegeRightLogger::~RSOP_UserPrivilegeRightLogger() { } HRESULT RSOP_UserPrivilegeRightLogger::Log( WCHAR *wcUserRight, PSCE_NAME_LIST pList, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrUserRight, wcUserRight); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrAccountList, pList); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_RestrictedGroup schema class ////////////////////////////////////////////////////////////////////// RSOP_RestrictedGroupLogger::RSOP_RestrictedGroupLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_RestrictedGroup"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrGroupName = L"GroupName"; if (!m_xbstrGroupName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrMembers = L"Members"; if (!m_xbstrMembers) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_RestrictedGroupLogger::~RSOP_RestrictedGroupLogger() { } HRESULT RSOP_RestrictedGroupLogger::Log( WCHAR *wcGroupName, PSCE_NAME_LIST pList, DWORD dwPrecedence){ m_pHr = WBEM_S_NO_ERROR; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrGroupName, wcGroupName); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrMembers, pList); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_SystemService schema class ////////////////////////////////////////////////////////////////////// RSOP_SystemServiceLogger::RSOP_SystemServiceLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_SystemService"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrService = L"Service"; if (!m_xbstrService) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrStartupMode = L"StartupMode"; if (!m_xbstrStartupMode) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSDDLString = L"SDDLString"; if (!m_xbstrSDDLString) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_SystemServiceLogger::~RSOP_SystemServiceLogger() { } HRESULT RSOP_SystemServiceLogger::Log( WCHAR *wcService, BYTE m_byStartupMode, PSECURITY_DESCRIPTOR pSecurityDescriptor, SECURITY_INFORMATION SeInfo, DWORD dwPrecedence){ DWORD rc; PWSTR SDspec=NULL; DWORD SDsize=0; m_pHr = WBEM_S_NO_ERROR; rc = ConvertSecurityDescriptorToText( pSecurityDescriptor, SeInfo, &SDspec, &SDsize ); if (rc!= ERROR_SUCCESS) {m_pHr = ScepDosErrorToWbemError(rc); goto done;} if (m_pHr != WBEM_S_NO_ERROR) goto done; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrService, wcService); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrStartupMode, (int)m_byStartupMode); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSDDLString, SDspec); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: LocalFree(SDspec); SDspec = NULL; return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_File schema class ////////////////////////////////////////////////////////////////////// RSOP_FileLogger::RSOP_FileLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_File"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrPath = L"Path"; if (!m_xbstrPath) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrOriginalPath = L"OriginalPath"; if (!m_xbstrOriginalPath) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrMode = L"Mode"; if (!m_xbstrMode) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSDDLString = L"SDDLString"; if (!m_xbstrSDDLString) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_FileLogger::~RSOP_FileLogger() { } HRESULT RSOP_FileLogger::Log( WCHAR *wcPath, WCHAR *wcOriginalPath, BYTE m_byMode, PSECURITY_DESCRIPTOR pSecurityDescriptor, SECURITY_INFORMATION SeInfo, DWORD dwPrecedence){ DWORD rc; PWSTR SDspec=NULL; DWORD SDsize=0; m_pHr = WBEM_S_NO_ERROR; rc = ConvertSecurityDescriptorToText( pSecurityDescriptor, SeInfo, &SDspec, &SDsize ); if (rc!= ERROR_SUCCESS) {m_pHr = ScepDosErrorToWbemError(rc); goto done;} if (m_pHr != WBEM_S_NO_ERROR) goto done; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPath, wcPath); if (FAILED(m_pHr)) goto done; if (wcOriginalPath != NULL) { m_pHr = PutProperty(m_pObj, m_xbstrOriginalPath, wcOriginalPath); if (FAILED(m_pHr)) goto done; } m_pHr = PutProperty(m_pObj, m_xbstrMode, (int)m_byMode); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSDDLString, SDspec); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: LocalFree(SDspec); SDspec = NULL; return m_pHr; } ///////////////////////////////////////////////////////////////////// // Log class definition for // RSOP_RegistryKey schema class ////////////////////////////////////////////////////////////////////// RSOP_RegistryKeyLogger::RSOP_RegistryKeyLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { m_pHr = WBEM_S_NO_ERROR; m_xbstrClassName = L"RSOP_RegistryKey"; if (!m_xbstrClassName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrPath = L"Path"; if (!m_xbstrPath) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrMode = L"Mode"; if (!m_xbstrMode) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_xbstrSDDLString = L"SDDLString"; if (!m_xbstrSDDLString) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;} m_bInitialized = TRUE; done: return; } RSOP_RegistryKeyLogger::~RSOP_RegistryKeyLogger() { } HRESULT RSOP_RegistryKeyLogger::Log( WCHAR *wcPath, BYTE m_byMode, PSECURITY_DESCRIPTOR pSecurityDescriptor, SECURITY_INFORMATION SeInfo, DWORD dwPrecedence){ DWORD rc; PWSTR SDspec=NULL; DWORD SDsize=0; m_pHr = WBEM_S_NO_ERROR; rc = ConvertSecurityDescriptorToText( pSecurityDescriptor, SeInfo, &SDspec, &SDsize ); if (rc!= ERROR_SUCCESS) {m_pHr = ScepDosErrorToWbemError(rc); goto done;} if (m_pHr != WBEM_S_NO_ERROR) goto done; m_pHr = SpawnAnInstance(&m_pObj); if (FAILED(m_pHr)) goto done; m_pHr = PutGenericProperties(); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPath, wcPath); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrMode, (int)m_byMode); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrSDDLString, SDspec); if (FAILED(m_pHr)) goto done; m_pHr = PutProperty(m_pObj, m_xbstrPrecedence, (int)dwPrecedence); if (FAILED(m_pHr)) goto done; m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; done: LocalFree(SDspec); SDspec = NULL; return m_pHr; } DiagnosisStatusLogger::DiagnosisStatusLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID):CGenericLogger(pNamespace, pwszGPOName, pwszSOMID) { return; } HRESULT DiagnosisStatusLogger::LogChild( PWSTR pwszClassName, PWSTR pwszPropertyName, PWSTR pwszPropertyValueName, DWORD dwError, int iChildStatus) ///////////////////////////////////////////////////////////////////////////////////////////// // Logger method for 1-property-type child search-and-log (files/registry objects // ///////////////////////////////////////////////////////////////////////////////////////////// { if ( m_pNamespace == NULL ) return WBEM_E_CRITICAL_ERROR; if ( pwszClassName == NULL || pwszPropertyName == NULL || pwszPropertyValueName == NULL) return WBEM_E_INVALID_PARAMETER; DWORD Len = wcslen(pwszClassName) + wcslen(pwszPropertyName) + wcslen(pwszPropertyValueName) + 50; PWSTR tmp=(PWSTR)LocalAlloc(LPTR, (Len)*sizeof(WCHAR)); if ( tmp == NULL ) return WBEM_E_OUT_OF_MEMORY; swprintf(tmp, L"%s.precedence=1,%s=\"%s\"", pwszClassName, pwszPropertyName, pwszPropertyValueName); // XBStr m_xbstrQuery = tmp; BSTR m_xbstrQuery = SysAllocString(tmp); LocalFree(tmp); // XBStr m_xbstrWQL = L"WQL"; BSTR m_xbstrWQL = SysAllocString(L"WQL"); m_pHr = WBEM_NO_ERROR; m_pEnum = NULL; m_pObj = NULL; ULONG n = 0; m_pHr = m_pNamespace->GetObject( m_xbstrQuery, WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &m_pObj, NULL); // // should only get one instance for this query (since precedence = 1) // if (SUCCEEDED(m_pHr) && m_pObj) { m_pHr = PutProperty(m_pObj, m_xbstrStatus, iChildStatus); if (FAILED(m_pHr)) goto done; if (dwError != ERROR_SUCCESS) { m_pHr = PutProperty(m_pObj, m_xbstrErrorCode, (int)dwError); if (FAILED(m_pHr)) goto done; } m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; } else { m_pHr = WBEM_E_NOT_FOUND; } done: SysFreeString(m_xbstrQuery); SysFreeString(m_xbstrWQL); if (m_pObj){ m_pObj->Release(); m_pObj = NULL; } return m_pHr; } HRESULT DiagnosisStatusLogger::Log( PWSTR pwszClassName, PWSTR pwszPropertyName1, PWSTR pwszPropertyValueName1, PWSTR pwszPropertyName2, PWSTR pwszPropertyValueName2, DWORD dwError) /////////////////////////////////////////////////////////////// // Logger method for 2-property-type search-and-log // /////////////////////////////////////////////////////////////// { if ( m_pNamespace == NULL ) return WBEM_E_CRITICAL_ERROR; if ( pwszClassName == NULL || pwszPropertyName1 == NULL || pwszPropertyValueName1 == NULL || pwszPropertyName2 == NULL || pwszPropertyValueName2 == NULL ) return WBEM_E_INVALID_PARAMETER; DWORD Len = wcslen(pwszClassName) + wcslen(pwszPropertyName1) + wcslen(pwszPropertyValueName1) + wcslen(pwszPropertyName2) + wcslen(pwszPropertyValueName2) + 50; PWSTR tmp=(PWSTR)LocalAlloc(LPTR, (Len)*sizeof(WCHAR)); if ( tmp == NULL ) return WBEM_E_OUT_OF_MEMORY; swprintf(tmp, L"%s.precedence=1,%s=\"%s\",%s=\"%s\"", pwszClassName, pwszPropertyName1, pwszPropertyValueName1, pwszPropertyName2, pwszPropertyValueName2); // XBStr m_xbstrQuery = tmp; BSTR m_xbstrQuery = SysAllocString(tmp); LocalFree(tmp); // XBStr m_xbstrWQL = L"WQL"; BSTR m_xbstrWQL = SysAllocString(L"WQL"); m_pHr = WBEM_NO_ERROR; m_pEnum = NULL; m_pObj = NULL; ULONG n = 0; m_pHr = m_pNamespace->GetObject( m_xbstrQuery, WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &m_pObj, NULL); // // should only get one instance for this query (since precedence = 1) // if (SUCCEEDED(m_pHr) && m_pObj) { m_pHr = PutProperty(m_pObj, m_xbstrStatus, (dwError == ERROR_SUCCESS ? (int)1 : (int)3)); if (FAILED(m_pHr)) goto done; if (dwError != ERROR_SUCCESS) { m_pHr = PutProperty(m_pObj, m_xbstrErrorCode, (int)dwError); if (FAILED(m_pHr)) goto done; } m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; } else { m_pHr = WBEM_E_NOT_FOUND; } done: SysFreeString(m_xbstrQuery); SysFreeString(m_xbstrWQL); if (m_pObj){ m_pObj->Release(); m_pObj = NULL; } return m_pHr; } HRESULT DiagnosisStatusLogger::Log( PWSTR pwszClassName, PWSTR pwszPropertyName, PWSTR pwszPropertyValueName, DWORD dwError, BOOL Merge) ////////////////////////////////////////////////////////////////////////////////////////////////// // Logger method for 1-property-type if-not-already-error search-and-log w or w/o merge // ////////////////////////////////////////////////////////////////////////////////////////////////// { if ( m_pNamespace == NULL ) return WBEM_E_CRITICAL_ERROR; if ( pwszClassName == NULL || pwszPropertyName == NULL || pwszPropertyValueName == NULL) return WBEM_E_INVALID_PARAMETER; DWORD Len = wcslen(pwszClassName) + wcslen(pwszPropertyName) + wcslen(pwszPropertyValueName) + 50; PWSTR tmp=(PWSTR)LocalAlloc(LPTR, (Len)*sizeof(WCHAR)); if ( tmp == NULL ) return WBEM_E_OUT_OF_MEMORY; swprintf(tmp, L"%s.precedence=1,%s=\"%s\"", pwszClassName, pwszPropertyName, pwszPropertyValueName); // XBStr m_xbstrQuery = tmp; BSTR m_xbstrQuery = SysAllocString(tmp); LocalFree(tmp); // XBStr m_xbstrWQL = L"WQL"; BSTR m_xbstrWQL = SysAllocString(L"WQL"); m_pHr = WBEM_NO_ERROR; m_pEnum = NULL; m_pObj = NULL; ULONG n = 0; m_pHr = m_pNamespace->GetObject( m_xbstrQuery, WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &m_pObj, NULL); // // should only get one instance for this query (since precedence = 1) // if (SUCCEEDED(m_pHr) && m_pObj ) { if (Merge) { int iValue; m_pHr = GetProperty(m_pObj, m_xbstrStatus, &iValue); if (FAILED(m_pHr)) goto done; // // only put if (status = 0) or (status = 1 and dwError != ERROR_SUCCESS) // if ((DWORD)iValue == 0 || ((DWORD)iValue == 1 && dwError != ERROR_SUCCESS)) { m_pHr = PutProperty(m_pObj, m_xbstrStatus, (dwError == ERROR_SUCCESS ? (int)1 : (int)3)); if (FAILED(m_pHr)) goto done; if (dwError != ERROR_SUCCESS) { m_pHr = PutProperty(m_pObj, m_xbstrErrorCode, (int)dwError); if (FAILED(m_pHr)) goto done; } m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; } } else { m_pHr = PutProperty(m_pObj, m_xbstrStatus, (dwError == ERROR_SUCCESS ? (int)1 : (int)3)); if (FAILED(m_pHr)) goto done; if (dwError != ERROR_SUCCESS) { m_pHr = PutProperty(m_pObj, m_xbstrErrorCode, (int)dwError); if (FAILED(m_pHr)) goto done; } m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; } } else { m_pHr = WBEM_E_NOT_FOUND; } done: SysFreeString(m_xbstrQuery); SysFreeString(m_xbstrWQL); if (m_pObj){ m_pObj->Release(); m_pObj = NULL; } return m_pHr; } #ifdef _WIN64 HRESULT DiagnosisStatusLogger::LogRegistryKey( PWSTR pwszClassName, PWSTR pwszPropertyName, PWSTR pwszPropertyValueName, DWORD dwError, BOOL bIsChild) ////////////////////////////////////////////////////////////////////////////////////////////////// // Logger method for 1-property-type if-not-already-error search-and-log w or w/o merge // // Purpose is the same as regular ::Log() method, except that merge logic is different due to // // 64-bit and 32-bit issues // ////////////////////////////////////////////////////////////////////////////////////////////////// { if ( m_pNamespace == NULL ) return WBEM_E_CRITICAL_ERROR; if ( pwszClassName == NULL || pwszPropertyName == NULL || pwszPropertyValueName == NULL) return WBEM_E_INVALID_PARAMETER; DWORD Len = wcslen(pwszClassName) + wcslen(pwszPropertyName) + wcslen(pwszPropertyValueName) + 50; PWSTR tmp=(PWSTR)LocalAlloc(LPTR, (Len)*sizeof(WCHAR)); if ( tmp == NULL ) return WBEM_E_OUT_OF_MEMORY; swprintf(tmp, L"%s.precedence=1,%s=\"%s\"", pwszClassName, pwszPropertyName, pwszPropertyValueName); // XBStr m_xbstrQuery = tmp; BSTR m_xbstrQuery = SysAllocString(tmp); LocalFree(tmp); // XBStr m_xbstrWQL = L"WQL"; BSTR m_xbstrWQL = SysAllocString(L"WQL"); m_pHr = WBEM_NO_ERROR; m_pEnum = NULL; m_pObj = NULL; ULONG n = 0; m_pHr = m_pNamespace->GetObject( m_xbstrQuery, WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &m_pObj, NULL); // // should only get one instance for this query (since precedence = 1) // // // on a 64-bit platform, the following merging logic holds for registry keys only // get status // if status == 0 put 1 or 3 depending on dwError, also put dwError if not success // else if status == 3 or 4 (64-bit key or child failed for the same key before) // get error code // if error code == FILE_NOT_FOUND // if dwError == SUCCESS // set status = 1 and error code = SUCCESS // else if dwError != FILE_NOT_FOUND // set status = 3 and error code = dwError // else if dwError == FILE_NOT_FOUND // do nothing (leave status = 3 or 4 and error code = FILE_NOT_FOUND) // else // if dwError == FILE_NOT_FOUND or SUCCESS // leave as is // else // error code = dwError, status = 3 // else if status == 1 // if dwError == FILE_NOT_FOUND // do nothing (leave status = 1) // else if dwError != SUCCESS // set status = 3 and error code = dwError // if (SUCCEEDED(m_pHr) && m_pObj) { int iValue; int iUpdateStatus = 0; BOOL bUpdateErrorCode = FALSE; m_pHr = GetProperty(m_pObj, m_xbstrStatus, &iValue); if (FAILED(m_pHr)) goto done; if ((DWORD)iValue == 0) { iUpdateStatus = (dwError == ERROR_SUCCESS ? (int)1 : (int)3); bUpdateErrorCode = (dwError != ERROR_SUCCESS ? TRUE : FALSE); } else if ((DWORD)iValue == 3 || (DWORD)iValue == 4) { // // in this case, further decisions are based on the ErrorCode, so retrieve it // m_pHr = GetProperty(m_pObj, m_xbstrErrorCode, &iValue); if (FAILED(m_pHr)) goto done; if ((DWORD)iValue == ERROR_FILE_NOT_FOUND) { if (dwError == ERROR_SUCCESS) { iUpdateStatus = 1; bUpdateErrorCode = TRUE; } else if (dwError != ERROR_FILE_NOT_FOUND) { iUpdateStatus = 3; bUpdateErrorCode = TRUE; } } else { if (dwError != ERROR_SUCCESS && dwError != ERROR_FILE_NOT_FOUND ) { iUpdateStatus = 3; bUpdateErrorCode = TRUE; } } } else if ((DWORD)iValue == 1) { if (dwError != ERROR_SUCCESS && dwError != ERROR_FILE_NOT_FOUND) { iUpdateStatus = 3; bUpdateErrorCode = TRUE; } } if (iUpdateStatus) { iUpdateStatus = ((bIsChild && iUpdateStatus == 3) ? 4: 3); m_pHr = PutProperty(m_pObj, m_xbstrStatus, (int)iUpdateStatus); if (FAILED(m_pHr)) goto done; } if (bUpdateErrorCode) { m_pHr = PutProperty(m_pObj, m_xbstrErrorCode, (int)dwError); if (FAILED(m_pHr)) goto done; } m_pHr = PutInstAndFreeObj(); if (FAILED(m_pHr)) goto done; } else { m_pHr = WBEM_E_NOT_FOUND; } done: SysFreeString(m_xbstrQuery); SysFreeString(m_xbstrWQL); if (m_pObj){ m_pObj->Release(); m_pObj = NULL; } return m_pHr; } #endif DiagnosisStatusLogger::~DiagnosisStatusLogger(){ }