//--------------------------------------------------------------------------- // GrpUpdt.cpp // // Comment: This is a COM object extension for the MCS DCTAccountReplicator. // This object implements the IExtendAccountMigration interface. // The Process method adds the migrated account to the specified // group on source and target domain. The Undo function removes these // from the specified group. // // (c) Copyright 1995-1998, Mission Critical Software, Inc., All Rights Reserved // // Proprietary and confidential to Mission Critical Software, Inc. //--------------------------------------------------------------------------- #include "stdafx.h" #include #include "AddToGrp.h" #include "ARExt.h" #include "ARExt_i.c" #include "GrpUpdt.h" #include "ResStr.h" #include "ErrDCT.hpp" #include "EALen.hpp" //#import "\bin\mcsvarsetmin.tlb" no_namespace #import "VarSet.tlb" no_namespace rename("property", "aproperty") StringLoader gString; ///////////////////////////////////////////////////////////////////////////// // CGroupUpdate //--------------------------------------------------------------------------- // Get and set methods for the properties. //--------------------------------------------------------------------------- STDMETHODIMP CGroupUpdate::get_sName(BSTR *pVal) { *pVal = m_sName; return S_OK; } STDMETHODIMP CGroupUpdate::put_sName(BSTR newVal) { m_sName = newVal; return S_OK; } STDMETHODIMP CGroupUpdate::get_sDesc(BSTR *pVal) { *pVal = m_sDesc; return S_OK; } STDMETHODIMP CGroupUpdate::put_sDesc(BSTR newVal) { m_sDesc = newVal; return S_OK; } //--------------------------------------------------------------------------- // PreProcessObject : This method doesn't do anything at this point //--------------------------------------------------------------------------- STDMETHODIMP CGroupUpdate::PreProcessObject( IUnknown *pSource, //in- Pointer to the source AD object IUnknown *pTarget, //in- Pointer to the target AD object IUnknown *pMainSettings, //in- Varset filled with the settings supplied by user IUnknown **ppPropsToSet, //in,out - Varset filled with Prop-Value pairs that will be set // once all extension objects are executed. EAMAccountStats* pStats ) { return S_OK; } //--------------------------------------------------------------------------- // ProcessObject : This method adds the copied account to the specified // groups on source and target domains. //--------------------------------------------------------------------------- STDMETHODIMP CGroupUpdate::ProcessObject( IUnknown *pSource, //in- Pointer to the source AD object IUnknown *pTarget, //in- Pointer to the target AD object IUnknown *pMainSettings, //in- Varset filled with the settings supplied by user IUnknown **ppPropsToSet, //in,out - Varset filled with Prop-Value pairs that will be set // once all extension objects are executed. EAMAccountStats* pStats ) { IVarSetPtr pVs = pMainSettings; _variant_t var; _bstr_t sGrpName, sServer, sAcct; HRESULT hr = S_OK; long rc = 0; TErrorDct err; WCHAR fileName[LEN_Path]; // Get the Error log filename from the Varset var = pVs->get(GET_BSTR(DCTVS_Options_Logfile)); wcscpy(fileName, (WCHAR*)V_BSTR(&var)); // Open the error log err.LogOpen(fileName, 1); // Process adding users to the source domain. var = pVs->get(GET_BSTR(DCTVS_AccountOptions_AddToGroupOnSourceDomain)); if ( var.vt == VT_BSTR ) { sGrpName = V_BSTR(&var); if ( sGrpName.length() > 0 ) { var = pVs->get(GET_BSTR(DCTVS_Options_SourceServer)); sServer = V_BSTR(&var); var = pVs->get(GET_BSTR(DCTVS_CopiedAccount_SourceSam)); sAcct = V_BSTR(&var); rc = NetGroupAddUser((WCHAR*) sServer, (WCHAR *) sGrpName, (WCHAR *) sAcct); if ( rc != 0 ) { hr = HRESULT_FROM_WIN32(rc); if (pStats != NULL) pStats->warnings.users++; err.SysMsgWrite(ErrW, rc, DCT_MSG_ADDTO_FAILED_SSD, sAcct, sGrpName, rc); } else { err.MsgWrite(0,DCT_MSG_ADDED_TO_GROUP_SS,sAcct,sGrpName); } } } // Now process the group on the target domain. var = pVs->get(GET_BSTR(DCTVS_AccountOptions_AddToGroup)); if ( var.vt == VT_BSTR ) { sGrpName = V_BSTR(&var); if ( sGrpName.length() > 0 ) { var = pVs->get(GET_BSTR(DCTVS_Options_TargetServer)); sServer = V_BSTR(&var); var = pVs->get(GET_BSTR(DCTVS_CopiedAccount_TargetSam)); sAcct = V_BSTR(&var); rc = NetGroupAddUser((WCHAR*) sServer, (WCHAR *) sGrpName, (WCHAR *) sAcct); if ( rc != 0 ) { hr = HRESULT_FROM_WIN32(rc); if (pStats != NULL) pStats->warnings.users++; err.SysMsgWrite(ErrW, rc, DCT_MSG_ADDTO_FAILED_SSD, sAcct, sGrpName, rc); } else { err.MsgWrite(0,DCT_MSG_ADDED_TO_GROUP_SS,sAcct,sGrpName); } } } err.LogClose(); return hr; } //--------------------------------------------------------------------------- // ProcessUndo : This method removes the account from the specified group. //--------------------------------------------------------------------------- STDMETHODIMP CGroupUpdate::ProcessUndo( IUnknown *pSource, //in- Pointer to the source AD object IUnknown *pTarget, //in- Pointer to the target AD object IUnknown *pMainSettings, //in- Varset filled with the settings supplied by user IUnknown **ppPropsToSet, //in,out - Varset filled with Prop-Value pairs that will be set // once all extension objects are executed. EAMAccountStats* pStats ) { IVarSetPtr pVs = pMainSettings; _variant_t var; _bstr_t sGrpName, sServer, sAcct; HRESULT hr = S_OK; long rc = 0; TErrorDct err; WCHAR fileName[LEN_Path]; // Get the Error log filename from the Varset var = pVs->get(GET_BSTR(DCTVS_Options_Logfile)); wcscpy(fileName, (WCHAR*)V_BSTR(&var)); VariantInit(&var); // Open the error log err.LogOpen(fileName, 1); // Process adding users to the source domain. var = pVs->get(GET_BSTR(DCTVS_AccountOptions_AddToGroupOnSourceDomain)); if ( var.vt == VT_BSTR ) { sGrpName = V_BSTR(&var); if ( sGrpName.length() > 0 ) { var = pVs->get(GET_BSTR(DCTVS_Options_SourceServer)); sServer = V_BSTR(&var); var = pVs->get(GET_BSTR(DCTVS_CopiedAccount_SourceSam)); sAcct = V_BSTR(&var); rc = NetGroupDelUser((WCHAR*) sServer, (WCHAR *) sGrpName, (WCHAR *) sAcct); if ( rc != 0 ) { hr = HRESULT_FROM_WIN32(rc); if (pStats != NULL) pStats->warnings.users++; err.SysMsgWrite(ErrW, rc, DCT_MSG_REMOVE_FROM_FAILED_SSD, (WCHAR *)sAcct, (WCHAR*)sGrpName, rc); } else { err.MsgWrite(0,DCT_MSG_REMOVE_FROM_GROUP_SS,(WCHAR *)sAcct,(WCHAR *)sGrpName); } } } // Now process the group on the target domain. var = pVs->get(GET_BSTR(DCTVS_AccountOptions_AddToGroup)); if ( var.vt == VT_BSTR ) { sGrpName = V_BSTR(&var); if ( sGrpName.length() > 0 ) { var = pVs->get(GET_BSTR(DCTVS_Options_TargetServer)); sServer = V_BSTR(&var); var = pVs->get(GET_BSTR(DCTVS_CopiedAccount_TargetSam)); sAcct = V_BSTR(&var); rc = NetGroupDelUser((WCHAR*) sServer, (WCHAR *) sGrpName, (WCHAR *) sAcct); if ( rc != 0 ) { hr = HRESULT_FROM_WIN32(rc); if (pStats != NULL) pStats->warnings.users++; err.SysMsgWrite(ErrW, rc, DCT_MSG_REMOVE_FROM_FAILED_SSD, (WCHAR *)sAcct, (WCHAR *)sGrpName, rc); } else { err.MsgWrite(0,DCT_MSG_REMOVE_FROM_GROUP_SS,(WCHAR *)sAcct,(WCHAR *)sGrpName); } } } err.LogClose(); return hr; }