|
|
#include "StdAfx.h"
#include "Parameter.h"
#define NO_WBEM
#include "T_SafeVector.h"
namespace Parameter_cpp {
inline bool IsPrefix(_TCHAR ch) { return ((ch == _T('/')) || (ch == _T('-'))); }
inline bool IsSpacer(_TCHAR ch) { return ((ch == _T(':')) || _istspace(ch)); }
struct SNameToTask { LPCTSTR pszName; int nTask; };
SNameToTask s_TaskValues[] = { { _T("User"), TASK_USER }, { _T("Group"), TASK_GROUP }, { _T("Computer"), TASK_COMPUTER }, { _T("Security"), TASK_SECURITY }, { _T("Service"), TASK_SERVICE }, { _T("Report"), TASK_REPORT }, { _T("Key"), TASK_KEY }, { NULL, TASK_NONE }, };
struct SNameToBool { LPCTSTR pszName; bool bValue; };
SNameToBool s_BoolValues[] = { { _T("Yes"), true }, { _T("No"), false }, { _T("True"), true }, { _T("False"), false }, { NULL, false }, };
struct SNameToLong { LPCTSTR pszName; long lValue; };
SNameToLong s_RenameOptionValues[] = { { _T("Dont"), admtDoNotRename }, { _T("Prefix"), admtRenameWithPrefix }, { _T("Suffix"), admtRenameWithSuffix }, { NULL, -1L }, };
SNameToLong s_PasswordOptionValues[] = { { _T("Name"), admtPasswordFromName }, { _T("Complex"), admtComplexPassword }, { _T("Copy"), admtCopyPassword }, { NULL, -1L }, };
SNameToLong s_ConflictOptionValues[] = { { _T("Ignore"), admtIgnoreConflicting }, { _T("Replace"), admtReplaceConflicting }, { _T("Prefix"), admtRenameConflictingWithPrefix }, { _T("Suffix"), admtRenameConflictingWithSuffix }, { NULL, -1L }, };
SNameToLong s_ConflictOptionFlagValues[] = { { _T("RemoveUserRights"), admtRemoveExistingUserRights }, { _T("RemoveMembers"), admtRemoveExistingMembers }, { _T("MoveReplacedAccounts"), admtMoveReplacedAccounts }, { NULL, -1L }, };
SNameToLong s_DisableOptionValues[] = { { _T("EnableTarget"), admtEnableTarget }, { _T("DisableSource"), admtDisableSource }, { _T("DisableTarget"), admtDisableTarget }, { _T("TargetSameAsSource"), admtTargetSameAsSource }, { NULL, -1L }, };
SNameToLong s_SourceExpirationValues[] = { { _T("None"), admtNoExpiration }, { NULL, 0L }, };
SNameToLong s_TranslationOptionValues[] = { { _T("Replace"), admtTranslateReplace }, { _T("Add"), admtTranslateAdd }, { _T("Remove"), admtTranslateRemove }, { NULL, -1L }, };
SNameToLong s_ReportTypeValues[] = { { _T("MigratedAccounts"), admtReportMigratedAccounts }, { _T("MigratedComputers"), admtReportMigratedComputers }, { _T("ExpiredComputers"), admtReportExpiredComputers }, { _T("AccountReferences"), admtReportAccountReferences }, { _T("NameConflicts"), admtReportNameConflicts }, { NULL, -1L }, };
SNameToLong s_DomainOptionFlagAValues[] = { { _T("Recurse"), admtRecurse }, { NULL, -1L }, };
SNameToLong s_DomainOptionFlagBValues[] = { { _T("Flatten"), admtFlattenHierarchy }, { _T("Maintain"), admtMaintainHierarchy }, { NULL, -1L }, };
bool GetBoolValue(LPCTSTR pszArg); bool GetBoolFromName(LPCTSTR pszName, SNameToBool* pNameToBool); long GetLongValue(LPCTSTR pszArg, SNameToLong* pNameToLong); long GetLongFromName(LPCTSTR pszName, SNameToLong* pNameToLong);
// Note that the maximum password length is the maximum
// supported by the password export server installation.
#define MAX_PASSWORD_LENGTH (MAX_PATH - 1)
bool GetPasswordFromUser(LPCTSTR pszKeyId, _bstr_t& strPassword);
_bstr_t LoadStringHelper(UINT uId);
}
using namespace Parameter_cpp;
//---------------------------------------------------------------------------
// Parameter Map
//---------------------------------------------------------------------------
// Public Methods -----------------------------------------------------------
// GetValue Method
bool CParameterMap::GetValue(int nParam, bool& bValue) { bool bGet = false;
iterator it = find(nParam);
if (it != end()) { bValue = it->second;
bGet = true; }
return bGet; }
// GetValue Method
bool CParameterMap::GetValue(int nParam, long& lValue) { bool bGet = false;
iterator it = find(nParam);
if (it != end()) { lValue = it->second;
bGet = true; }
return bGet; }
// GetValue Method
bool CParameterMap::GetValue(int nParam, _bstr_t& strValue) { bool bGet = false;
iterator it = find(nParam);
if (it != end()) { strValue = it->second;
bGet = true; }
return bGet; }
// GetValues Method
bool CParameterMap::GetValues(int nParam, _variant_t& vntValues) { bool bGet = false;
iterator it = find(nParam);
if (it != end()) { vntValues = it->second;
bGet = true; }
return bGet; }
// GetValues Method
bool CParameterMap::GetValues(int nParam, StringVector& vecValues) { bool bGet = false;
iterator it = find(nParam);
if (it != end()) { vecValues = T_SafeVector2<VT_BSTR, _bstr_t, StringVector, T_Extract_bstr_t<StringVector> >(it->second);
bGet = true; }
return bGet; }
// Protected Methods --------------------------------------------------------
// Initialize Method
void CParameterMap::Initialize(CArguments& rArgs) { if (DoTask(rArgs.Value())) { long lTask;
if (GetValue(SWITCH_TASK, lTask)) { if (lTask == TASK_KEY) { DoTaskKey(rArgs); } else { DoSwitches(rArgs);
VerifyIncludeExclude(); } } }
// if (empty())
// {
// ThrowError(E_INVALIDARG, IDS_E_NO_ARGUMENTS);
// }
}
// DoTask
bool CParameterMap::DoTask(LPCTSTR pszArg) { bool bTask = false;
if (pszArg != NULL) { // first switch must specify task or help
int nSwitch = m_mapSwitchs.GetSwitch(pszArg);
if (nSwitch == SWITCH_TASK) { int nTask = TASK_NONE;
for (SNameToTask* p = s_TaskValues; p->pszName; p++) { if (_tcsicmp(p->pszName, pszArg) == 0) { nTask = p->nTask; break; } }
insert(value_type(SWITCH_TASK, _variant_t(long(nTask))));
bTask = true; } else { _TCHAR chPrefix; _TCHAR szSwitch[16];
if ((_stscanf(pszArg, _T(" %c%15s "), &chPrefix, szSwitch) == 2) && IsPrefix(chPrefix) && (m_mapSwitchs.GetSwitch(szSwitch) == SWITCH_HELP)) { insert(value_type(SWITCH_HELP, _variant_t(true))); } else { ThrowError(E_INVALIDARG, IDS_E_INVALID_FIRST_ARGUMENT, pszArg); } } } else { // ThrowError(E_INVALIDARG, IDS_E_NO_ARGUMENTS);
}
return bTask; }
// DoSwitches Method
void CParameterMap::DoSwitches(CArguments& rArgs) { LPCTSTR pszArg = NULL;
while (rArgs.Next()) { pszArg = rArgs.Value();
_TCHAR chPrefix; _TCHAR szSwitch[64]; _TCHAR chSpacer;
int nFields = _stscanf(pszArg, _T(" %c%63[A-Za-z?]%c"), &chPrefix, szSwitch, &chSpacer); if (nFields >= 2 && IsPrefix(chPrefix) && (nFields == 2 || IsSpacer(chSpacer))) { int nSwitch = m_mapSwitchs.GetSwitch(szSwitch);
if (nSwitch == -1) { ThrowError(E_INVALIDARG, IDS_E_OPTION_UNRECOGNIZED, pszArg); }
if (nSwitch == SWITCH_TASK) { ThrowError(E_INVALIDARG, IDS_E_TASK_NOT_FIRST, pszArg); }
if (nSwitch == SWITCH_HELP) { insert(value_type(SWITCH_HELP, _variant_t(true))); break; }
DoSwitch(nSwitch, rArgs); } else { ThrowError(E_INVALIDARG, IDS_E_INVALID_OPTION_FORMAT, pszArg); } }
// if no switches/options then display help
if (pszArg == NULL) { insert(value_type(SWITCH_HELP, _variant_t(true))); } }
// DoSwitch Method
void CParameterMap::DoSwitch(int nSwitch, CArguments& rArgs) { _variant_t& vntValue = Insert(nSwitch);
switch (nSwitch) { // boolean values
case SWITCH_TEST_MIGRATION: case SWITCH_INTRA_FOREST: case SWITCH_MIGRATE_SIDS: case SWITCH_TRANSLATE_ROAMING_PROFILE: case SWITCH_UPDATE_USER_RIGHTS: case SWITCH_MIGRATE_GROUPS: case SWITCH_UPDATE_PREVIOUSLY_MIGRATED_OBJECTS: case SWITCH_FIX_GROUP_MEMBERSHIP: case SWITCH_MIGRATE_SERVICE_ACCOUNTS: case SWITCH_UPDATE_GROUP_RIGHTS: case SWITCH_MIGRATE_MEMBERS: case SWITCH_TRANSLATE_FILES_AND_FOLDERS: case SWITCH_TRANSLATE_LOCAL_GROUPS: case SWITCH_TRANSLATE_PRINTERS: case SWITCH_TRANSLATE_REGISTRY: case SWITCH_TRANSLATE_SHARES: case SWITCH_TRANSLATE_USER_PROFILES: case SWITCH_TRANSLATE_USER_RIGHTS: { vntValue = GetBoolValue(rArgs.Value()); break; }
// long values
case SWITCH_RENAME_OPTION: { vntValue = GetLongValue(rArgs.Value(), s_RenameOptionValues); break; } case SWITCH_PASSWORD_OPTION: { vntValue = GetLongValue(rArgs.Value(), s_PasswordOptionValues); break; } case SWITCH_CONFLICT_OPTIONS: { _TCHAR szValueA[32]; _TCHAR szValueB[32]; _TCHAR szValueC[32]; _TCHAR szValueD[32];
int cFields = _stscanf(rArgs.Value(), _T("%*[^:]: %31[A-Za-z] + %31[A-Za-z] + %31[A-Za-z] + %31[A-Za-z]"), szValueA, szValueB, szValueC, szValueD);
if (cFields <= 0) { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID, rArgs.Value()); }
long lValue = GetLongFromName(szValueA, s_ConflictOptionValues);
if (cFields >= 2) { lValue |= GetLongFromName(szValueB, s_ConflictOptionFlagValues); }
if (cFields >= 3) { lValue |= GetLongFromName(szValueC, s_ConflictOptionFlagValues); }
if (cFields >= 4) { lValue |= GetLongFromName(szValueD, s_ConflictOptionFlagValues); }
vntValue = lValue; break; } case SWITCH_DISABLE_OPTION: { _TCHAR szValueA[32]; _TCHAR szValueB[32];
int cFields = _stscanf(rArgs.Value(), _T("%*[^:]: %31[A-Za-z] + %31[A-Za-z]"), szValueA, szValueB);
if (cFields <= 0) { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID, rArgs.Value()); }
long lValue = GetLongFromName(szValueA, s_DisableOptionValues);
if (cFields >= 2) { lValue |= GetLongFromName(szValueB, s_DisableOptionValues); }
vntValue = lValue; break; } case SWITCH_SOURCE_EXPIRATION: { long lValue; _TCHAR szValue[32];
if (_stscanf(rArgs.Value(), _T("%*[^:]: %31[A-Za-z]"), szValue) == 1) { vntValue = GetLongFromName(szValue, s_SourceExpirationValues); } else if (_stscanf(rArgs.Value(), _T("%*[^:]: %ld"), &lValue) == 1) { vntValue = lValue; } else { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID, rArgs.Value()); } break; } case SWITCH_TRANSLATION_OPTION: { vntValue = GetLongValue(rArgs.Value(), s_TranslationOptionValues); break; } case SWITCH_RESTART_DELAY: { long lValue;
if (_stscanf(rArgs.Value(), _T("%*[^:]: %ld"), &lValue) == 1) { vntValue = lValue; } else { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID, rArgs.Value()); } break; } case SWITCH_INCLUDE_DOMAIN: { _TCHAR szValueA[32]; _TCHAR szValueB[32];
int cFields = _stscanf(rArgs.Value(), _T("%*[^:]: %31[A-Za-z] + %31[A-Za-z]"), szValueA, szValueB);
if (cFields < 0) { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID, rArgs.Value()); }
long lValue = 0;
if (cFields >= 1) { lValue |= GetLongFromName(szValueA, s_DomainOptionFlagAValues); }
if (cFields >= 2) { lValue |= GetLongFromName(szValueB, s_DomainOptionFlagBValues); }
vntValue = lValue; break; } case SWITCH_REPORT_TYPE: { vntValue = GetLongValue(rArgs.Value(), s_ReportTypeValues); break; }
// string values
case SWITCH_SOURCE_DOMAIN: case SWITCH_SOURCE_OU: case SWITCH_TARGET_DOMAIN: case SWITCH_TARGET_OU: case SWITCH_RENAME_PREFIX_OR_SUFFIX: case SWITCH_PASSWORD_SERVER: case SWITCH_PASSWORD_FILE: case SWITCH_CONFLICT_PREFIX_OR_SUFFIX: case SWITCH_USER_PROPERTIES_TO_EXCLUDE: case SWITCH_INETORGPERSON_PROPERTIES_TO_EXCLUDE: case SWITCH_GROUP_PROPERTIES_TO_EXCLUDE: case SWITCH_COMPUTER_PROPERTIES_TO_EXCLUDE: case SWITCH_SID_MAPPING_FILE: case SWITCH_REPORT_FOLDER: case SWITCH_INCLUDE_FILE: case SWITCH_EXCLUDE_FILE: { _TCHAR szValue[4096];
if (_stscanf(rArgs.Value(), _T("%*[^:]:%4095[^\0]"), szValue) == 1) { if (_tcslen(szValue) > 2047) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_TOO_LONG); }
vntValue = szValue; } else { if (rArgs.Next()) { LPCTSTR pszArg = rArgs.Value();
if (IsPrefix(pszArg[0])) { rArgs.Prev(); ThrowError(E_INVALIDARG, IDS_E_NO_OPTION_VALUE, rArgs.Value()); }
if (_tcslen(pszArg) > 2047) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_TOO_LONG); }
vntValue = pszArg; } else { ThrowError(E_INVALIDARG, IDS_E_NO_OPTION_VALUE, rArgs.Value()); } } break; }
// multi-string values
case SWITCH_INCLUDE_NAME: case SWITCH_EXCLUDE_NAME: { T_SafeVector2<VT_BSTR, _bstr_t, StringVector, T_Extract_bstr_t<StringVector> > svValues(vntValue);
_TCHAR szValue[4096];
if (_stscanf(rArgs.Value(), _T("%*[^:]:%4095[^\0]"), szValue) == 1) { if (_tcslen(szValue) > 2047) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_TOO_LONG); }
svValues.push_back(_bstr_t(szValue)); }
while (rArgs.Next()) { LPCTSTR pszArg = rArgs.Value();
if (IsPrefix(pszArg[0])) { rArgs.Prev(); break; }
if (_tcslen(pszArg) > 2047) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_TOO_LONG); }
svValues.push_back(_bstr_t(pszArg)); }
vntValue = svValues.GetVariant(); break; }
// option files
case SWITCH_OPTION_FILE: { _TCHAR szValue[1024];
if (_stscanf(rArgs.Value(), _T("%*[^:]:%1023[^\0]"), szValue) == 1) { DoOptionFile(szValue); } else { if (rArgs.Next()) { LPCTSTR pszArg = rArgs.Value();
if (IsPrefix(pszArg[0])) { rArgs.Prev(); } else { DoOptionFile(pszArg); } } } break; }
// default
default: { _ASSERT(false); break; } } }
// Insert Method
_variant_t& CParameterMap::Insert(int nParam) { iterator it = find(nParam);
if (it == end()) { std::pair<iterator, bool> pair = insert(value_type(nParam, _variant_t()));
it = pair.first; }
return it->second; }
// DoOptionFile Method
void CParameterMap::DoOptionFile(LPCTSTR pszFileName) { CSwitchMap mapSwitchs;
FILE* fp = OpenOptionFile(pszFileName);
try { iterator it = find(SWITCH_TASK);
if (it == end()) { ThrowError(E_FAIL, IDS_E_OPTION_FILE_TASK, pszFileName); }
int nCurrentTask = long(it->second);
int nTask;
do { nTask = FindTask(fp);
if ((nTask == 0) || (nTask == nCurrentTask)) { DoTask(fp, mapSwitchs); } } while (nTask >= 0); } catch (...) { fclose(fp); throw; }
fclose(fp); }
// OpenOptionFile Method
FILE* CParameterMap::OpenOptionFile(LPCTSTR pszFileName) { // open in binary mode first in order to check for UNICODE byte order
// mark if the file is UNICODE then it must be read in binary mode
// with the stream i/o functions
FILE* fp = _tfopen(pszFileName, _T("rb"));
if (fp == NULL) { ThrowError(E_INVALIDARG, IDS_E_OPTION_FILE_OPEN, pszFileName); }
// check if file is ANSI or UNICODE or UTF-8
BYTE byteSignature[3];
if (fread(byteSignature, sizeof(BYTE), 3, fp) == 3) { static BYTE byteUtf8[] = { 0xEF, 0xBB, 0xBF }; static BYTE byteUnicodeLE[] = { 0xFF, 0xFE }; static BYTE byteUnicodeBE[] = { 0xFE, 0xFF };
// check for signature or byte order mark
if (memcmp(byteSignature, byteUtf8, sizeof(byteUtf8)) == 0) { // UTF-8 signature
// TODO: not currently supported
fclose(fp); ThrowError(E_INVALIDARG, IDS_E_OPTION_FILE_UTF_8, pszFileName); } else if (memcmp(byteSignature, byteUnicodeLE, sizeof(byteUnicodeLE)) == 0) { // UNICODE Little Endian Byte Order Mark
// supported
// must read in binary mode
// move file pointer back one byte because we read 3 bytes
if (fseek(fp, -1, SEEK_CUR)) { // if cannot move file pointer back, try to reopen and read in two bytes
fclose(fp); fp = NULL; ThrowError(E_INVALIDARG, IDS_E_OPTION_FILE_SEEK); } } else if (memcmp(byteSignature, byteUnicodeBE, sizeof(byteUnicodeBE)) == 0) { // UNICODE Big Endian Byte Order Mark
// TODO: not currently supported
fclose(fp); ThrowError(E_INVALIDARG, IDS_E_OPTION_FILE_UNICODE_BIG_ENDIAN, pszFileName); } else { // assume ANSI
// re-open file in text mode as the stream i/o functions will
// treat the file as multi-byte characters and will convert them
// to UNICODE
fclose(fp);
fp = _tfopen(pszFileName, _T("rt"));
if (fp == NULL) { ThrowError(E_INVALIDARG, IDS_E_OPTION_FILE_OPEN, pszFileName); } } } else { fclose(fp); ThrowError(E_INVALIDARG, IDS_E_OPTION_FILE_READ_SIGNATURE, pszFileName); }
return fp; }
// FindTask Method
int CParameterMap::FindTask(FILE* fp) { int nTask = -1;
_TCHAR szBuffer[1024];
while (_fgetts(szBuffer, countof(szBuffer), fp)) { _TCHAR szTask[64]; if (_stscanf(szBuffer, _T(" [ %63[A-Za-z] ] "), szTask) == 1) { // My_fwprintf(_T("FindTask() : '%s'\n"), szTask);
if (_tcsicmp(szTask, _T("Migration")) == 0) { nTask = TASK_NONE; break; }
if ((_tcsicmp(szTask, _T("User")) == 0) || (_tcsicmp(szTask, _T("UserMigration")) == 0)) { nTask = TASK_USER; break; }
if ((_tcsicmp(szTask, _T("Group")) == 0) || (_tcsicmp(szTask, _T("GroupMigration")) == 0)) { nTask = TASK_GROUP; break; }
if ((_tcsicmp(szTask, _T("Computer")) == 0) || (_tcsicmp(szTask, _T("ComputerMigration")) == 0)) { nTask = TASK_COMPUTER; break; }
if ((_tcsicmp(szTask, _T("Security")) == 0) || (_tcsicmp(szTask, _T("SecurityTranslation")) == 0)) { nTask = TASK_SECURITY; break; }
if ((_tcsicmp(szTask, _T("Service")) == 0) || (_tcsicmp(szTask, _T("ServiceAccountEnumeration")) == 0)) { nTask = TASK_SERVICE; break; }
if ((_tcsicmp(szTask, _T("Report")) == 0) || (_tcsicmp(szTask, _T("ReportGeneration")) == 0)) { nTask = TASK_REPORT; break; } } }
return nTask; }
// DoTask Method
void CParameterMap::DoTask(FILE* fp, CSwitchMap& mapSwitchs) { _TCHAR szBuffer[8192];
for (;;) { long lOffset = ftell(fp);
if (_fgetts(szBuffer, countof(szBuffer), fp) == NULL) { break; }
_TCHAR szTask[64];
if (_stscanf(szBuffer, _T(" [ %63[A-Za-z] ] "), szTask) == 1) { if (fseek(fp, lOffset, SEEK_SET)) { ThrowError(E_FAIL, IDS_E_OPTION_FILE_SEEK); } break; }
_TCHAR szName[64]; _TCHAR szValue[4096];
try { if ((szBuffer[0] != _T(';')) && (_stscanf(szBuffer, _T(" %63[A-Za-z] = %4095[^\r\n]"), szName, szValue) == 2)) { // My_fwprintf(_T("DoTask() : %s='%s'\n"), szName, szValue);
CSwitchMap::iterator it = mapSwitchs.find(_bstr_t(szName));
if ((it != mapSwitchs.end()) && (it->second != SWITCH_TASK)) { DoParameter(it->second, szValue); } } } catch (_com_error& ce) { ThrowError(ce, IDS_CANT_GET_OPTION_VALUE, szName, szValue); } catch (...) { ThrowError(E_FAIL, IDS_CANT_GET_OPTION_VALUE, szName, szValue); } } }
// DoParameter Method
void CParameterMap::DoParameter(int nSwitch, LPCTSTR pszValue) { _variant_t& vntValue = Insert(nSwitch);
switch (nSwitch) { // boolean values
case SWITCH_TEST_MIGRATION: case SWITCH_INTRA_FOREST: case SWITCH_MIGRATE_SIDS: case SWITCH_TRANSLATE_ROAMING_PROFILE: case SWITCH_UPDATE_USER_RIGHTS: case SWITCH_MIGRATE_GROUPS: case SWITCH_UPDATE_PREVIOUSLY_MIGRATED_OBJECTS: case SWITCH_FIX_GROUP_MEMBERSHIP: case SWITCH_MIGRATE_SERVICE_ACCOUNTS: case SWITCH_UPDATE_GROUP_RIGHTS: case SWITCH_MIGRATE_MEMBERS: case SWITCH_TRANSLATE_FILES_AND_FOLDERS: case SWITCH_TRANSLATE_LOCAL_GROUPS: case SWITCH_TRANSLATE_PRINTERS: case SWITCH_TRANSLATE_REGISTRY: case SWITCH_TRANSLATE_SHARES: case SWITCH_TRANSLATE_USER_PROFILES: case SWITCH_TRANSLATE_USER_RIGHTS: { vntValue = GetBoolFromName(pszValue, s_BoolValues); break; }
// long values
case SWITCH_RENAME_OPTION: { vntValue = GetLongFromName(pszValue, s_RenameOptionValues); break; } case SWITCH_PASSWORD_OPTION: { vntValue = GetLongFromName(pszValue, s_PasswordOptionValues); break; } case SWITCH_CONFLICT_OPTIONS: { _TCHAR szValueA[32]; _TCHAR szValueB[32]; _TCHAR szValueC[32]; _TCHAR szValueD[32];
int cFields = _stscanf(pszValue, _T("%31[A-Za-z] + %31[A-Za-z] + %31[A-Za-z] + %31[A-Za-z]"), szValueA, szValueB, szValueC, szValueD);
if (cFields <= 0) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_INVALID); }
long lValue = GetLongFromName(szValueA, s_ConflictOptionValues);
if (cFields >= 2) { lValue |= GetLongFromName(szValueB, s_ConflictOptionFlagValues); }
if (cFields >= 3) { lValue |= GetLongFromName(szValueC, s_ConflictOptionFlagValues); }
if (cFields >= 4) { lValue |= GetLongFromName(szValueD, s_ConflictOptionFlagValues); }
vntValue = lValue; break; } case SWITCH_DISABLE_OPTION: { _TCHAR szValueA[32]; _TCHAR szValueB[32];
int cFields = _stscanf(pszValue, _T("%31[A-Za-z] + %31[A-Za-z]"), szValueA, szValueB);
if (cFields <= 0) { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID, pszValue); }
long lValue = GetLongFromName(szValueA, s_DisableOptionValues);
if (cFields >= 2) { lValue |= GetLongFromName(szValueB, s_DisableOptionValues); }
vntValue = lValue; break; } case SWITCH_SOURCE_EXPIRATION: { long lValue; _TCHAR szValue[32];
if (_stscanf(pszValue, _T("%31[A-Za-z]"), szValue) == 1) { vntValue = GetLongFromName(szValue, s_SourceExpirationValues); } else if (_stscanf(pszValue, _T("%ld"), &lValue) == 1) { vntValue = lValue; } else { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_INVALID); } break; } case SWITCH_TRANSLATION_OPTION: { vntValue = GetLongFromName(pszValue, s_TranslationOptionValues); break; } case SWITCH_RESTART_DELAY: { long lValue;
if (_stscanf(pszValue, _T("%ld"), &lValue) == 1) { vntValue = lValue; } else { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_INVALID); } break; } case SWITCH_REPORT_TYPE: { vntValue = GetLongFromName(pszValue, s_ReportTypeValues); break; }
// string values
case SWITCH_SOURCE_DOMAIN: case SWITCH_SOURCE_OU: case SWITCH_TARGET_DOMAIN: case SWITCH_TARGET_OU: case SWITCH_RENAME_PREFIX_OR_SUFFIX: case SWITCH_PASSWORD_SERVER: case SWITCH_PASSWORD_FILE: case SWITCH_CONFLICT_PREFIX_OR_SUFFIX: case SWITCH_USER_PROPERTIES_TO_EXCLUDE: case SWITCH_INETORGPERSON_PROPERTIES_TO_EXCLUDE: case SWITCH_GROUP_PROPERTIES_TO_EXCLUDE: case SWITCH_COMPUTER_PROPERTIES_TO_EXCLUDE: case SWITCH_SID_MAPPING_FILE: case SWITCH_REPORT_FOLDER: { _TCHAR szValue[2048];
UINT cch = _tcslen(pszValue);
if (cch > 2047) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_TOO_LONG); }
_tcscpy(szValue, pszValue);
if ((szValue[0] == _T('"')) && (szValue[cch - 1] == _T('"'))) { szValue[cch - 1] = _T('\0'); vntValue = &szValue[1]; } else { vntValue = szValue; } break; }
// default
default: { _ASSERT(false); break; } } }
// DoTaskKey Method
void CParameterMap::DoTaskKey(CArguments& rArgs) { // key identifier
LPCTSTR pszKeyId = NULL;
if (rArgs.Next()) { pszKeyId = rArgs.Value();
_TCHAR chPrefix; _TCHAR szSwitch[16];
if ((_stscanf(pszKeyId, _T(" %c%15s "), &chPrefix, szSwitch) == 2) && IsPrefix(chPrefix) && (m_mapSwitchs.GetSwitch(szSwitch) == SWITCH_HELP)) { insert(value_type(SWITCH_HELP, _variant_t(true))); } else { insert(value_type(SWITCH_KEY_IDENTIFIER, _variant_t(pszKeyId)));
// drive
if (rArgs.Next()) { insert(value_type(SWITCH_KEY_FOLDER, _variant_t(rArgs.Value())));
// password
_bstr_t strPassword;
if (rArgs.Next()) { strPassword = rArgs.Value(); }
//
// Check for unexpected parameters or arguments.
//
if (rArgs.Next()) { ThrowError(E_INVALIDARG, IDS_E_TOO_MANY_ARGUMENTS); }
if (strPassword.length() > 0) { if (_tcscmp(strPassword, _T("*")) == 0) { if (!GetPasswordFromUser(pszKeyId, strPassword)) { ThrowError(E_FAIL, IDS_E_CANT_GET_PASSWORD); } } }
if (strPassword.length() > MAX_PASSWORD_LENGTH) { ThrowError(E_INVALIDARG, IDS_E_PASSWORD_TOO_LONG, MAX_PASSWORD_LENGTH); }
insert(value_type(SWITCH_KEY_PASSWORD, _variant_t(strPassword))); } } }
if (pszKeyId == NULL) { insert(value_type(SWITCH_HELP, _variant_t(true))); } }
// VerifyIncludeExclude Method
void CParameterMap::VerifyIncludeExclude() { // verify that only one include option type was specified
int cInclude = 0;
if (find(SWITCH_INCLUDE_NAME) != end()) { ++cInclude; }
if (find(SWITCH_INCLUDE_FILE) != end()) { ++cInclude; }
if (find(SWITCH_INCLUDE_DOMAIN) != end()) { ++cInclude; }
if (cInclude > 1) { ThrowError(E_INVALIDARG, IDS_E_MULTIPLE_INCLUDE_OPTIONS); }
// verify that only one exclude option type was specified
if ((find(SWITCH_EXCLUDE_NAME) != end()) && (find(SWITCH_EXCLUDE_FILE) != end())) { ThrowError(E_INVALIDARG, IDS_E_MULTIPLE_EXCLUDE_OPTIONS); } }
namespace Parameter_cpp {
// GetBoolValue Method
bool GetBoolValue(LPCTSTR pszArg) { bool bValue;
try { _TCHAR szValue[16];
if (_stscanf(pszArg, _T("%*[^:]: %15[A-Za-z]"), szValue) == 1) { bValue = GetBoolFromName(szValue, s_BoolValues); } else { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID2, pszArg); } } catch (_com_error& ce) { ThrowError(ce, IDS_E_CANT_GET_OPTION_VALUE2, pszArg); } catch (...) { ThrowError(E_FAIL, IDS_E_CANT_GET_OPTION_VALUE2, pszArg); }
return bValue; }
// GetBoolFromName Method
bool GetBoolFromName(LPCTSTR pszName, SNameToBool* pNameToBool) { bool bValue;
bool bFound = false;
for (SNameToBool* p = pNameToBool; p->pszName; p++) { if (_tcsicmp(p->pszName, pszName) == 0) { bValue = p->bValue; bFound = true; break; } }
if (!bFound) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_UNRECOGNIZED, pszName); }
return bValue; }
// GetLongValue Method
long GetLongValue(LPCTSTR pszArg, SNameToLong* pNameToLong) { long lValue;
try { _TCHAR szValue[32];
if (_stscanf(pszArg, _T("%*[^:]: %31[A-Za-z]"), szValue) == 1) { lValue = GetLongFromName(szValue, pNameToLong); } else { ThrowError(E_INVALIDARG, IDS_E_OPTION_FORMAT_INVALID2, pszArg); } } catch (_com_error& ce) { ThrowError(ce, IDS_E_CANT_GET_OPTION_VALUE2, pszArg); } catch (...) { ThrowError(E_FAIL, IDS_E_CANT_GET_OPTION_VALUE2, pszArg); }
return lValue; }
// GetLongFromName Method
long GetLongFromName(LPCTSTR pszName, SNameToLong* pNameToLong) { long lValue;
bool bFound = false;
for (SNameToLong* p = pNameToLong; p->pszName; p++) { if (_tcsicmp(p->pszName, pszName) == 0) { lValue = p->lValue; bFound = true; break; } }
if (!bFound) { ThrowError(E_INVALIDARG, IDS_E_OPTION_VALUE_UNRECOGNIZED, pszName); }
return lValue; }
// GetPasswordFromUser Method
bool GetPasswordFromUser(LPCTSTR pszKeyId, _bstr_t& strPassword) { bool bGet = false;
_bstr_t strFormat[2]; strFormat[0] = LoadStringHelper(IDS_TYPE_PASSWORD); strFormat[1] = LoadStringHelper(IDS_CONFIRM_PASSWORD);
_TCHAR szPassword[2][MAX_PASSWORD_LENGTH + 1]; szPassword[0][0] = _T('\0'); szPassword[1][0] = _T('\0');
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
if (hInput != INVALID_HANDLE_VALUE) { DWORD dwMode;
if (GetConsoleMode(hInput, &dwMode)) { if (SetConsoleMode(hInput, ENABLE_PROCESSED_INPUT)) { while (bGet == false) { for (int nPass = 0; nPass < 2; nPass++) { My_fwprintf(strFormat[nPass], pszKeyId);
_TCHAR ch; DWORD dwRead; int nIndex = 0;
while (ReadConsole(hInput, &ch, 1, &dwRead, NULL)) { if ((ch == _T('\r')) || (ch == _T('\n'))) { break; } else if (ch == _T('\b')) { if (nIndex > 0) { CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hOutput, &csbi)) { --csbi.dwCursorPosition.X;
if (SetConsoleCursorPosition(hOutput, csbi.dwCursorPosition)) { --nIndex;
DWORD dwWritten; WriteConsole(hOutput, _T(" "), 1, &dwWritten, NULL); SetConsoleCursorPosition(hOutput, csbi.dwCursorPosition); } } } } else if ((nIndex < MAX_PASSWORD_LENGTH) && _istprint(ch)) { szPassword[nPass][nIndex++] = ch;
DWORD dwWritten; WriteConsole(hOutput, _T("*"), 1, &dwWritten, NULL); } }
_puttchar(_T('\n'));
szPassword[nPass][nIndex] = _T('\0'); }
if (_tcscmp(szPassword[0], szPassword[1]) == 0) { strPassword = szPassword[0]; bGet = true; break; } } } SetConsoleMode(hInput, dwMode); } }
return bGet; }
_bstr_t LoadStringHelper(UINT uId) { _TCHAR szBuffer[1024];
if (LoadString(GetModuleHandle(NULL), uId, szBuffer, countof(szBuffer)) <= 0) { szBuffer[0] = _T('\0'); }
return szBuffer; }
}
|