windows-nt/Source/XPSP1/NT/admin/cys/win32/expressinstallationunit.cpp
2020-09-26 16:20:57 +08:00

209 lines
6.2 KiB
C++

// Copyright (c) 1997-2001 Microsoft Corporation
//
// File: ExpressInstallationUnit.cpp
//
// Synopsis: Defines a ExpressInstallationUnit
// This object has the knowledge for installing the
// services for the express path. AD, DNS, and DHCP
//
// History: 02/08/2001 JeffJon Created
#include "pch.h"
#include "resource.h"
#include "ExpressInstallationUnit.h"
#include "InstallationUnitProvider.h"
#define CYS_TAPI_CONFIG_COMMAND_FORMAT L"tapicfg.exe Install /Directory:%1 /ForceDefault"
// Finish page help
static PCWSTR CYS_EXPRESS_FINISH_PAGE_HELP = L"cys.chm::/cys_configuring_first_server.htm";
ExpressInstallationUnit::ExpressInstallationUnit() :
InstallationUnit(
IDS_EXPRESS_PATH_TYPE,
IDS_EXPRESS_PATH_DESCRIPTION,
CYS_EXPRESS_FINISH_PAGE_HELP,
EXPRESS_INSTALL)
{
LOG_CTOR(ExpressInstallationUnit);
}
ExpressInstallationUnit::~ExpressInstallationUnit()
{
LOG_DTOR(ExpressInstallationUnit);
}
InstallationReturnType
ExpressInstallationUnit::InstallService(HANDLE logfileHandle, HWND hwnd)
{
LOG_FUNCTION(ExpressInstallationUnit::InstallService);
InstallationReturnType result = INSTALL_SUCCESS;
do
{
// Warn the user of a reboot during installation
if (IDOK == Win::MessageBox(
hwnd,
String::load(IDS_CONFIRM_REBOOT),
String::load(IDS_WIZARD_TITLE),
MB_OKCANCEL))
{
// Call the DNS installation unit to set the static IP address and subnet mask
result = InstallationUnitProvider::GetInstance().GetDNSInstallationUnit().InstallService(logfileHandle, hwnd);
if (result != INSTALL_SUCCESS)
{
LOG(L"Failed to install static IP address and subnet mask");
break;
}
// Install DHCP
result = InstallationUnitProvider::GetInstance().GetDHCPInstallationUnit().InstallService(logfileHandle, hwnd);
if (result != INSTALL_SUCCESS)
{
LOG(L"Failed to install DCHP");
break;
}
result = InstallationUnitProvider::GetInstance().GetADInstallationUnit().InstallService(logfileHandle, hwnd);
}
else
{
result = INSTALL_FAILURE;
}
} while (false);
LOG_INSTALL_RETURN(result);
return result;
}
bool
ExpressInstallationUnit::IsServiceInstalled()
{
LOG_FUNCTION(ExpressInstallationUnit:IsServiceInstalled);
bool result = false;
if (InstallationUnitProvider::GetInstance().GetDHCPInstallationUnit().IsServiceInstalled() ||
InstallationUnitProvider::GetInstance().GetDNSInstallationUnit().IsServiceInstalled() ||
InstallationUnitProvider::GetInstance().GetADInstallationUnit().IsServiceInstalled())
{
result = true;
}
LOG_BOOL(result);
return result;
}
bool
ExpressInstallationUnit::GetFinishText(String& message)
{
LOG_FUNCTION(ExpressInstallationUnit::GetFinishText);
// ADInstallationUnit& adInstallationUnit =
// InstallationUnitProvider::GetInstance().GetADInstallationUnit();
DNSInstallationUnit& dnsInstallationUnit =
InstallationUnitProvider::GetInstance().GetDNSInstallationUnit();
DHCPInstallationUnit& dhcpInstallationUnit =
InstallationUnitProvider::GetInstance().GetDHCPInstallationUnit();
// Add the standard install message
message = String::load(IDS_EXPRESS_FINISH_TEXT);
// Add the create domain message
message += String::format(
String::load(IDS_EXPRESS_FINISH_DOMAIN_NAME),
InstallationUnitProvider::GetInstance().GetADInstallationUnit().GetNewDomainDNSName().c_str());
// Get the static IP address so that it is easy to format
DWORD staticIP = dnsInstallationUnit.GetStaticIPAddress();
// Add the static IP message
message += String::format(
String::load(IDS_EXPRESS_FINISH_STATIC_IP),
FIRST_IPADDRESS(staticIP),
SECOND_IPADDRESS(staticIP),
THIRD_IPADDRESS(staticIP),
FOURTH_IPADDRESS(staticIP));
// Get the DHCP starting and ending scope IP addresses so that it is easy to format
DWORD startIP = dhcpInstallationUnit.GetStartIPAddress();
DWORD endIP = dhcpInstallationUnit.GetEndIPAddress();
// Add the DHCP scope message
message += String::format(
String::load(IDS_EXPRESS_FINISH_DHCP_SCOPE),
FIRST_IPADDRESS(startIP),
SECOND_IPADDRESS(startIP),
THIRD_IPADDRESS(startIP),
FOURTH_IPADDRESS(startIP),
FIRST_IPADDRESS(endIP),
SECOND_IPADDRESS(endIP),
THIRD_IPADDRESS(endIP),
FOURTH_IPADDRESS(endIP));
// Add the TAPI message
message += String::load(IDS_EXPRESS_FINISH_TAPI);
LOG_BOOL(true);
return true;
}
HRESULT
ExpressInstallationUnit::DoTapiConfig(const String& dnsName)
{
LOG_FUNCTION2(
ExpressInstallationUnit::DoTapiConfig,
dnsName);
// Comments below taken from old HTA CYS
/*
// The TAPICFG is a straight command line utility where all the required parameters can be at once supplied
// in the command line arguments and there are no sub-menus to traverse. The /Directory switch takes the DNS
// name of the NC to be created and the optional /Server switch takes the name of the domain controller on
// which the NC is to be created. If the /server switch is not specified, then the command assumes it is
// running on a DC and tries to create the NC locally.
// NDNC (non-domain naming context) is a partition that is created on Active Directory and serves as a dynamic
// directory, where its used for temporary storage (depending on TTL) of objects pre-defined in the AD schema.
// Here in TAPI we use NDNC to store user and conference information dynamically on the server.
*/
HRESULT hr = S_OK;
String commandLine = String::format(CYS_TAPI_CONFIG_COMMAND_FORMAT, dnsName.c_str());
DWORD exitCode = 0;
hr = CreateAndWaitForProcess(commandLine, exitCode);
if (SUCCEEDED(hr) &&
exitCode != 0)
{
LOG(String::format(L"Exit code = %1!x!", exitCode));
hr = E_FAIL;
}
LOG(String::format(L"hr = %1!x!", hr));
return hr;
}