|
|
// ObjCopy.cpp: implementation of the CObjCopy class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GetPropTest.h"
#include "ObjCopy.h"
#import "../McsAdsClassProp.tlb" no_namespace
#import "C:\\bin\\mcsvarsetmin.tlb" no_namespace
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CObjCopy::CObjCopy(CString a_strContainer) : m_strCont(a_strContainer) {
}
CObjCopy::~CObjCopy() {
}
HRESULT CObjCopy::CopyObject(CString a_strSource, CString a_strSrcDomain, CString a_strTarget, CString a_strTgtDomain) { WCHAR sAdsPath[255]; WCHAR sNC[255]; HRESULT hr; IADs * pAds; IADsContainer * pCont; IDispatch * pDisp; IVarSetPtr pVarset(__uuidof(VarSet)); IObjPropBuilderPtr pObjProps(__uuidof(ObjPropBuilder)); IUnknown * pUnk; _variant_t var; _bstr_t sClassName;
// Find the naming convention for the Source domain.
wcscpy(sAdsPath, L"LDAP://"); wcscat(sAdsPath, a_strSrcDomain); wcscat(sAdsPath, L"/rootDSE"); hr = ADsGetObject(sAdsPath, IID_IADs, (void**)&pAds); if ( FAILED(hr)) return hr;
hr = pAds->Get(L"defaultNamingContext",&var); if ( SUCCEEDED( hr) ) wcscpy(sNC, var.bstrVal);
pAds->Release();
// Now build a path to your source object.
wsprintf(sAdsPath, L"LDAP://%s/%s,%s", a_strSrcDomain, a_strSource, sNC); // Get the class type of the property
hr = ADsGetObject(sAdsPath, IID_IADs, (void**)&pAds); if ( FAILED(hr) ) return hr;
// Get the name of the class for the source object so we can use that to create the new object.
WCHAR * sClass; hr = pAds->get_Name(&sClass); hr = pAds->get_Class(&sClass); pAds->Release(); if ( FAILED(hr) ) return hr;
// Now that we have the classname we can go ahead and create an object in the target domain.
// First we need to get IAdsContainer * to the domain.
wcscpy(sAdsPath, m_strCont); hr = ADsGetObject(sAdsPath, IID_IADsContainer, (void**)&pCont); if ( FAILED(hr) ) return (hr);
// Call the create method on the container.
WCHAR sTarget[255]; wcscpy(sTarget, a_strTarget); hr = pCont->Create(sClass, sTarget, &pDisp); pCont->Release(); if ( FAILED(hr) ) return hr;
// Get the IADs interface to get the path to newly created object.
hr = pDisp->QueryInterface(IID_IADs, (void**)&pAds); pDisp->Release(); if ( FAILED(hr) ) return hr;
_variant_t varT; _bstr_t strName; int d = a_strTarget.Find(','); if (d == -1) varT = a_strTarget.Mid(3); else varT = a_strTarget.Mid(3,d - 3); hr = pAds->Put(L"sAMAccountName", varT); hr = pAds->SetInfo(); WCHAR * sTgtPath; hr = pAds->get_ADsPath(&sTgtPath); if ( FAILED(hr) ) return hr;
// Get the IUnknown * to the varset to pass it around
hr = pVarset->QueryInterface(IID_IUnknown, (void**)&pUnk); if ( FAILED(hr) ) return hr;
// Now lets get a mapping of the properties between the two domains
_bstr_t sSrcDomain = a_strSrcDomain; _bstr_t sTgtDomain = a_strTgtDomain; _bstr_t sSource = a_strSource; hr = pObjProps->MapProperties(sClass, sSrcDomain, sClass, sTgtDomain, &pUnk); if ( FAILED(hr) ) return hr;
_variant_t varX; /* pVarset->Clear();
pVarset->put("telephoneNumber", varX); pVarset->put("Description", varX); pVarset->put("userPassword", varX); pVarset->put("userPrincipalName", varX); pVarset->put("userParameters", varX); pVarset->put("wbemPath", varX); pVarset->put("telephoneNumber", varX); */ // Copy the mapped properties from Source to Target object.
hr = pObjProps->CopyProperties(sSource, sSrcDomain, sTgtPath, sTgtDomain, pUnk); if ( FAILED(hr) ) return hr; pUnk->Release(); hr = pAds->SetInfo(); pAds->Release(); return S_OK; }
|