windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/snapin/connects.cpp
2020-09-26 16:20:57 +08:00

638 lines
12 KiB
C++

/*++
Copyright (c) 1994-2001 Microsoft Corporation
Module Name :
connects.cpp
Abstract:
"Connect to a single server" dialog
Author:
Ronald Meijer (ronaldm)
Sergei Antonoc (sergeia)
Project:
Internet Services Manager
Revision History:
--*/
#include "stdafx.h"
#include "common.h"
#include "inetprop.h"
#include "InetMgrApp.h"
#include "iisobj.h"
#include "connects.h"
#include "objpick.h"
#define MAX_SERVERNAME_LEN (255)
const LPCTSTR g_cszInetSTPBasePath_ = _T("Software\\Microsoft\\InetStp");
const LPCTSTR g_cszMajorVersion_ = _T("MajorVersion");
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern CInetmgrApp theApp;
//
// CLoginDlg Dialog
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CLoginDlg::CLoginDlg(
IN int nType,
IN CIISMachine * pMachine,
IN CWnd * pParent OPTIONAL
)
/*++
Routine Description:
Constructor
Arguments:
int nType : Type of dialog to bring up:
LDLG_ACCESS_DENIED - Access Denied dlg
LDLG_ENTER_PASS - Enter password dlg
LDLG_IMPERSONATION - Impersonation dlg
CIISMachine * pMachine : Machine object
CWnd * pParent : Parent window
Return Value:
--*/
: CDialog(CLoginDlg::IDD, pParent),
m_nType(nType),
m_strOriginalUserName(),
m_strUserName(),
m_strPassword(),
m_pMachine(pMachine)
{
#if 0 // Keep Classwizard happy
//{{AFX_DATA_INIT(CLoginDlg)
m_strPassword = _T("");
m_strUserName = _T("");
//}}AFX_DATA_INIT
#endif // 0
ASSERT_PTR(m_pMachine);
}
void
CLoginDlg::DoDataExchange(
IN OUT CDataExchange * pDX
)
/*++
Routine Description:
Initialise/Store control data
Arguments:
CDataExchange * pDX - DDX/DDV control structure
Return Value:
None
--*/
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
DDX_Text(pDX, IDC_EDIT_USER_NAME, m_strUserName);
DDX_Text(pDX, IDC_EDIT_PASSWORD2, m_strPassword);
DDV_MaxChars(pDX, m_strPassword, PWLEN);
DDX_Control(pDX, IDC_EDIT_USER_NAME, m_edit_UserName);
DDX_Control(pDX, IDC_EDIT_PASSWORD2, m_edit_Password);
DDX_Control(pDX, IDC_STATIC_PROMPT2, m_static_Prompt);
DDX_Control(pDX, IDOK, m_button_Ok);
//}}AFX_DATA_MAP
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT_USER_NAME, SetControlStates)
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void
CLoginDlg::SetControlStates()
/*++
Routine Description:
Set UI control enabled/disabled states
Arguments:
None
Return Value:
None
--*/
{
m_button_Ok.EnableWindow(m_edit_UserName.GetWindowTextLength() > 0);
}
BOOL
CLoginDlg::OnInitDialog()
/*++
Routine Description:
WM_INITDIALOG handler. Initialize the dialog.
Arguments:
None.
Return Value:
TRUE if no focus is to be set automatically, FALSE if the focus
is already set.
--*/
{
CDialog::OnInitDialog();
CString str;
switch(m_nType)
{
case LDLG_ENTER_PASS:
//
// Change text for the "Enter Password" dialog
//
VERIFY(str.LoadString(IDS_ENTER_PASSWORD));
SetWindowText(str);
str.Format(IDS_RESOLVE_PASSWORD, m_pMachine->QueryServerName());
m_static_Prompt.SetWindowText(str);
//
// Fall through
//
case LDLG_ACCESS_DENIED:
//
// This is the default text on the dialog
//
m_strUserName = m_strOriginalUserName = m_pMachine->QueryUserName();
if (!m_strUserName.IsEmpty())
{
m_edit_UserName.SetWindowText(m_strUserName);
m_edit_Password.SetFocus();
}
else
{
m_edit_UserName.SetFocus();
}
break;
case LDLG_IMPERSONATION:
VERIFY(str.LoadString(IDS_IMPERSONATION));
SetWindowText(str);
str.Format(IDS_IMPERSONATION_PROMPT, m_pMachine->QueryServerName());
m_static_Prompt.SetWindowText(str);
m_edit_UserName.SetFocus();
break;
default:
ASSERT_MSG("Invalid dialog type");
}
SetControlStates();
return FALSE;
}
void
CLoginDlg::OnOK()
/*++
Routine Description:
OK button handler. Attempt to connect to the machine specified. If
machiname is ok, dismiss the dialog. Otherwise put up an error message
and stay active.
Arguments:
None
Return Value:
None
--*/
{
ASSERT_PTR(m_pMachine);
if (UpdateData(TRUE))
{
CError err(m_pMachine->Impersonate(m_strUserName, m_strPassword));
if (err.Failed())
{
//
// Not a proper impersonation created. Keep the dialog
// open to make corrections.
//
m_pMachine->DisplayError(err);
m_edit_Password.SetSel(0, -1);
m_edit_Password.SetFocus();
return;
}
}
EndDialog(IDOK);
}
//
// Connect to server dialog
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ConnectServerDlg::ConnectServerDlg(
IN CWnd * pParent OPTIONAL
)
/*++
Routine Description:
Constructor.
Arguments:
CWnd * pParent : Optional pointer to parent window
Return Value:
N/A
--*/
: CDialog(ConnectServerDlg::IDD, pParent),
m_fImpersonate(FALSE),
m_strServerName(),
m_strPassword(),
m_strUserName(),
m_pMachine(NULL)
{
#if 0 // Keep Classwizard happy
//{{AFX_DATA_INIT(ConnectServerDlg)
m_fImpersonate = FALSE;
m_strServerName = _T("");
m_strUserName = _T("");
m_strPassword = _T("");
//}}AFX_DATA_INIT
#endif // 0
}
void
ConnectServerDlg::DoDataExchange(
IN CDataExchange * pDX
)
/*++
Routine Description:
Initialise/Store control data
Arguments:
CDataExchange * pDX - DDX/DDV control structure
Return Value:
None
--*/
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ConnectServerDlg)
DDX_Check(pDX, IDC_CHECK_CONNECT_AS, m_fImpersonate);
DDX_Text(pDX, IDC_SERVERNAME, m_strServerName);
DDV_MaxChars(pDX, m_strServerName, MAX_SERVERNAME_LEN);
DDX_Text(pDX, IDC_EDIT_USER_NAME, m_strUserName);
DDX_Text(pDX, IDC_EDIT_PASSWORD2, m_strPassword);
DDV_MaxChars(pDX, m_strPassword, PWLEN);
DDX_Control(pDX, IDC_EDIT_USER_NAME, m_edit_UserName);
DDX_Control(pDX, IDC_EDIT_PASSWORD2, m_edit_Password);
DDX_Control(pDX, IDC_SERVERNAME, m_edit_ServerName);
DDX_Control(pDX, IDC_STATIC_USER_NAME, m_static_UserName);
DDX_Control(pDX, IDC_STATIC_PASSWORD2, m_static_Password);
DDX_Control(pDX, IDOK, m_button_Ok);
//}}AFX_DATA_MAP
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(ConnectServerDlg, CDialog)
//{{AFX_MSG_MAP(ConnectServerDlg)
ON_BN_CLICKED(IDC_CHECK_CONNECT_AS, OnCheckConnectAs)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(ID_HELP, OnButtonHelp)
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_SERVERNAME, SetControlStates)
ON_EN_CHANGE(IDC_EDIT_USER_NAME, SetControlStates)
END_MESSAGE_MAP()
void
ConnectServerDlg::SetControlStates()
/*++
Routine Description:
Set UI control enabled/disabled states.
Arguments:
None
Return Value:
None
--*/
{
m_static_UserName.EnableWindow(m_fImpersonate);
m_static_Password.EnableWindow(m_fImpersonate);
m_edit_UserName.EnableWindow(m_fImpersonate);
m_edit_Password.EnableWindow(m_fImpersonate);
m_button_Ok.EnableWindow(
m_edit_ServerName.GetWindowTextLength() > 0 &&
(m_edit_UserName.GetWindowTextLength() > 0 || !m_fImpersonate)
);
}
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
ConnectServerDlg::OnInitDialog()
/*++
Routine Description:
WM_INITDIALOG handler. Initialize the dialog.
Arguments:
None.
Return Value:
TRUE if no focus is to be set automatically, FALSE if the focus
is already set.
--*/
{
CDialog::OnInitDialog();
SetControlStates();
return TRUE;
}
void
ConnectServerDlg::OnButtonBrowse()
/*++
Routine Description:
'Browse' button handler. Browse for a computer name
Arguments:
None
Return Value:
None
--*/
{
CGetComputer picker;
if (picker.GetComputer(m_hWnd))
{
m_edit_ServerName.SetWindowText(picker.m_strComputerName);
SetControlStates();
m_button_Ok.SetFocus();
}
#ifdef _DEBUG
else
{
TRACE(_T("ConnectServerDlg::OnButtonBrowse() -> Cannot get computer name from browser\n"));
}
#endif
}
void
ConnectServerDlg::OnCheckConnectAs()
/*++
Routine Description:
"Connect As" checbox event handler. Enable/Disable username/password
controls.
Arguments:
None
Return Value:
None
--*/
{
m_fImpersonate = !m_fImpersonate;
SetControlStates();
if (m_fImpersonate)
{
m_edit_UserName.SetFocus();
m_edit_UserName.SetSel(0, -1);
}
}
void
ConnectServerDlg::OnOK()
/*++
Routine Description:
OK button handler. Attempt to connect to the machine specified. If
machiname is ok, dismiss the dialog. Otherwise put up an error message
and stay active.
Arguments:
None
Return Value:
None
--*/
{
ASSERT(m_pMachine == NULL);
CError err;
if (UpdateData(TRUE))
{
do
{
LPCTSTR lpszUserName = m_fImpersonate ? (LPCTSTR)m_strUserName : NULL;
LPCTSTR lpszPassword = m_fImpersonate ? (LPCTSTR)m_strPassword : NULL;
CString server = m_strServerName;
if (PathIsUNCServer(m_strServerName))
{
server = m_strServerName.Mid(2);
}
else
{
server = m_strServerName;
}
m_pMachine = new CIISMachine(CComAuthInfo(
server,
lpszUserName,
lpszPassword
));
if (m_pMachine)
{
//
// Verify the machine object is created.
//
err = CIISMachine::VerifyMachine(m_pMachine);
if (err.Failed())
{
//
// Not a proper machine object created. Keep the dialog
// open to make corrections.
//
m_pMachine->DisplayError(err);
m_edit_ServerName.SetSel(0, -1);
m_edit_ServerName.SetFocus();
SAFE_DELETE(m_pMachine);
}
else
{
// IIS5.1 block for iis6 remote administration
CRegKey rk;
rk.Create(HKEY_LOCAL_MACHINE, g_cszInetSTPBasePath_);
DWORD major;
if (ERROR_SUCCESS == rk.QueryValue(major, g_cszMajorVersion_))
{
if (m_pMachine->QueryMajorVersion() == 6 && major == 5)
{
AfxMessageBox(IDS_UPGRADE_TO_IIS6);
SAFE_DELETE(m_pMachine);
}
}
}
}
else
{
err = ERROR_NOT_ENOUGH_MEMORY;
err.MessageBox();
}
}
while(FALSE);
}
//
// Dismiss the dialog only if a proper machine object was created
//
if (m_pMachine)
{
EndDialog(IDOK);
}
}
#define HIDD_CONNECT_SERVER 0x29cd9
void
ConnectServerDlg::OnButtonHelp()
{
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, HIDD_CONNECT_SERVER);
}