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.
346 lines
8.0 KiB
346 lines
8.0 KiB
// Copyright (c) 1997-1999 Microsoft Corporation
|
|
//
|
|
// Post-operation code
|
|
//
|
|
// 1 Dec 1999 sburns
|
|
|
|
|
|
|
|
#include "headers.hxx"
|
|
#include "ProgressDialog.hpp"
|
|
#include "state.hpp"
|
|
#include "shortcut.hpp"
|
|
#include "dnssetup.hpp"
|
|
#include "resource.h"
|
|
|
|
|
|
|
|
void
|
|
InstallDisplaySpecifiers(ProgressDialog& dialog)
|
|
{
|
|
LOG_FUNCTION(InstallDisplaySpecifiers);
|
|
|
|
State& state = State::GetInstance();
|
|
|
|
// applies only to 1st dc in forest
|
|
ASSERT(state.GetOperation() == State::FOREST);
|
|
|
|
HRESULT hr = S_OK;
|
|
do
|
|
{
|
|
// install display specifiers for all locales supported by the
|
|
// product. 298923, 380160
|
|
|
|
RegistryKey key;
|
|
|
|
// REVIEWED-2002/02/28-sburns we should not adjust the SD on this key,
|
|
// as we don't own it.
|
|
|
|
hr = key.Create(HKEY_LOCAL_MACHINE, REGSTR_PATH_RUNONCE);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
String exePath = Win::GetSystemDirectory() + L"\\dcphelp.exe";
|
|
|
|
// REVIEWED-2002/02/27-sburns we're using the full path to the exe.
|
|
|
|
hr = key.SetValue(L"dcpromo disp spec import", exePath);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
}
|
|
while (0);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
popup.Error(
|
|
dialog.GetHWND(),
|
|
hr,
|
|
IDS_LANGUAGE_FIXUP_FAILED);
|
|
state.AddFinishMessage(
|
|
String::load(IDS_LANGUAGE_FIXUP_FAILED_FINISH));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
DoDnsConfiguration(ProgressDialog& dialog)
|
|
{
|
|
LOG_FUNCTION(DoDnsConfiguration);
|
|
|
|
State& state = State::GetInstance();
|
|
|
|
// applies only in new domain scenarios
|
|
|
|
ASSERT(
|
|
state.GetOperation() == State::FOREST
|
|
|| state.GetOperation() == State::TREE
|
|
|| state.GetOperation() == State::CHILD);
|
|
|
|
if (state.ShouldInstallAndConfigureDns())
|
|
{
|
|
String domain = state.GetNewDomainDNSName();
|
|
if (
|
|
!InstallAndConfigureDns(
|
|
dialog,
|
|
domain,
|
|
state.GetOperation() == State::FOREST) )
|
|
{
|
|
state.AddFinishMessage(String::load(IDS_ERROR_DNS_CONFIG_FAILED));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Disables media sense so that the tcp/ip stack doesn't unload if the
|
|
// net card is yanked. This to allow laptop demos of the DS. 353687
|
|
|
|
void
|
|
DisableMediaSense()
|
|
{
|
|
LOG_FUNCTION(DisableMediaSense);
|
|
|
|
HRESULT hr = S_OK;
|
|
do
|
|
{
|
|
RegistryKey key;
|
|
|
|
static String
|
|
TCPIP_KEY(L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters");
|
|
|
|
// We should not attempt to create this key if it is not already
|
|
// present: if it is not there, then tcp/ip is not installed, and
|
|
// setting this media sense value is pointless. So we use Open here.
|
|
|
|
hr = key.Open(HKEY_LOCAL_MACHINE, TCPIP_KEY, KEY_SET_VALUE);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
hr = key.SetValue(L"DisableDHCPMediaSense", 1);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
LOG(L"DHCP Media sense disabled");
|
|
}
|
|
while (0);
|
|
|
|
#ifdef LOGGING_BUILD
|
|
if (FAILED(hr))
|
|
{
|
|
LOG(L"DHCP Media sense NOT disabled");
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// Disables an old LSA notification thing. 326033
|
|
|
|
void
|
|
DisablePassfiltDll()
|
|
{
|
|
LOG_FUNCTION(DisablePassfiltDll);
|
|
|
|
HRESULT hr = S_OK;
|
|
do
|
|
{
|
|
RegistryKey key;
|
|
|
|
static const String
|
|
LSA_KEY(L"System\\CurrentControlSet\\Control\\Lsa");
|
|
|
|
static const String NOTIFICATION_VALUE(L"Notification Packages");
|
|
|
|
hr =
|
|
key.Open(
|
|
HKEY_LOCAL_MACHINE,
|
|
|
|
// REVIEWED-2002/02/28-sburns this level of access is correct.
|
|
|
|
LSA_KEY,
|
|
KEY_READ | KEY_WRITE | KEY_QUERY_VALUE);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
StringList values;
|
|
hr = key.GetValue(NOTIFICATION_VALUE, std::back_inserter(values));
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
// remove all instances of "passfilt.dll" from the set of strings, if
|
|
// present.
|
|
static String PASSFILT(L"passfilt.dll");
|
|
size_t startElements = values.size();
|
|
|
|
StringList::iterator last = values.end();
|
|
for (
|
|
StringList::iterator i = values.begin();
|
|
i != last;
|
|
/* empty */ )
|
|
{
|
|
if (i->icompare(PASSFILT) == 0)
|
|
{
|
|
values.erase(i++);
|
|
}
|
|
else
|
|
{
|
|
++i;
|
|
}
|
|
}
|
|
|
|
// if changed, write it back to the registry
|
|
if (values.size() != startElements)
|
|
{
|
|
hr = key.SetValue(NOTIFICATION_VALUE, values.begin(), values.end());
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
|
|
LOG(L"passfilt.dll removed");
|
|
}
|
|
else
|
|
{
|
|
LOG(L"passfilt.dll not found");
|
|
}
|
|
}
|
|
while (0);
|
|
|
|
#ifdef LOGGING_BUILD
|
|
if (FAILED(hr))
|
|
{
|
|
LOG(L"Notification Packages not updated due to error.");
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the promotion was for a downlevel DC upgrade, then check if the local
|
|
// machine's dns hostname is bad, if so, add a message to the finish page. A
|
|
// bad name is one we believe will have problems being registered in DNS after
|
|
// a promotion.
|
|
//
|
|
// Since the computer cannot be renamed during a downlevel upgrade, we defer
|
|
// this message til the end of the upgrade. (If the machine is not a
|
|
// downlevel upgrade, then the wizard startup code detects the bad name and
|
|
// blocks until the name is fixed.
|
|
|
|
void
|
|
CheckComputerNameOnDownlevelUpgrade()
|
|
{
|
|
LOG_FUNCTION(CheckComputerNameOnDownlevelUpgrade);
|
|
|
|
State& state = State::GetInstance();
|
|
|
|
State::RunContext context = state.GetRunContext();
|
|
if (
|
|
context != State::BDC_UPGRADE
|
|
&& context != State::PDC_UPGRADE)
|
|
{
|
|
// machine is not a downlevel DC upgrade, so we need do nothing
|
|
|
|
return;
|
|
}
|
|
|
|
// Then check the computer name to ensure that it can be registered in
|
|
// DNS.
|
|
|
|
String hostname =
|
|
Win::GetComputerNameEx(::ComputerNamePhysicalDnsHostname);
|
|
|
|
DNS_STATUS status =
|
|
MyDnsValidateName(hostname, ::DnsNameHostnameLabel);
|
|
|
|
switch (status)
|
|
{
|
|
case DNS_ERROR_NON_RFC_NAME:
|
|
{
|
|
state.AddFinishMessage(
|
|
String::format(
|
|
IDS_FINISH_NON_RFC_COMPUTER_NAME,
|
|
hostname.c_str()));
|
|
break;
|
|
}
|
|
case DNS_ERROR_NUMERIC_NAME:
|
|
{
|
|
state.AddFinishMessage(
|
|
String::format(
|
|
IDS_FINISH_NUMERIC_COMPUTER_NAME,
|
|
hostname.c_str()));
|
|
break;
|
|
}
|
|
case DNS_ERROR_INVALID_NAME_CHAR:
|
|
case ERROR_INVALID_NAME:
|
|
{
|
|
state.AddFinishMessage(
|
|
String::format(
|
|
IDS_FINISH_BAD_COMPUTER_NAME,
|
|
hostname.c_str()));
|
|
break;
|
|
}
|
|
case ERROR_SUCCESS:
|
|
default:
|
|
{
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
DoPostOperationStuff(ProgressDialog& progress)
|
|
{
|
|
LOG_FUNCTION(DoPostOperationStuff);
|
|
|
|
State& state = State::GetInstance();
|
|
|
|
switch (state.GetOperation())
|
|
{
|
|
case State::FOREST:
|
|
{
|
|
// a new forest has been created
|
|
|
|
InstallDisplaySpecifiers(progress); // 228682
|
|
|
|
// fall-thru
|
|
}
|
|
case State::TREE:
|
|
case State::CHILD:
|
|
{
|
|
// a new domain has been created
|
|
|
|
DoDnsConfiguration(progress);
|
|
|
|
// fall-thru
|
|
}
|
|
case State::REPLICA:
|
|
{
|
|
// DoToolsInstallation(progress); // 220660
|
|
|
|
PromoteConfigureToolShortcuts(progress);
|
|
|
|
DisableMediaSense(); // 353687
|
|
DisablePassfiltDll(); // 326033
|
|
|
|
// NTRAID#NTBUG9-268715-2001/01/04-sburns
|
|
CheckComputerNameOnDownlevelUpgrade();
|
|
|
|
break;
|
|
}
|
|
case State::ABORT_BDC_UPGRADE:
|
|
case State::DEMOTE:
|
|
{
|
|
DemoteConfigureToolShortcuts(progress); // 366738
|
|
break;
|
|
}
|
|
case State::NONE:
|
|
{
|
|
ASSERT(false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|