292 lines
7.3 KiB
C++
292 lines
7.3 KiB
C++
|
#include "StdAfx.h"
|
||
|
#include "ADMTScript.h"
|
||
|
#include "FixHierarchy.h"
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Fix Objects in Hierarchy Class Implementation
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
CFixObjectsInHierarchy::CFixObjectsInHierarchy() :
|
||
|
m_bFixReplaced(false)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
CFixObjectsInHierarchy::~CFixObjectsInHierarchy()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
void CFixObjectsInHierarchy::FixObjects()
|
||
|
{
|
||
|
m_Migrated.RetrieveMigratedObjects();
|
||
|
|
||
|
int nCount = m_Migrated.GetCount();
|
||
|
|
||
|
if (nCount > 0)
|
||
|
{
|
||
|
m_TargetPath.SetContainerPaths(m_strSourceContainerPath, m_strTargetContainerPath);
|
||
|
|
||
|
for (int nIndex = 0; nIndex < nCount; nIndex++)
|
||
|
{
|
||
|
int nStatus = m_Migrated.GetObjectStatus(nIndex);
|
||
|
|
||
|
if ((nStatus & CMigrated::STATUS_CREATED) || (m_bFixReplaced && (nStatus & CMigrated::STATUS_REPLACED)))
|
||
|
{
|
||
|
_bstr_t strType = m_Migrated.GetObjectType(nIndex);
|
||
|
|
||
|
if ((strType.length() > 0) && (_tcsicmp(strType, m_strObjectType) == 0))
|
||
|
{
|
||
|
if (m_TargetPath.NeedsToMove(m_Migrated.GetObjectSourcePath(nIndex), m_Migrated.GetObjectTargetPath(nIndex)))
|
||
|
{
|
||
|
m_Containers.InsertObject(m_TargetPath.GetTargetContainerPath(), nIndex, m_TargetPath.GetTargetObjectCurrentPath());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (CContainers::iterator itContainer = m_Containers.begin(); itContainer != m_Containers.end(); itContainer++)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
CADsContainer cContainer((LPCTSTR)itContainer->first);
|
||
|
|
||
|
CObjects& ovObjects = itContainer->second;
|
||
|
|
||
|
for (CObjects::iterator itObject = ovObjects.begin(); itObject != ovObjects.end(); itObject++)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
SObject& oObject = *itObject;
|
||
|
|
||
|
CADs account(IADsPtr(cContainer.MoveHere(oObject.m_strPath, _bstr_t())));
|
||
|
|
||
|
m_Migrated.UpdateObjectTargetPath(oObject.m_nIndex, account.GetADsPath());
|
||
|
}
|
||
|
catch (_com_error& ce)
|
||
|
{
|
||
|
_Module.Log(ErrW, IDS_E_FIX_HIERARCHY_MOVE_OBJECT, (LPCTSTR)itObject->m_strPath, (LPCTSTR)itContainer->first, ce.ErrorMessage());
|
||
|
}
|
||
|
catch (...)
|
||
|
{
|
||
|
_Module.Log(ErrW, IDS_E_FIX_HIERARCHY_MOVE_OBJECT, (LPCTSTR)itObject->m_strPath, (LPCTSTR)itContainer->first, _com_error(E_FAIL).ErrorMessage());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch (_com_error& ce)
|
||
|
{
|
||
|
_Module.Log(ErrW, IDS_E_FIX_HIERARCHY_BIND_TO_CONTAINER, (LPCTSTR)itContainer->first, ce.ErrorMessage());
|
||
|
}
|
||
|
catch (...)
|
||
|
{
|
||
|
_Module.Log(ErrW, IDS_E_FIX_HIERARCHY_BIND_TO_CONTAINER, (LPCTSTR)itContainer->first, _com_error(E_FAIL).ErrorMessage());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Migrated Objects Class Implementation
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
CFixObjectsInHierarchy::CMigrated::CMigrated() :
|
||
|
m_lActionId(-1),
|
||
|
m_spDB(__uuidof(IManageDB))
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
CFixObjectsInHierarchy::CMigrated::~CMigrated()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
int CFixObjectsInHierarchy::CMigrated::GetCount()
|
||
|
{
|
||
|
return long(m_vsObjects.Get(_T("MigratedObjects")));
|
||
|
}
|
||
|
|
||
|
|
||
|
_bstr_t CFixObjectsInHierarchy::CMigrated::GetObjectKey(int nIndex)
|
||
|
{
|
||
|
_TCHAR szKey[64];
|
||
|
_stprintf(szKey, _T("MigratedObjects.%d"), nIndex);
|
||
|
return szKey;
|
||
|
}
|
||
|
|
||
|
|
||
|
_bstr_t CFixObjectsInHierarchy::CMigrated::GetObjectType(int nIndex)
|
||
|
{
|
||
|
return m_vsObjects.Get(_T("MigratedObjects.%d.Type"), nIndex);
|
||
|
}
|
||
|
|
||
|
|
||
|
int CFixObjectsInHierarchy::CMigrated::GetObjectStatus(int nIndex)
|
||
|
{
|
||
|
return long(m_vsObjects.Get(_T("MigratedObjects.%d.status"), nIndex));
|
||
|
}
|
||
|
|
||
|
|
||
|
_bstr_t CFixObjectsInHierarchy::CMigrated::GetObjectSourcePath(int nIndex)
|
||
|
{
|
||
|
return m_vsObjects.Get(_T("MigratedObjects.%d.SourceAdsPath"), nIndex);
|
||
|
}
|
||
|
|
||
|
|
||
|
_bstr_t CFixObjectsInHierarchy::CMigrated::GetObjectTargetPath(int nIndex)
|
||
|
{
|
||
|
return m_vsObjects.Get(_T("MigratedObjects.%d.TargetAdsPath"), nIndex);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CFixObjectsInHierarchy::CMigrated::RetrieveMigratedObjects(int nActionId)
|
||
|
{
|
||
|
if (nActionId > 0)
|
||
|
{
|
||
|
m_lActionId = nActionId;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_spDB->GetCurrentActionID(&m_lActionId);
|
||
|
}
|
||
|
|
||
|
IUnknownPtr spUnknown(m_vsObjects.GetInterface());
|
||
|
IUnknown* punk = spUnknown;
|
||
|
|
||
|
m_spDB->GetMigratedObjects(m_lActionId, &punk);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CFixObjectsInHierarchy::CMigrated::UpdateObjectTargetPath(int nIndex, _bstr_t strPath)
|
||
|
{
|
||
|
IVarSetPtr spVarSet(__uuidof(VarSet));
|
||
|
|
||
|
spVarSet->ImportSubTree(_bstr_t(), IVarSetPtr(m_vsObjects.GetInterface()->getReference(GetObjectKey(nIndex))));
|
||
|
spVarSet->put(_T("TargetAdsPath"), strPath);
|
||
|
|
||
|
m_spDB->SaveMigratedObject(m_lActionId, IUnknownPtr(spVarSet));
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Target Path Class Implementation
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
CFixObjectsInHierarchy::CTargetPath::CTargetPath()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
CFixObjectsInHierarchy::CTargetPath::~CTargetPath()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
void CFixObjectsInHierarchy::CTargetPath::SetContainerPaths(_bstr_t strSourceContainerPath, _bstr_t strTargetContainerPath)
|
||
|
{
|
||
|
m_pnSourceContainerPath.Set(strSourceContainerPath, ADS_SETTYPE_FULL);
|
||
|
m_pnTargetContainerPath.Set(strTargetContainerPath, ADS_SETTYPE_FULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CFixObjectsInHierarchy::CTargetPath::NeedsToMove(_bstr_t strSourceObjectPath, _bstr_t strTargetObjectPath)
|
||
|
{
|
||
|
bool bNeedsToMove = false;
|
||
|
|
||
|
// if the source object exists within the source root container hierarchy...
|
||
|
|
||
|
CADsPathName pn(strSourceObjectPath);
|
||
|
|
||
|
long lCount = pn.GetNumElements() - m_pnSourceContainerPath.GetNumElements();
|
||
|
|
||
|
while (lCount-- > 0)
|
||
|
{
|
||
|
pn.RemoveLeafElement();
|
||
|
}
|
||
|
|
||
|
if (IsMatch(pn.Retrieve(ADS_FORMAT_X500_DN), m_pnSourceContainerPath.Retrieve(ADS_FORMAT_X500_DN)))
|
||
|
{
|
||
|
m_pnTargetObjectOldPath.Set(strTargetObjectPath, ADS_SETTYPE_FULL);
|
||
|
|
||
|
// construct expected target object path
|
||
|
|
||
|
m_pnTargetObjectNewPath.Set(m_pnTargetContainerPath.Retrieve(ADS_FORMAT_X500), ADS_SETTYPE_FULL);
|
||
|
|
||
|
pn.Set(strSourceObjectPath, ADS_SETTYPE_FULL);
|
||
|
|
||
|
long lIndex = pn.GetNumElements() - m_pnSourceContainerPath.GetNumElements();
|
||
|
|
||
|
while (--lIndex >= 0)
|
||
|
{
|
||
|
m_pnTargetObjectNewPath.AddLeafElement(pn.GetElement(lIndex));
|
||
|
}
|
||
|
|
||
|
// compare expected target path with current target path
|
||
|
|
||
|
if (!IsMatch(m_pnTargetObjectNewPath.Retrieve(ADS_FORMAT_X500_DN), m_pnTargetObjectOldPath.Retrieve(ADS_FORMAT_X500_DN)))
|
||
|
{
|
||
|
m_pnTargetObjectNewPath.Set(m_pnTargetObjectOldPath.Retrieve(ADS_FORMAT_SERVER), ADS_SETTYPE_SERVER);
|
||
|
|
||
|
bNeedsToMove = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bNeedsToMove;
|
||
|
}
|
||
|
|
||
|
|
||
|
_bstr_t CFixObjectsInHierarchy::CTargetPath::GetTargetContainerPath()
|
||
|
{
|
||
|
CADsPathName pn(m_pnTargetObjectNewPath.Retrieve(ADS_FORMAT_X500));
|
||
|
|
||
|
pn.RemoveLeafElement();
|
||
|
|
||
|
return pn.Retrieve(ADS_FORMAT_X500);
|
||
|
}
|
||
|
|
||
|
|
||
|
_bstr_t CFixObjectsInHierarchy::CTargetPath::GetTargetObjectCurrentPath()
|
||
|
{
|
||
|
return m_pnTargetObjectOldPath.Retrieve(ADS_FORMAT_X500_NO_SERVER);
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CFixObjectsInHierarchy::CTargetPath::IsMatch(LPCTSTR pszA, LPCTSTR pszB)
|
||
|
{
|
||
|
bool bMatch = false;
|
||
|
|
||
|
if (pszA && pszB)
|
||
|
{
|
||
|
bMatch = (_tcsicmp(pszA, pszB) == 0) ? true : false;
|
||
|
}
|
||
|
|
||
|
return bMatch;
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Containers Class Implementation
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
void CFixObjectsInHierarchy::CContainers::InsertObject(_bstr_t strContainerPath, int nObjectIndex, _bstr_t strObjectPathOld)
|
||
|
{
|
||
|
iterator it = find(strContainerPath);
|
||
|
|
||
|
if (it == end())
|
||
|
{
|
||
|
_Pairib pair = insert(value_type(strContainerPath, CObjects()));
|
||
|
|
||
|
it = pair.first;
|
||
|
}
|
||
|
|
||
|
CObjects& ov = it->second;
|
||
|
|
||
|
ov.push_back(SObject(nObjectIndex, strObjectPathOld));
|
||
|
}
|