471 lines
9.7 KiB
C++
471 lines
9.7 KiB
C++
#include "StdAfx.h"
|
|
#include "ADMTScript.h"
|
|
#include "SecurityTranslation.h"
|
|
|
|
#include "Error.h"
|
|
#include "VarSetOptions.h"
|
|
#include "VarSetAccountOptions.h"
|
|
#include "VarSetSecurity.h"
|
|
|
|
#ifndef tstring
|
|
#include <string>
|
|
typedef std::basic_string<_TCHAR> tstring;
|
|
#endif
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Security Translation Class
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
CSecurityTranslation::CSecurityTranslation() :
|
|
m_lTranslationOption(admtTranslateReplace),
|
|
m_bTranslateFilesAndFolders(false),
|
|
m_bTranslateLocalGroups(false),
|
|
m_bTranslatePrinters(false),
|
|
m_bTranslateRegistry(false),
|
|
m_bTranslateShares(false),
|
|
m_bTranslateUserProfiles(false),
|
|
m_bTranslateUserRights(false)
|
|
{
|
|
}
|
|
|
|
|
|
CSecurityTranslation::~CSecurityTranslation()
|
|
{
|
|
}
|
|
|
|
|
|
// ISecurityTranslation Implementation ----------------------------------------
|
|
|
|
|
|
// TranslationOption Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslationOption(long lOption)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (IsTranslationOptionValid(lOption))
|
|
{
|
|
m_lTranslationOption = lOption;
|
|
}
|
|
else
|
|
{
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, E_INVALIDARG, IDS_E_TRANSLATION_OPTION_INVALID);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslationOption(long* plOption)
|
|
{
|
|
*plOption = m_lTranslationOption;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslateFilesAndFolders Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslateFilesAndFolders(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslateFilesAndFolders = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslateFilesAndFolders(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslateFilesAndFolders ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslateLocalGroups Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslateLocalGroups(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslateLocalGroups = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslateLocalGroups(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslateLocalGroups ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslatePrinters Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslatePrinters(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslatePrinters = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslatePrinters(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslatePrinters ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslateRegistry Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslateRegistry(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslateRegistry = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslateRegistry(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslateRegistry ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslateShares Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslateShares(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslateShares = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslateShares(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslateShares ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslateUserProfiles Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslateUserProfiles(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslateUserProfiles = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslateUserProfiles(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslateUserProfiles ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// TranslateUserRights Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_TranslateUserRights(VARIANT_BOOL bTranslate)
|
|
{
|
|
m_bTranslateUserRights = bTranslate ? true : false;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_TranslateUserRights(VARIANT_BOOL* pbTranslate)
|
|
{
|
|
*pbTranslate = m_bTranslateUserRights ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// SidMappingFile Property
|
|
|
|
STDMETHODIMP CSecurityTranslation::put_SidMappingFile(BSTR bstrFile)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try
|
|
{
|
|
_bstr_t strFile = bstrFile;
|
|
|
|
if (strFile.length() > 0)
|
|
{
|
|
_TCHAR szPath[_MAX_PATH];
|
|
LPTSTR pszFilePart;
|
|
|
|
DWORD cchPath = GetFullPathName(strFile, _MAX_PATH, szPath, &pszFilePart);
|
|
|
|
if ((cchPath == 0) || (cchPath >= _MAX_PATH))
|
|
{
|
|
AdmtThrowError(
|
|
GUID_NULL,
|
|
GUID_NULL,
|
|
HRESULT_FROM_WIN32(GetLastError()),
|
|
IDS_E_SID_MAPPING_FILE,
|
|
(LPCTSTR)strFile
|
|
);
|
|
}
|
|
|
|
HANDLE hFile = CreateFile(
|
|
szPath,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL
|
|
);
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
AdmtThrowError(
|
|
GUID_NULL,
|
|
GUID_NULL,
|
|
HRESULT_FROM_WIN32(GetLastError()),
|
|
IDS_E_SID_MAPPING_FILE,
|
|
(LPCTSTR)strFile
|
|
);
|
|
}
|
|
|
|
CloseHandle(hFile);
|
|
|
|
m_bstrSidMappingFile = szPath;
|
|
}
|
|
else
|
|
{
|
|
m_bstrSidMappingFile = strFile;
|
|
}
|
|
}
|
|
catch (_com_error& ce)
|
|
{
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, ce);
|
|
}
|
|
catch (...)
|
|
{
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, E_FAIL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CSecurityTranslation::get_SidMappingFile(BSTR* pbstrFile)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try
|
|
{
|
|
*pbstrFile = m_bstrSidMappingFile.copy();
|
|
}
|
|
catch (_com_error& ce)
|
|
{
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, ce);
|
|
}
|
|
catch (...)
|
|
{
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, E_FAIL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// Translate Method
|
|
|
|
STDMETHODIMP CSecurityTranslation::Translate(long lOptions, VARIANT vntInclude, VARIANT vntExclude)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
MutexWait();
|
|
|
|
bool bLogOpen = _Module.OpenLog();
|
|
|
|
try
|
|
{
|
|
_Module.Log(ErrI, IDS_STARTED_SECURITY_TRANSLATION);
|
|
|
|
InitSourceDomainAndContainer(false);
|
|
InitTargetDomainAndContainer();
|
|
|
|
DoOption(lOptions, vntInclude, vntExclude);
|
|
}
|
|
catch (_com_error& ce)
|
|
{
|
|
_Module.Log(ErrE, IDS_E_CANT_TRANSLATE_SECURITY, ce);
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, ce, IDS_E_CANT_TRANSLATE_SECURITY);
|
|
}
|
|
catch (...)
|
|
{
|
|
_Module.Log(ErrE, IDS_E_CANT_TRANSLATE_SECURITY, _com_error(E_FAIL));
|
|
hr = AdmtSetError(CLSID_Migration, IID_ISecurityTranslation, E_FAIL, IDS_E_CANT_TRANSLATE_SECURITY);
|
|
}
|
|
|
|
if (bLogOpen)
|
|
{
|
|
_Module.CloseLog();
|
|
}
|
|
|
|
MutexRelease();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// Implementation -----------------------------------------------------------
|
|
|
|
|
|
// DoNames Method
|
|
|
|
void CSecurityTranslation::DoNames()
|
|
{
|
|
CDomainAccounts aComputers;
|
|
|
|
m_TargetDomain.QueryComputersAcrossDomains(GetTargetContainer(), true, m_setIncludeNames, m_setExcludeNames, aComputers);
|
|
|
|
DoComputers(aComputers);
|
|
}
|
|
|
|
|
|
// DoDomain Method
|
|
|
|
void CSecurityTranslation::DoDomain()
|
|
{
|
|
DoContainers(GetTargetContainer());
|
|
}
|
|
|
|
|
|
// DoContainers Method
|
|
|
|
void CSecurityTranslation::DoContainers(CContainer& rContainer)
|
|
{
|
|
DoComputers(rContainer);
|
|
}
|
|
|
|
|
|
// DoComputers Method
|
|
|
|
void CSecurityTranslation::DoComputers(CContainer& rContainer)
|
|
{
|
|
CDomainAccounts aComputers;
|
|
|
|
rContainer.QueryComputers(true, m_nRecurseMaintain >= 1, m_setExcludeNames, aComputers);
|
|
|
|
DoComputers(aComputers);
|
|
}
|
|
|
|
|
|
// DoComputers Method
|
|
|
|
void CSecurityTranslation::DoComputers(CDomainAccounts& rComputers)
|
|
{
|
|
if (rComputers.size() > 0)
|
|
{
|
|
CVarSet aVarSet;
|
|
|
|
SetOptions(aVarSet);
|
|
SetAccountOptions(aVarSet);
|
|
SetSecurity(aVarSet);
|
|
|
|
FillInVarSetForComputers(rComputers, false, false, false, 0, aVarSet);
|
|
|
|
rComputers.clear();
|
|
|
|
aVarSet.Put(_T("PlugIn.%ld"), 0, _T("None"));
|
|
|
|
PerformMigration(aVarSet);
|
|
|
|
SaveSettings(aVarSet);
|
|
}
|
|
}
|
|
|
|
|
|
// SetOptions Method
|
|
|
|
void CSecurityTranslation::SetOptions(CVarSet& rVarSet)
|
|
{
|
|
CVarSetOptions aOptions(rVarSet);
|
|
|
|
aOptions.SetTest(m_spInternal->TestMigration ? true : false);
|
|
aOptions.SetUndo(false);
|
|
aOptions.SetWizard(_T("security"));
|
|
aOptions.SetIntraForest(m_spInternal->IntraForest ? true : false);
|
|
|
|
// if source domain exists...
|
|
|
|
if (m_SourceDomain.Initialized())
|
|
{
|
|
// then set domain information
|
|
aOptions.SetSourceDomain(m_SourceDomain.NameFlat(), m_SourceDomain.NameDns(), m_SourceDomain.Sid());
|
|
}
|
|
else
|
|
{
|
|
// otherwise attempt to retrieve source domain information from database
|
|
|
|
_bstr_t strName = m_spInternal->SourceDomain;
|
|
|
|
// if name specified
|
|
|
|
if (strName.length())
|
|
{
|
|
IIManageDBPtr spDatabase(__uuidof(IManageDB));
|
|
|
|
IVarSetPtr spVarSet = spDatabase->GetSourceDomainInfo(strName);
|
|
|
|
// if able to retrieve source domain information...
|
|
|
|
if (spVarSet)
|
|
{
|
|
// then set domain information retrieved from database
|
|
|
|
_bstr_t strFlatName = spVarSet->get(_T("Options.SourceDomain"));
|
|
_bstr_t strDnsName = spVarSet->get(_T("Options.SourceDomainDns"));
|
|
_bstr_t strSid = spVarSet->get(_T("Options.SourceDomainSid"));
|
|
|
|
aOptions.SetSourceDomain(strFlatName, strDnsName, strSid);
|
|
}
|
|
else
|
|
{
|
|
// otherwise specify given name for flat name
|
|
// this may occur if SID mapping file is being used
|
|
aOptions.SetSourceDomain(strName, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
aOptions.SetTargetDomain(m_TargetDomain.NameFlat(), m_TargetDomain.NameDns());
|
|
}
|
|
|
|
|
|
// SetAccountOptions Method
|
|
|
|
void CSecurityTranslation::SetAccountOptions(CVarSet& rVarSet)
|
|
{
|
|
CVarSetAccountOptions aOptions(rVarSet);
|
|
|
|
aOptions.SetSecurityTranslationOptions();
|
|
aOptions.SetSecurityMapFile(m_bstrSidMappingFile);
|
|
}
|
|
|
|
|
|
// SetSecurity Method
|
|
|
|
void CSecurityTranslation::SetSecurity(CVarSet& rVarSet)
|
|
{
|
|
CVarSetSecurity aSecurity(rVarSet);
|
|
|
|
aSecurity.SetTranslationOption(m_lTranslationOption);
|
|
aSecurity.SetTranslateContainers(false);
|
|
aSecurity.SetTranslateFiles(m_bTranslateFilesAndFolders);
|
|
aSecurity.SetTranslateLocalGroups(m_bTranslateLocalGroups);
|
|
aSecurity.SetTranslatePrinters(m_bTranslatePrinters);
|
|
aSecurity.SetTranslateRegistry(m_bTranslateRegistry);
|
|
aSecurity.SetTranslateShares(m_bTranslateShares);
|
|
aSecurity.SetTranslateUserProfiles(m_bTranslateUserProfiles);
|
|
aSecurity.SetTranslateUserRights(m_bTranslateUserRights);
|
|
}
|