Leaked source code of windows server 2003
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.
 
 
 
 
 
 

795 lines
17 KiB

// Copyright (c) 1997-1999 Microsoft Corporation
//
// Tab state
//
// 3-11-98 sburns
#include "precomp.h"
#include "state.h"
#include "resource.h"
#include "common.h"
//#include "cred.h"
class Settings
{
public:
void Refresh();
CHString ComputerDomainDNSName;
CHString DomainName;
CHString FullComputerName;
CHString ShortComputerName;
CHString NetBIOSComputerName;
bool SyncDNSNames;
bool JoinedToWorkgroup;
bool NeedsReboot;
};
//=========================================================
static bool machine_is_dc = false;
static bool networking_installed = false;
static Settings original;
static Settings current;
static const CHString SYNC_KEY(
TEXT("System\\CurrentControlSet\\Services\\Tcpip\\Parameters"));
static const CHString SYNC_VALUE(TEXT("SyncDomainWithMembership"));
//=========================================================
bool readSyncFlag()
{
bool retval = true;
/*
HKEY hKey = 0;
do
{
LONG result =
Win::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
SYNC_KEY,
KEY_READ,
hKey);
if (result != ERROR_SUCCESS)
{
break;
}
// default is to sync.
DWORD data = 1;
DWORD data_size = sizeof(data);
result = Win::RegQueryValueEx(
hKey,
SYNC_VALUE,
0,
(BYTE*) &data,
&data_size);
if (result != ERROR_SUCCESS)
{
break;
}
retval = data ? true : false;
}
while (0);
if (hKey)
{
Win::RegCloseKey(hKey);
}
*/
return retval;
}
//=========================================================
void writeSyncFlag(bool flag)
{
/*
HKEY hKey = 0;
do
{
LONG result =
Win::RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
SYNC_KEY,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
0,
hKey,
0);
if (result != ERROR_SUCCESS)
{
break;
}
DWORD data = flag ? 1 : 0;
DWORD data_size = sizeof(data);
Win::RegSetValueEx(
hKey,
SYNC_VALUE,
REG_DWORD,
(BYTE*) &data,
data_size);
}
while (0);
if (hKey)
{
Win::RegCloseKey(hKey);
}
*/
}
//=========================================================
bool isNetworkingInstalled()
{
/* SC_HANDLE handle = ::OpenSCManager(0, 0, GENERIC_READ);
if (!handle)
{
TRACE(TEXT("can't open SCM"));
return false;
}
SC_HANDLE wks =
::OpenService(
handle,
TEXT("LanmanWorkstation"),
SERVICE_QUERY_STATUS);
if (!wks)
{
TRACE(TEXT("can't open workstation service: not installed"));
::CloseServiceHandle(handle);
return false;
}
bool result = false;
SERVICE_STATUS status;
memset(&status, 0, sizeof(status));
if (::QueryServiceStatus(wks, &status))
{
if (status.dwCurrentState == SERVICE_RUNNING)
{
result = true;
}
}
::CloseServiceHandle(wks);
::CloseServiceHandle(handle);
TRACE(
CHString::format(
TEXT("workstation service %1 running"),
result ? TEXT("is") : TEXT("is NOT")));
return result;
*/
return true;
}
//---------------------------------------------------------
State::State()
: must_reboot(false)
{
original.Refresh();
current = original;
}
//---------------------------------------------------------
State::~State()
{
}
//=========================================================
void Settings::Refresh()
{
/*
CHString unknown = CHString::load(IDS_UNKNOWN);
ComputerDomainDNSName = unknown;
DomainName = unknown;
FullComputerName = unknown;
ShortComputerName = unknown;
SyncDNSNames = readSyncFlag();
JoinedToWorkgroup = true;
DSROLE_PRIMARY_DOMAIN_INFO_BASIC* info = 0;
DWORD err = MyDsRoleGetPrimaryDomainInformation(0, info);
if (err == NO_ERROR)
{
if (info->DomainNameDns)
{
DomainName = info->DomainNameDns;
}
else if (info->DomainNameFlat)
{
DomainName = info->DomainNameFlat;
}
// this is the workgroup name iff JoinedToWorkgroup == true
switch (info->MachineRole)
{
case DsRole_RoleBackupDomainController:
case DsRole_RolePrimaryDomainController:
{
machine_is_dc = true;
JoinedToWorkgroup = false;
break;
}
case DSRole_RoleStandaloneWorkstation:
case DsRole_RoleStandaloneServer:
{
machine_is_dc = false;
JoinedToWorkgroup = true;
if (DomainName.empty())
{
DomainName = CHString::load(IDS_DEFAULT_WORKGROUP);
}
break;
}
case DsRole_RoleMemberWorkstation:
case DsRole_RoleMemberServer:
{
machine_is_dc = false;
JoinedToWorkgroup = false;
break;
}
default:
{
assert(false);
break;
}
}
::DsRoleFreeMemory(info);
}
else
{
AppError(0, HRESULT_FROM_WIN32(err),
CHString::load(IDS_ERROR_READING_MEMBERSHIP));
}
networking_installed = isNetworkingInstalled();
bool tcp_installed = networking_installed && IsTCPIPInstalled();
CHString active_full_name;
HKEY hkey = 0;
LONG result =
Win::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
TEXT("System\\CurrentControlSet\\Control\\ComputerName\\ComputerName"),
KEY_READ,
hkey);
if (result == ERROR_SUCCESS)
{
NetBIOSComputerName = Win::RegQueryValueSz(hkey, TEXT("ComputerName"));
}
Win::RegCloseKey(hkey);
if (tcp_installed)
{
HKEY hkey = 0;
LONG result =
Win::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
TEXT("System\\CurrentControlSet\\Services\\Tcpip\\Parameters"),
KEY_READ,
hkey);
if (result == ERROR_SUCCESS)
{
CHString active_short_name =
Win::RegQueryValueSz(hkey, TEXT("Hostname"));
CHString short_name =
Win::RegQueryValueSz(hkey, TEXT("NV Hostname"));
ShortComputerName =
short_name.empty() ? active_short_name : short_name;
CHString active_domain_name =
Win::RegQueryValueSz(hkey, TEXT("Domain"));
CHString domain_name =
Win::RegQueryValueSz(hkey, TEXT("NV Domain"));
ComputerDomainDNSName =
domain_name.empty() ? active_domain_name : domain_name;
FullComputerName =
ShortComputerName + TEXT(".") + ComputerDomainDNSName;
active_full_name =
active_short_name + TEXT(".") + active_domain_name;
}
Win::RegCloseKey(hkey);
}
else
{
LONG result =
Win::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
TEXT("System\\CurrentControlSet\\Control\\ComputerName\\ActiveComputerName"),
KEY_READ,
hkey);
if (result == ERROR_SUCCESS)
{
active_full_name = Win::RegQueryValueSz(hkey, TEXT("ComputerName"));
}
Win::RegCloseKey(hkey);
ShortComputerName = NetBIOSComputerName;
FullComputerName = ShortComputerName;
}
NeedsReboot = active_full_name != FullComputerName;
*/
}
//---------------------------------------------------------
void State::Init(CWbemClassObject &computer,
CWbemClassObject &os,
CWbemClassObject dns)
{
m_computer = computer;
m_OS = os;
m_DNS = dns;
}
//---------------------------------------------------------
void State::Refresh()
{
}
//---------------------------------------------------------
bool State::NeedsReboot() const
{
return original.NeedsReboot;
}
//---------------------------------------------------------
bool State::IsMachineDC() const
{
return machine_is_dc;
}
//---------------------------------------------------------
bool State::IsNetworkingInstalled() const
{
return networking_installed;
}
//---------------------------------------------------------
CHString State::GetFullComputerName() const
{
return current.FullComputerName;
}
//---------------------------------------------------------
CHString State::GetDomainName() const
{
return current.DomainName;
}
//---------------------------------------------------------
void State::SetDomainName(const CHString& name)
{
current.DomainName = name;
}
//---------------------------------------------------------
bool State::IsMemberOfWorkgroup() const
{
return current.JoinedToWorkgroup;
}
//---------------------------------------------------------
void State::SetIsMemberOfWorkgroup(bool yesNo)
{
current.JoinedToWorkgroup = yesNo;
}
//---------------------------------------------------------
CHString State::GetShortComputerName() const
{
return current.ShortComputerName;
}
//---------------------------------------------------------
void State::SetShortComputerName(const CHString& name)
{
current.ShortComputerName = name;
// current.NetBIOSComputerName = DNS::HostnameToNetBIOSName(name);
setFullComputerName();
}
//---------------------------------------------------------
bool State::WasShortComputerNameChanged() const
{
return true;
//original.ShortComputerName.icompare(current.ShortComputerName) != 0;
}
//---------------------------------------------------------
CHString State::GetComputerDomainDNSName() const
{
return current.ComputerDomainDNSName;
}
//---------------------------------------------------------
void State::SetComputerDomainDNSName(const CHString& newName)
{
current.ComputerDomainDNSName = newName;
setFullComputerName();
}
//---------------------------------------------------------
void State::setFullComputerName()
{
current.FullComputerName =
current.ShortComputerName
+ TEXT(".")
+ current.ComputerDomainDNSName;
}
//---------------------------------------------------------
bool State::WasMembershipChanged() const
{
return true;
// original.DomainName.icompare(current.DomainName) != 0
// || original.JoinedToWorkgroup != current.JoinedToWorkgroup;
}
//---------------------------------------------------------
bool State::ChangesNeedSaving() const
{
/* if (
original.ComputerDomainDNSName.icompare(
current.ComputerDomainDNSName) != 0
|| WasMembershipChanged()
|| WasShortComputerNameChanged()
|| SyncDNSNamesWasChanged())
{
return true;
}
*/
return false;
}
//---------------------------------------------------------
bool State::GetSyncDNSNames() const
{
return current.SyncDNSNames;
}
//---------------------------------------------------------
void State::SetSyncDNSNames(bool yesNo)
{
current.SyncDNSNames = yesNo;
}
//---------------------------------------------------------
bool State::SyncDNSNamesWasChanged() const
{
return original.SyncDNSNames != current.SyncDNSNames;
}
//---------------------------------------------------------
CHString massageUserName(const CHString& domainName, const CHString& userName)
{
/* if (!domainName.IsEmpty() && !userName.IsEmpty())
{
static const CHString DOMAIN_SEP_CHAR = TEXT("\\");
CHString name = userName;
int pos = userName.find(DOMAIN_SEP_CHAR);
if (pos == CHString::npos)
{
return domainName + DOMAIN_SEP_CHAR + name;
}
}
*/
return userName;
}
//=======================================================
NET_API_STATUS myNetJoinDomain(
const CHString& domain,
const CHString& username,
const CHString& password,
ULONG flags)
{
/* assert(!domain.empty());
NET_API_STATUS status =
::NetJoinDomain(
0, // this machine
domain.c_str(),
0, // default OU
username.empty() ? 0 : username.c_str(),
password.c_str(),
flags);
TRACE(CHString::format(TEXT("Error 0x%1!X! (!0 => error)"), status));
return status;
*/
return 0;
}
//=======================================================
HRESULT join(HWND dialog, const CHString& name, bool isWorkgroupJoin)
{
/* assert(!name.empty());
assert(Win::IsWindow(dialog));
Win::CursorSetting cursor(IDC_WAIT);
State& state = State::GetInstance();
CHString username = massageUserName(name, state.GetUsername());
CHString password = state.GetPassword();
ULONG flags = 0;
if (!isWorkgroupJoin)
{
flags =
NETSETUP_JOIN_DOMAIN
| NETSETUP_ACCT_CREATE
| NETSETUP_DOMAIN_JOIN_IF_JOINED;
}
NET_API_STATUS status =
myNetJoinDomain(name, username, password, flags);
if (
status == ERROR_ACCESS_DENIED
&& (flags & NETSETUP_ACCT_CREATE) )
{
// retry without account create flag for the case where the account
// already exists
TRACE(TEXT("Retry without account create flag"));
status =
myNetJoinDomain(
name,
username,
password,
flags & ~NETSETUP_ACCT_CREATE);
}
if (status == NERR_Success)
{
AppMessage(
dialog,
CHString::format(
isWorkgroupJoin ? IDS_WORKGROUP_WELCOME : IDS_DOMAIN_WELCOME,
name.c_str()));
}
return HRESULT_FROM_WIN32(status);
*/
return 0;
}
//=======================================================
HRESULT rename(HWND dialog, const CHString& newName)
{
/* assert(!newName.empty());
assert(Win::IsWindow(dialog));
Win::CursorSetting cursor(IDC_WAIT);
State& state = State::GetInstance();
CHString username =
massageUserName(state.GetDomainName(), state.GetUsername());
CHString password = state.GetPassword();
ULONG flags = NETSETUP_ACCT_CREATE;
TRACE(TEXT("Calling NetRenameMachineInDomain"));
TRACE( TEXT("lpServer : (null)"));
TRACE(CHString::format(TEXT("lpNewMachineName : %1"), newName.c_str()));
TRACE(CHString::format(TEXT("lpAccount : %1"), username.c_str()));
TRACE(CHString::format(TEXT("fRenameOptions : 0x%1!X!"), flags));
NET_API_STATUS status =
::NetRenameMachineInDomain(
0, // this machine
newName.c_str(),
username.empty() ? 0 : username.c_str(),
password.c_str(),
flags);
TRACE(CHString::format(TEXT("Error 0x%1!X! (!0 => error)"), status));
// if (status == NERR_Success)
// {
// AppMessage(dialog, IDS_NAME_CHANGED);
// state.SetMustRebootFlag(true);
// }
return HRESULT_FROM_WIN32(status);
*/
return 0;
}
//=======================================================
static NET_API_STATUS myNetUnjoinDomain(ULONG flags)
{
return 0;
}
//=======================================================
HRESULT unjoin(HWND dialog, const CHString& domain)
{
return S_OK;
}
//=======================================================
HRESULT setDomainDNSName(HWND dialog, const CHString& newDomainDNSName)
{
return S_OK;
}
//=======================================================
HRESULT setShortName(HWND dialog, const CHString& newShortName)
{
return S_OK;
}
//=======================================================
bool getCredentials(HWND dialog, int promptResID = 0)
{
return true;
}
//------------------------------------------------------
bool State::doSaveDomainChange(HWND dialog)
{
return true;
}
//------------------------------------------------------
bool State::doSaveWorkgroupChange(HWND dialog)
{
return true;
}
//------------------------------------------------------
bool State::doSaveNameChange(HWND dialog)
{
return true;
}
//------------------------------------------------------
bool State::SaveChanges(HWND dialog)
{
return true;
}
//------------------------------------------------------
CHString State::GetUsername() const
{
return username;
}
//------------------------------------------------------
CHString State::GetPassword() const
{
return password;
}
//------------------------------------------------------
void State::SetMustRebootFlag(bool yesNo)
{
must_reboot = yesNo;
}
//------------------------------------------------------
bool State::MustReboot() const
{
return must_reboot;
}
//------------------------------------------------------
CHString State::GetNetBIOSComputerName() const
{
return current.NetBIOSComputerName;
}
//------------------------------------------------------
CHString State::GetOriginalShortComputerName() const
{
return original.ShortComputerName;
}
//------------------------------------------------------
void State::SetUsername(const CHString& name)
{
username = name;
}
//------------------------------------------------------
void State::SetPassword(const CHString& pass)
{
password = pass;
}