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.
586 lines
12 KiB
586 lines
12 KiB
#include "StdAfx.h"
|
|
#include "Argument.h"
|
|
#include "Parameter.h"
|
|
#include "Migration.h"
|
|
#include "Switch.h"
|
|
#include "MonitorThread.h"
|
|
#include "GenerateKey.h"
|
|
#include "RegistryHelper.h"
|
|
#include "IsAdmin.hpp"
|
|
|
|
|
|
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);
|
|
|
|
|
|
try
|
|
{
|
|
DWORD lRet = MoveRegistry();
|
|
if (lRet != ERROR_SUCCESS)
|
|
ThrowError(HRESULT_FROM_WIN32(lRet), IDS_E_UPDATE_REGISTRY_FAILED);
|
|
|
|
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
|
|
{
|
|
CUserMigration(CMigration(mapParams), mapParams);
|
|
}
|
|
break;
|
|
}
|
|
case TASK_GROUP:
|
|
{
|
|
if (bHelp)
|
|
{
|
|
PrintGroupUsage();
|
|
}
|
|
else
|
|
{
|
|
CGroupMigration(CMigration(mapParams), mapParams);
|
|
}
|
|
break;
|
|
}
|
|
case TASK_COMPUTER:
|
|
{
|
|
if (bHelp)
|
|
{
|
|
PrintComputerUsage();
|
|
}
|
|
else
|
|
{
|
|
CComputerMigration(CMigration(mapParams), mapParams);
|
|
}
|
|
break;
|
|
}
|
|
case TASK_SECURITY:
|
|
{
|
|
if (bHelp)
|
|
{
|
|
PrintSecurityUsage();
|
|
}
|
|
else
|
|
{
|
|
CSecurityTranslation(CMigration(mapParams), mapParams);
|
|
}
|
|
break;
|
|
}
|
|
case TASK_SERVICE:
|
|
{
|
|
if (bHelp)
|
|
{
|
|
PrintServiceUsage();
|
|
}
|
|
else
|
|
{
|
|
CServiceEnumeration(CMigration(mapParams), mapParams);
|
|
}
|
|
break;
|
|
}
|
|
case TASK_REPORT:
|
|
{
|
|
if (bHelp)
|
|
{
|
|
PrintReportUsage();
|
|
}
|
|
else
|
|
{
|
|
CReportGeneration(CMigration(mapParams), mapParams);
|
|
}
|
|
break;
|
|
}
|
|
case TASK_KEY:
|
|
{
|
|
if (bHelp)
|
|
{
|
|
PrintKeyUsage();
|
|
}
|
|
else
|
|
{
|
|
lRet = IsAdminLocal();
|
|
if (lRet != ERROR_SUCCESS)
|
|
ThrowError(HRESULT_FROM_WIN32(lRet), IDS_E_LOCAL_ADMIN_CHECK_FAILED);
|
|
|
|
_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)
|
|
{
|
|
|
|
_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);
|
|
}
|
|
}
|
|
|
|
strDescription = ceNew.Description();
|
|
|
|
if (strDescription.length())
|
|
{
|
|
My_fwprintf(_T("%s (0x%08lX)\n"), (LPCTSTR)strDescription, ceNew.Error());
|
|
}
|
|
else
|
|
{
|
|
My_fwprintf(_T("%s (0x%08lX)\n"), (LPCTSTR)ceNew.ErrorMessage(), ceNew.Error());
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
My_fwprintf(_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,
|
|
IDS_USAGE_INETORGPERSONPROPERTIESTOEXCLUDE,
|
|
IDS_USAGE_GROUPPROPERTIESTOEXCLUDE,
|
|
// 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,
|
|
IDS_USAGE_USERPROPERTIESTOEXCLUDE,
|
|
IDS_USAGE_INETORGPERSONPROPERTIESTOEXCLUDE,
|
|
// 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));
|
|
My_fwprintf(_T("%s\n\n"), szBuffer);
|
|
}
|
|
|
|
// print command
|
|
|
|
if (cId > 1)
|
|
{
|
|
GetString(uId[1], szBuffer, countof(szBuffer));
|
|
My_fwprintf(_T("%s\n\n"), szBuffer);
|
|
}
|
|
|
|
// print options
|
|
|
|
if (cId > 2)
|
|
{
|
|
for (UINT i = 2; i < cId; i++)
|
|
{
|
|
GetString(uId[i], szBuffer, countof(szBuffer));
|
|
|
|
My_fwprintf(_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');
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Based on LDIFDE/CSVDE.
|
|
//
|
|
// Prints Unicode formatted string to console window using WriteConsoleW.
|
|
// Note: This My_fwprintf() is used to workaround the problem in c-runtime
|
|
// which looks up LC_CTYPE even for Unicode string.
|
|
//
|
|
|
|
int __cdecl
|
|
My_fwprintf(
|
|
const WCHAR *format,
|
|
...
|
|
)
|
|
{
|
|
DWORD cchChar;
|
|
|
|
va_list args;
|
|
va_start( args, format );
|
|
|
|
cchChar = My_vfwprintf(format, args);
|
|
|
|
va_end(args);
|
|
|
|
return cchChar;
|
|
}
|
|
|
|
|
|
int __cdecl
|
|
My_vfwprintf(
|
|
const WCHAR *format,
|
|
va_list argptr
|
|
)
|
|
{
|
|
|
|
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
DWORD currentMode;
|
|
DWORD cchChar;
|
|
|
|
const DWORD dwBufferMessageSize = 4096;
|
|
WCHAR szBufferMessage[dwBufferMessageSize];
|
|
|
|
_vsnwprintf( szBufferMessage, dwBufferMessageSize, format, argptr );
|
|
szBufferMessage[dwBufferMessageSize-1] = L'\0';
|
|
|
|
cchChar = wcslen(szBufferMessage);
|
|
|
|
if (GetFileType(hOut) == FILE_TYPE_CHAR && GetConsoleMode(hOut, ¤tMode))
|
|
{
|
|
WriteConsoleW(hOut, szBufferMessage, cchChar, &cchChar, NULL);
|
|
}
|
|
else
|
|
{
|
|
int charCount = WideCharToMultiByte(CP_ACP, 0, szBufferMessage, -1, 0, 0, 0, 0);
|
|
char* szaStr = new char[charCount];
|
|
if (szaStr != NULL)
|
|
{
|
|
DWORD dwBytesWritten;
|
|
WideCharToMultiByte(CP_ACP, 0, szBufferMessage, -1, szaStr, charCount, 0, 0);
|
|
WriteFile(hOut, szaStr, charCount - 1, &dwBytesWritten, 0);
|
|
delete[] szaStr;
|
|
}
|
|
else
|
|
{
|
|
cchChar = 0;
|
|
}
|
|
}
|
|
|
|
return cchChar;
|
|
}
|
|
|