// 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; }