Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

144 lines
4.1 KiB

// 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;
}