#include "StdAfx.h" #include "Argument.h" #include "Parameter.h" #include "Migration.h" #include "Switch.h" #include "MonitorThread.h" #include "GenerateKey.h" namespace PrintUsage { void __stdcall PrintADMTUsage(); void __stdcall PrintUserUsage(); void __stdcall PrintGroupUsage(); void __stdcall PrintComputerUsage(); void __stdcall PrintSecurityUsage(); void __stdcall PrintServiceUsage(); void __stdcall PrintReportUsage(); void __stdcall PrintKeyUsage(); void __stdcall PrintUsage(UINT uId[], UINT cId); void __stdcall GetString(UINT uId, LPTSTR pszBuffer, int cchBuffer); } using namespace PrintUsage; //--------------------------------------------------------------------------- // Main //--------------------------------------------------------------------------- int __cdecl _tmain(int argc, LPTSTR argv[]) { HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (SUCCEEDED(hr)) { _RPT0(_CRT_WARN, _T("{ADMT.exe}_tmain() : Enter\n")); _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); CMonitorThread mtMonitor; try { CArguments aArgs(argc, argv); CParameterMap mapParams(aArgs); long lTask; if (mapParams.GetValue(SWITCH_TASK, lTask)) { bool bHelp; if (!mapParams.GetValue(SWITCH_HELP, bHelp)) { bHelp = false; } switch (lTask) { case TASK_USER: { if (bHelp) { PrintUserUsage(); } else { mtMonitor.Start(); CUserMigration(CMigration(mapParams), mapParams); mtMonitor.Stop(); } break; } case TASK_GROUP: { if (bHelp) { PrintGroupUsage(); } else { mtMonitor.Start(); CGroupMigration(CMigration(mapParams), mapParams); mtMonitor.Stop(); } break; } case TASK_COMPUTER: { if (bHelp) { PrintComputerUsage(); } else { mtMonitor.Start(); CComputerMigration(CMigration(mapParams), mapParams); mtMonitor.Stop(); } break; } case TASK_SECURITY: { if (bHelp) { PrintSecurityUsage(); } else { mtMonitor.Start(); CSecurityTranslation(CMigration(mapParams), mapParams); mtMonitor.Stop(); } break; } case TASK_SERVICE: { if (bHelp) { PrintServiceUsage(); } else { mtMonitor.Start(); CServiceEnumeration(CMigration(mapParams), mapParams); mtMonitor.Stop(); } break; } case TASK_REPORT: { if (bHelp) { PrintReportUsage(); } else { mtMonitor.Start(); CReportGeneration(CMigration(mapParams), mapParams); mtMonitor.Stop(); } break; } case TASK_KEY: { if (bHelp) { PrintKeyUsage(); } else { _bstr_t strKeyId; if (!mapParams.GetValue(SWITCH_KEY_IDENTIFIER, strKeyId)) { ThrowError(E_INVALIDARG, IDS_E_NO_KEY_DOMAIN); } _bstr_t strDrive; if (!mapParams.GetValue(SWITCH_KEY_FOLDER, strDrive)) { ThrowError(E_INVALIDARG, IDS_E_NO_KEY_FOLDER); } _bstr_t strPassword; mapParams.GetValue(SWITCH_KEY_PASSWORD, strPassword); GeneratePasswordKey(strKeyId, strPassword, strDrive); } break; } default: { _ASSERT(false); break; } } } else { PrintADMTUsage(); } } catch (_com_error& ce) { mtMonitor.Stop(); _com_error ceNew(ce); _bstr_t strDescription = ceNew.Description(); if (!strDescription) { IErrorInfo* pErrorInfo = NULL; if (GetErrorInfo(0, &pErrorInfo) == S_OK) { ceNew = _com_error(ceNew.Error(), pErrorInfo); } } _tprintf(_T("%s : %s (0x%08lX)\n"), (LPCTSTR)ceNew.Description(), ceNew.ErrorMessage(), ceNew.Error()); } catch (...) { mtMonitor.Stop(); _tprintf(_T("%s (0x%08lX)\n"), _com_error(E_FAIL).ErrorMessage(), E_FAIL); } _RPT0(_CRT_WARN, _T("{ADMT.exe}_tmain() : Leave\n")); CoUninitialize(); } return 0; } // Print Usage -------------------------------------------------------------- namespace PrintUsage { void __stdcall PrintADMTUsage() { static UINT s_uId[] = { IDS_USAGE_SYNTAX, IDS_USAGE_ADMT, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintUserUsage() { static UINT s_uId[] = { // user command IDS_USAGE_SYNTAX, IDS_USAGE_USER, // common options IDS_USAGE_OPTIONFILE, IDS_USAGE_TESTMIGRATION, IDS_USAGE_INTRAFOREST, IDS_USAGE_SOURCEDOMAIN, IDS_USAGE_SOURCEOU, IDS_USAGE_TARGETDOMAIN, IDS_USAGE_TARGETOU, // user migration options IDS_USAGE_PASSWORDOPTION, IDS_USAGE_PASSWORDSERVER, IDS_USAGE_PASSWORDFILE, IDS_USAGE_DISABLEOPTION, IDS_USAGE_SOURCEEXPIRATION, IDS_USAGE_MIGRATESIDS, IDS_USAGE_TRANSLATEROAMINGPROFILE, IDS_USAGE_UPDATEUSERRIGHTS, IDS_USAGE_MIGRATEGROUPS, IDS_USAGE_UPDATEPREVIOUSLYMIGRATEDOBJECTS, IDS_USAGE_FIXGROUPMEMBERSHIP, IDS_USAGE_MIGRATESERVICEACCOUNTS, IDS_USAGE_RENAMEOPTION, IDS_USAGE_RENAMEPREFIXORSUFFIX, IDS_USAGE_CONFLICTOPTIONS_U, IDS_USAGE_CONFLICTPREFIXORSUFFIX, IDS_USAGE_USERPROPERTIESTOEXCLUDE, // users to migrate IDS_USAGE_INCLUDE_A, IDS_USAGE_EXCLUDE, IDS_USAGE_FOOTER, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintGroupUsage() { static UINT s_uId[] = { // group command IDS_USAGE_SYNTAX, IDS_USAGE_GROUP, // common options IDS_USAGE_OPTIONFILE, IDS_USAGE_TESTMIGRATION, IDS_USAGE_INTRAFOREST, IDS_USAGE_SOURCEDOMAIN, IDS_USAGE_SOURCEOU, IDS_USAGE_TARGETDOMAIN, IDS_USAGE_TARGETOU, // group migration options IDS_USAGE_UPDATEGROUPRIGHTS, IDS_USAGE_FIXGROUPMEMBERSHIP, IDS_USAGE_MIGRATESIDS, IDS_USAGE_RENAMEOPTION, IDS_USAGE_RENAMEPREFIXORSUFFIX, IDS_USAGE_CONFLICTOPTIONS_G, IDS_USAGE_CONFLICTPREFIXORSUFFIX, IDS_USAGE_GROUPPROPERTIESTOEXCLUDE, // member migration options IDS_USAGE_MIGRATEMEMBERS, IDS_USAGE_UPDATEPREVIOUSLYMIGRATEDOBJECTS, IDS_USAGE_PASSWORDOPTION, IDS_USAGE_PASSWORDSERVER, IDS_USAGE_PASSWORDFILE, IDS_USAGE_DISABLEOPTION, IDS_USAGE_SOURCEEXPIRATION, IDS_USAGE_TRANSLATEROAMINGPROFILE, // groups to migrate IDS_USAGE_INCLUDE_A, IDS_USAGE_EXCLUDE, IDS_USAGE_FOOTER, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintComputerUsage() { static UINT s_uId[] = { // computer command IDS_USAGE_SYNTAX, IDS_USAGE_COMPUTER, // common options IDS_USAGE_OPTIONFILE, IDS_USAGE_TESTMIGRATION, IDS_USAGE_INTRAFOREST, IDS_USAGE_SOURCEDOMAIN, IDS_USAGE_SOURCEOU, IDS_USAGE_TARGETDOMAIN, IDS_USAGE_TARGETOU, // computer migration options IDS_USAGE_TRANSLATIONOPTION, IDS_USAGE_TRANSLATEFILESANDFOLDERS, IDS_USAGE_TRANSLATELOCALGROUPS, IDS_USAGE_TRANSLATEPRINTERS, IDS_USAGE_TRANSLATEREGISTRY, IDS_USAGE_TRANSLATESHARES, IDS_USAGE_TRANSLATEUSERPROFILES, IDS_USAGE_TRANSLATEUSERRIGHTS, IDS_USAGE_RENAMEOPTION, IDS_USAGE_RENAMEPREFIXORSUFFIX, IDS_USAGE_CONFLICTOPTIONS_C, IDS_USAGE_CONFLICTPREFIXORSUFFIX, IDS_USAGE_RESTARTDELAY, IDS_USAGE_COMPUTERPROPERTIESTOEXCLUDE, // computers to migrate IDS_USAGE_INCLUDE_A, IDS_USAGE_EXCLUDE, IDS_USAGE_FOOTER, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintSecurityUsage() { static UINT s_uId[] = { // security command IDS_USAGE_SYNTAX, IDS_USAGE_SECURITY, // common options IDS_USAGE_OPTIONFILE, IDS_USAGE_TESTMIGRATION, IDS_USAGE_SOURCEDOMAIN, IDS_USAGE_SOURCEOU, IDS_USAGE_TARGETDOMAIN, // security migration options IDS_USAGE_TRANSLATIONOPTION, IDS_USAGE_TRANSLATEFILESANDFOLDERS, IDS_USAGE_TRANSLATELOCALGROUPS, IDS_USAGE_TRANSLATEPRINTERS, IDS_USAGE_TRANSLATEREGISTRY, IDS_USAGE_TRANSLATESHARES, IDS_USAGE_TRANSLATEUSERPROFILES, IDS_USAGE_TRANSLATEUSERRIGHTS, IDS_USAGE_SIDMAPPINGFILE, // computers to perform security translation on IDS_USAGE_INCLUDE_C, IDS_USAGE_EXCLUDE, IDS_USAGE_FOOTER, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintServiceUsage() { static UINT s_uId[] = { // security command IDS_USAGE_SYNTAX, IDS_USAGE_SERVICE, // common options IDS_USAGE_OPTIONFILE, IDS_USAGE_SOURCEDOMAIN, IDS_USAGE_SOURCEOU, // computers to perform security translation on IDS_USAGE_INCLUDE_C, IDS_USAGE_EXCLUDE, IDS_USAGE_FOOTER, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintReportUsage() { static UINT s_uId[] = { // report command IDS_USAGE_SYNTAX, IDS_USAGE_REPORT, // common options IDS_USAGE_OPTIONFILE, IDS_USAGE_SOURCEDOMAIN, IDS_USAGE_SOURCEOU, IDS_USAGE_TARGETDOMAIN, // report options IDS_USAGE_REPORTTYPE, IDS_USAGE_REPORTFOLDER, // computers to generate reports for IDS_USAGE_INCLUDE_D, IDS_USAGE_EXCLUDE, IDS_USAGE_FOOTER, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintKeyUsage() { static UINT s_uId[] = { IDS_USAGE_SYNTAX, IDS_USAGE_KEY, }; PrintUsage(s_uId, countof(s_uId)); } void __stdcall PrintUsage(UINT uId[], UINT cId) { _TCHAR szBuffer[512]; // print this is command syntax line if (cId > 0) { GetString(uId[0], szBuffer, countof(szBuffer)); _tprintf(_T("%s\n\n"), szBuffer); } // print command if (cId > 1) { GetString(uId[1], szBuffer, countof(szBuffer)); _tprintf(_T("%s\n\n"), szBuffer); } // print options if (cId > 2) { for (UINT i = 2; i < cId; i++) { GetString(uId[i], szBuffer, countof(szBuffer)); _tprintf(_T("%s\n"), szBuffer); } } } void __stdcall GetString(UINT uId, LPTSTR pszBuffer, int cchBuffer) { if (pszBuffer) { if (LoadString(GetModuleHandle(NULL), uId, pszBuffer, cchBuffer) == 0) { pszBuffer[0] = _T('\0'); } } } }