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.
427 lines
9.9 KiB
427 lines
9.9 KiB
// Display.cpp : Defines the entry point for the console application.
|
|
//
|
|
|
|
#include "headers.hxx"
|
|
#include <comdef.h>
|
|
#include <crtdbg.h>
|
|
|
|
#include "AdsiHelpers.hpp"
|
|
#include "CSVDSReader.hpp"
|
|
#include "AnalysisResults.hpp"
|
|
#include "Analysis.hpp"
|
|
#include "repair.hpp"
|
|
#include "resource.h"
|
|
#include "constants.hpp"
|
|
#include "WelcomePage.hpp"
|
|
#include "AnalysisPage.hpp"
|
|
#include "constants.hpp"
|
|
#include "UpdatesRequiredPage.hpp"
|
|
#include "UpdatesPage.hpp"
|
|
#include "FinishPage.hpp"
|
|
|
|
|
|
|
|
HINSTANCE hResourceModuleHandle = 0;
|
|
const wchar_t* HELPFILE_NAME = 0; // no context help available
|
|
|
|
// don't change this: it is also the name of a mutex that the ui
|
|
// uses to determine if it is already running.
|
|
|
|
const wchar_t* RUNTIME_NAME = L"dspecup";
|
|
|
|
DWORD DEFAULT_LOGGING_OPTIONS =
|
|
Log::OUTPUT_TO_FILE
|
|
| Log::OUTPUT_FUNCCALLS
|
|
| Log::OUTPUT_LOGS
|
|
| Log::OUTPUT_ERRORS
|
|
| Log::OUTPUT_HEADER;
|
|
|
|
Popup popup(IDS_APP_TITLE, false);
|
|
|
|
// this is the mutex that indicates the program is running.
|
|
|
|
HANDLE appRunningMutex = INVALID_HANDLE_VALUE;
|
|
|
|
|
|
|
|
// these are the valid exit codes returned as the process exit code
|
|
|
|
enum ExitCode
|
|
{
|
|
// the operation failed.
|
|
|
|
EXIT_CODE_UNSUCCESSFUL = 0,
|
|
|
|
// the operation succeeded
|
|
|
|
EXIT_CODE_SUCCESSFUL = 1,
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
HRESULT
|
|
Start()
|
|
{
|
|
LOG_FUNCTION(Start);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
do
|
|
{
|
|
String targetDomainControllerName;
|
|
String csvFileName,csv409Name;
|
|
|
|
hr=GetInitialInformation(
|
|
targetDomainControllerName,
|
|
csvFileName,
|
|
csv409Name
|
|
);
|
|
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
AnalysisResults results;
|
|
CSVDSReader csvReaderIntl;
|
|
hr=csvReaderIntl.read(csvFileName.c_str(),LOCALEIDS);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
CSVDSReader csvReader409;
|
|
hr=csvReader409.read(csv409Name.c_str(),LOCALE409);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String rootContainerDn,ldapPrefix,domainName;
|
|
hr=InitializeADSI(
|
|
targetDomainControllerName,
|
|
ldapPrefix,
|
|
rootContainerDn,
|
|
domainName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String reportName;
|
|
|
|
hr=GetFileName(L"RPT",reportName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
Analysis analysis(
|
|
csvReader409,
|
|
csvReaderIntl,
|
|
ldapPrefix,
|
|
rootContainerDn,
|
|
results,
|
|
&reportName);
|
|
|
|
hr=analysis.run();
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String ldiffName;
|
|
|
|
hr=GetFileName(L"LDF",ldiffName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String csvName;
|
|
|
|
hr=GetFileName(L"CSV",csvName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String saveName;
|
|
|
|
hr=GetFileName(L"SAV",saveName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String logPath;
|
|
|
|
hr=GetMyDocuments(logPath);
|
|
if ( FAILED(hr) )
|
|
{
|
|
hr=Win::GetTempPath(logPath);
|
|
BREAK_ON_FAILED_HRESULT_ERROR(hr,String::format(IDS_NO_WORK_PATH));
|
|
}
|
|
|
|
Repair repair(
|
|
csvReader409,
|
|
csvReaderIntl,
|
|
domainName,
|
|
rootContainerDn,
|
|
results,
|
|
ldiffName,
|
|
csvName,
|
|
saveName,
|
|
logPath);
|
|
|
|
hr=repair.run();
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
hr=SetPreviousSuccessfullRun(
|
|
ldapPrefix,
|
|
rootContainerDn
|
|
);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
}
|
|
while (0);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ShowError(hr,error);
|
|
}
|
|
|
|
LOG_HRESULT(hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
StartUI()
|
|
{
|
|
LOG_FUNCTION(StartUI);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
String rootContainerDn,ldapPrefix,domainName;
|
|
|
|
do
|
|
{
|
|
String targetDomainControllerName;
|
|
String csvFileName,csv409Name;
|
|
|
|
hr=GetInitialInformation(
|
|
targetDomainControllerName,
|
|
csvFileName,
|
|
csv409Name
|
|
);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
AnalysisResults results;
|
|
CSVDSReader csvReaderIntl;
|
|
hr=csvReaderIntl.read(csvFileName.c_str(),LOCALEIDS);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
CSVDSReader csvReader409;
|
|
hr=csvReader409.read(csv409Name.c_str(),LOCALE409);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
|
|
hr=InitializeADSI(
|
|
targetDomainControllerName,
|
|
ldapPrefix,
|
|
rootContainerDn,
|
|
domainName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
|
|
|
|
Wizard wiz(
|
|
IDS_WIZARD_TITLE,
|
|
IDB_BANNER16,
|
|
IDB_BANNER256,
|
|
IDB_WATERMARK16,
|
|
IDB_WATERMARK256
|
|
);
|
|
|
|
|
|
|
|
wiz.AddPage(new WelcomePage());
|
|
|
|
String reportName;
|
|
|
|
hr=GetFileName(L"RPT",reportName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
|
|
wiz.AddPage(
|
|
new AnalysisPage
|
|
(
|
|
csvReader409,
|
|
csvReaderIntl,
|
|
ldapPrefix,
|
|
rootContainerDn,
|
|
results,
|
|
reportName
|
|
)
|
|
);
|
|
|
|
|
|
wiz.AddPage(
|
|
new UpdatesRequiredPage
|
|
(
|
|
reportName,
|
|
results
|
|
)
|
|
);
|
|
|
|
String ldiffName;
|
|
|
|
hr=GetFileName(L"LDF",ldiffName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String csvName;
|
|
|
|
hr=GetFileName(L"CSV",csvName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String saveName;
|
|
|
|
hr=GetFileName(L"SAV",saveName);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
|
|
String logPath;
|
|
|
|
hr=GetMyDocuments(logPath);
|
|
if ( FAILED(hr) )
|
|
{
|
|
hr=Win::GetTempPath(logPath);
|
|
BREAK_ON_FAILED_HRESULT_ERROR(hr,String::format(IDS_NO_WORK_PATH));
|
|
}
|
|
|
|
bool someRepairWasRun=false;
|
|
|
|
wiz.AddPage(
|
|
new UpdatesPage
|
|
(
|
|
csvReader409,
|
|
csvReaderIntl,
|
|
domainName,
|
|
rootContainerDn,
|
|
ldiffName,
|
|
csvName,
|
|
saveName,
|
|
logPath,
|
|
results,
|
|
&someRepairWasRun
|
|
)
|
|
);
|
|
|
|
wiz.AddPage(
|
|
new FinishPage(
|
|
someRepairWasRun,
|
|
logPath
|
|
)
|
|
);
|
|
|
|
|
|
hr=wiz.ModalExecute(Win::GetDesktopWindow());
|
|
|
|
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
}
|
|
while (0);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ShowError(hr,error);
|
|
}
|
|
else
|
|
{
|
|
if(FAILED(hrError))
|
|
{
|
|
// The error has already been shown to the
|
|
// user, we have only to return it
|
|
hr=hrError;
|
|
}
|
|
else
|
|
{
|
|
|
|
hr=SetPreviousSuccessfullRun(
|
|
ldapPrefix,
|
|
rootContainerDn
|
|
);
|
|
if (FAILED(hr))
|
|
{
|
|
ShowError(hr,error);
|
|
}
|
|
}
|
|
}
|
|
|
|
LOG_HRESULT(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
int WINAPI
|
|
WinMain(
|
|
HINSTANCE hInstance,
|
|
HINSTANCE /* hPrevInstance */ ,
|
|
LPSTR lpszCmdLine,
|
|
int /* nCmdShow */)
|
|
{
|
|
LOG_FUNCTION(WinMain);
|
|
|
|
hResourceModuleHandle = hInstance;
|
|
|
|
ExitCode exitCode = EXIT_CODE_UNSUCCESSFUL;
|
|
HRESULT hr;
|
|
|
|
do
|
|
{
|
|
try
|
|
{
|
|
String cmdLine(lpszCmdLine);
|
|
String noUI=String::format(IDS_NOUI);
|
|
if (*lpszCmdLine!=0 && cmdLine.icompare(noUI)!=0)
|
|
{
|
|
error=String::format(IDS_USAGE);
|
|
ShowError(E_FAIL,error);
|
|
exitCode = EXIT_CODE_UNSUCCESSFUL;
|
|
break;
|
|
}
|
|
|
|
|
|
hr = Win::CreateMutex(0, true, RUNTIME_NAME, appRunningMutex);
|
|
if (hr == Win32ToHresult(ERROR_ALREADY_EXISTS))
|
|
{
|
|
// The application is already running
|
|
error=String::format(IDS_ALREADY_RUNNING);
|
|
ShowError(E_FAIL,error);
|
|
exitCode = EXIT_CODE_UNSUCCESSFUL;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
hr = ::CoInitialize(0);
|
|
ASSERT(SUCCEEDED(hr));
|
|
|
|
INITCOMMONCONTROLSEX sex;
|
|
sex.dwSize = sizeof(sex);
|
|
sex.dwICC = ICC_ANIMATE_CLASS | ICC_USEREX_CLASSES;
|
|
BOOL init = ::InitCommonControlsEx(&sex);
|
|
ASSERT(init);
|
|
|
|
setReplaceW2KStrs();
|
|
|
|
if (*lpszCmdLine==0)
|
|
{
|
|
hr = StartUI();
|
|
}
|
|
else
|
|
{
|
|
hr = Start();
|
|
}
|
|
//hr=makeStrings();
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
exitCode = EXIT_CODE_SUCCESSFUL;
|
|
}
|
|
else
|
|
{
|
|
exitCode = EXIT_CODE_UNSUCCESSFUL;
|
|
}
|
|
CoUninitialize();
|
|
}
|
|
}
|
|
catch( std::bad_alloc )
|
|
{
|
|
// Since we are in an out of memory condition.
|
|
// we will not show any messages.
|
|
// The allocation functions have already
|
|
// shown the user this condition
|
|
exitCode = EXIT_CODE_UNSUCCESSFUL;
|
|
}
|
|
} while(0);
|
|
|
|
return static_cast<int>(exitCode);
|
|
}
|
|
|
|
|
|
|