Leaked source code of windows server 2003
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.
 
 
 
 
 
 

239 lines
9.4 KiB

//---------------------------------------------------------------------------
// 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 <lm.h>
#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;
}