|
|
//+----------------------------------------------------------------------------
//
// DS Administration MMC snapin.
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1999
//
// File: DSDlgs.cpp
//
// Contents: TBD
//
// History: 02-Oct-96 WayneSc Created
//
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "resource.h"
#include "dssnap.h"
#include "uiutil.h"
#include "DSDlgs.h"
#include "helpids.h"
#include "dsrole.h" // DsRoleGetPrimaryDomainInformation
#include <lm.h>
#include <dsgetdc.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#include "globals.h"
/////////////////////////////////////////////////////////////////////////////
// CChangePassword dialog
CChangePassword::CChangePassword(CWnd* pParent /*=NULL*/) : CHelpDialog(CChangePassword::IDD, pParent), m_ConfirmPwd(), m_NewPwd(), m_LastEncryptionResult(S_OK), m_bAllowMustChangePwdCheck(TRUE) { //{{AFX_DATA_INIT(CChangePassword)
m_ChangePwd = FALSE; //}}AFX_DATA_INIT
}
BOOL CChangePassword::OnInitDialog() { CHelpDialog::OnInitDialog();
SendDlgItemMessage( IDC_NEW_PASSWORD, EM_LIMITTEXT, (WPARAM)MAX_PASSWORD_LENGTH, 0);
SendDlgItemMessage( IDC_CONFIRM_PASSWORD, EM_LIMITTEXT, (WPARAM)MAX_PASSWORD_LENGTH, 0);
GetDlgItem(IDC_CHECK_PASSWORD_MUST_CHANGE)->EnableWindow(m_bAllowMustChangePwdCheck);
return TRUE; }
void CChangePassword::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CChangePassword)
DDX_Check(pDX, IDC_CHECK_PASSWORD_MUST_CHANGE, m_ChangePwd); //}}AFX_DATA_MAP
HRESULT hr1 = DDX_EncryptedText(pDX, IDC_CONFIRM_PASSWORD, m_ConfirmPwd); HRESULT hr2 = DDX_EncryptedText(pDX, IDC_NEW_PASSWORD, m_NewPwd);
// NTRAID#NTBUG9-635046-2002/06/10-artm
// If storing user entered values into encrypted buffer . . .
if (pDX && pDX->m_bSaveAndValidate) { m_LastEncryptionResult = S_OK;
// . . . check for an encryption failure. Either or both may fail,
// but we only need to keep track of one failure.
if (FAILED(hr1)) { m_LastEncryptionResult = hr1; }
if (FAILED(hr2)) { m_LastEncryptionResult = hr2; } }
// Double check that the max password length hasn't been
// exceeded (by someone altering the validation code in
// OnInitDialog()).
ASSERT(m_ConfirmPwd.GetLength() <= MAX_PASSWORD_LENGTH); ASSERT(m_NewPwd.GetLength() <= MAX_PASSWORD_LENGTH); }
void CChangePassword::Clear() { // Reset the passwords to empty.
m_ConfirmPwd.Clear(); m_NewPwd.Clear();
// No possible problems with the password storage now.
m_LastEncryptionResult = S_OK;
// Reset the password boxes on the dialog.
// NTRAID#NTBUG9-628311-2002/05/29-artm
// You might be tempted to call UpdateData(FALSE) instead of having this extra logic.
// It won't work though since DDX_Check() apparently cannot be called after the dialog
// has been initialized.
SetDlgItemText(IDC_CONFIRM_PASSWORD, L""); SetDlgItemText(IDC_NEW_PASSWORD, L""); }
BEGIN_MESSAGE_MAP(CChangePassword, CHelpDialog) END_MESSAGE_MAP()
void CChangePassword::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_CHANGE_PASSWORD); } }
/////////////////////////////////////////////////////////////////////////////
// Helper functions for CChooseDomainDlg and CChooseDCDlg
//
//+---------------------------------------------------------------------------
//
// Function: BrowseDomainTree
//
// Synopsis: This function invokes IDsBrowseDomainTree::BrowseTo(),
// which brings up the domain tree browse dialog, and returns the
// selected domain's DNS name
//
// NOTE: the OUT parameter needs to be LocalFreeString() by the caller
// NOTE: this function will return S_FALSE if user clicks Cancel button
//
//----------------------------------------------------------------------------
HRESULT BrowseDomainTree( IN HWND hwndParent, IN LPCTSTR pszServer, OUT LPTSTR *ppszDomainDnsName ) { ASSERT(ppszDomainDnsName); ASSERT(!(*ppszDomainDnsName)); // prevent memory leak
*ppszDomainDnsName = NULL;
CComPtr<IDsBrowseDomainTree> spDsDomains; HRESULT hr = ::CoCreateInstance(CLSID_DsDomainTreeBrowser, NULL, CLSCTX_INPROC_SERVER, IID_IDsBrowseDomainTree, reinterpret_cast<void **>(&spDsDomains)); if (SUCCEEDED(hr)) { if (pszServer && *pszServer) hr = spDsDomains->SetComputer(pszServer, NULL, NULL); // use default credential
if (SUCCEEDED(hr)) { LPTSTR lpszDomainPath; hr = spDsDomains->BrowseTo( hwndParent, //HWND hwndParent
&lpszDomainPath, // LPWSTR *ppszTargetPath
DBDTF_RETURNINBOUND); if ( (hr == S_OK) && lpszDomainPath) { *ppszDomainDnsName = lpszDomainPath; //should be freed by CoTaskMemFree later
} } }
return hr; }
HRESULT GetDCOfDomain( IN CString& csDomainName, OUT CString& csDCName, IN BOOL bForce ) { ASSERT(csDomainName.IsEmpty() == FALSE);
CString csServerName; DWORD dwErr = 0;
csDCName.Empty();
PDOMAIN_CONTROLLER_INFO pDCInfo = NULL; if (bForce) dwErr = DsGetDcName(NULL, csDomainName, NULL, NULL, DS_DIRECTORY_SERVICE_PREFERRED | DS_FORCE_REDISCOVERY, &pDCInfo); else dwErr = DsGetDcName(NULL, csDomainName, NULL, NULL, DS_DIRECTORY_SERVICE_PREFERRED, &pDCInfo);
if (ERROR_SUCCESS == dwErr) { if ( !(pDCInfo->Flags & DS_DS_FLAG) ) { // down level domain
NetApiBufferFree(pDCInfo); return S_OK; }
csDCName = pDCInfo->DomainControllerName; NetApiBufferFree(pDCInfo); }
return HRESULT_FROM_WIN32(dwErr); }
//+---------------------------------------------------------------------------
//
// Function: GetDnsNameOfDomainOrForest
//
// Synopsis: Given a server name or a domain name (either NETBIOS or DNS),
// this function will return the DNS name for its domain or forest.
//
// Parameters:
// csName, // a server name or a domain name
// csDnsName, // hold the returning DNS name
// bIsInputADomainName, // TRUE if csName is a domain name, FALSE if it's a server name
// bRequireDomain // TRUE for a domain dns name, FALSE for a forest dns name
//
//----------------------------------------------------------------------------
HRESULT GetDnsNameOfDomainOrForest( IN CString& csName, OUT CString& csDnsName, IN BOOL bIsInputADomainName, IN BOOL bRequireDomain ) {
BOOL bRetry = FALSE; PDSROLE_PRIMARY_DOMAIN_INFO_BASIC pBuffer = NULL; CString csServerName; DWORD dwErr = 0;
csDnsName.Empty();
do { if (bIsInputADomainName) { PDOMAIN_CONTROLLER_INFO pDCInfo = NULL; if (bRetry) dwErr = DsGetDcName(NULL, csName, NULL, NULL, DS_DIRECTORY_SERVICE_PREFERRED | DS_FORCE_REDISCOVERY, &pDCInfo); else dwErr = DsGetDcName(NULL, csName, NULL, NULL, DS_DIRECTORY_SERVICE_PREFERRED, &pDCInfo);
if (ERROR_SUCCESS == dwErr) { if ( !(pDCInfo->Flags & DS_DS_FLAG) ) { // down level domain
NetApiBufferFree(pDCInfo); return S_OK; }
DWORD dwExpectFlag = (bRequireDomain ? DS_DNS_DOMAIN_FLAG : DS_DNS_FOREST_FLAG);
if (pDCInfo->Flags & dwExpectFlag) { // skip call to DsRoleGetPrimaryDomainInformation()
csDnsName = (bRequireDomain ? pDCInfo->DomainName : pDCInfo->DnsForestName); NetApiBufferFree(pDCInfo);
//
// The DNS name is in absolute form, remove the ending dot
//
if (csDnsName.Right(1) == _T(".")) csDnsName.SetAt(csDnsName.GetLength() - 1, _T('\0'));
return S_OK;
} else { csServerName = pDCInfo->DomainControllerName; NetApiBufferFree(pDCInfo); } } else { return HRESULT_FROM_WIN32(dwErr); } } else { csServerName = csName; }
dwErr = DsRoleGetPrimaryDomainInformation( csServerName, DsRolePrimaryDomainInfoBasic, (PBYTE *)&pBuffer); if (RPC_S_SERVER_UNAVAILABLE == dwErr && bIsInputADomainName && !bRetry) bRetry = TRUE; // only retry once
else break;
} while (1);
if (ERROR_SUCCESS == dwErr) { csDnsName = (bRequireDomain ? pBuffer->DomainNameDns : pBuffer->DomainForestName); if (csDnsName.IsEmpty()) { if (pBuffer->Flags & DSROLE_PRIMARY_DS_RUNNING) csDnsName = pBuffer->DomainNameFlat; }
DsRoleFreeMemory(pBuffer);
//
// In case the DNS name is in absolute form, remove the ending dot
//
if (csDnsName.Right(1) == _T(".")) csDnsName.SetAt(csDnsName.GetLength() - 1, _T('\0'));
}
return HRESULT_FROM_WIN32(dwErr); }
/////////////////////////////////////////////////////////////////////////////
// CChooseDomainDlg dialog
CChooseDomainDlg::CChooseDomainDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CChooseDomainDlg::IDD, pParent) { //{{AFX_DATA_INIT(CChooseDomainDlg)
m_csTargetDomain = _T(""); m_bSaveCurrent = FALSE; //}}AFX_DATA_INIT
}
void CChooseDomainDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CChooseDomainDlg)
DDX_Text(pDX, IDC_SELECTDOMAIN_DOMAIN, m_csTargetDomain); DDX_Check(pDX, IDC_SAVE_CURRENT_CHECK, m_bSaveCurrent); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CChooseDomainDlg, CHelpDialog) //{{AFX_MSG_MAP(CChooseDomainDlg)
ON_BN_CLICKED(IDC_SELECTDOMAIN_BROWSE, OnSelectdomainBrowse) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChooseDomainDlg message handlers
void CChooseDomainDlg::OnSelectdomainBrowse() { CWaitCursor cwait;
HRESULT hr = S_OK; LPTSTR lpszDomainDnsName = NULL; CString csDomainName, csDCName;
GetDlgItemText(IDC_SELECTDOMAIN_DOMAIN, csDomainName); csDomainName.TrimLeft(); csDomainName.TrimRight(); if (!csDomainName.IsEmpty()) hr = GetDCOfDomain(csDomainName, csDCName, FALSE); if (SUCCEEDED(hr)) { hr = BrowseDomainTree(m_hWnd, csDCName, &lpszDomainDnsName); if ( FAILED(hr) && !csDCName.IsEmpty() && HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE) == hr ) { // force the cached info in DsGetDcName to be refreshed
hr = GetDCOfDomain(csDomainName, csDCName, TRUE); if (SUCCEEDED(hr)) hr = BrowseDomainTree(m_hWnd, csDCName, &lpszDomainDnsName); }
if ( (hr == S_OK) && lpszDomainDnsName ) { SetDlgItemText(IDC_SELECTDOMAIN_DOMAIN, lpszDomainDnsName); CoTaskMemFree(lpszDomainDnsName); } } // JonN 9/05/01 464466
// After a fail to Locate Domain Controllers, Browse button repeatedly fails.
else { SetDlgItemText(IDC_SELECTDOMAIN_DOMAIN, L""); } if (FAILED(hr)) { PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csDomainName)));
ReportErrorEx(m_hWnd,IDS_CANT_BROWSE_DOMAIN, hr, MB_OK | MB_ICONERROR, apv, 1, 0); }
GetDlgItem(IDC_SELECTDOMAIN_DOMAIN)->SetFocus(); }
void CChooseDomainDlg::OnOK() { CWaitCursor cwait; HRESULT hr = S_OK; CString csName, csDnsName;
//
// Validate contents in the domain edit box
//
GetDlgItemText(IDC_SELECTDOMAIN_DOMAIN, csName); if (csName.IsEmpty()) { ReportMessageEx(m_hWnd, IDS_INCORRECT_INPUT, MB_OK | MB_ICONSTOP); (GetDlgItem(IDC_SELECTDOMAIN_DOMAIN))->SetFocus(); return; } hr = GetDnsNameOfDomainOrForest( csName, csDnsName, TRUE, !m_bSiteRepl); if (csDnsName.IsEmpty()) { PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csName)));
if (FAILED(hr)) ReportErrorEx(m_hWnd, IDS_SELECTDOMAIN_INCORRECT_DOMAIN_DUETO, hr, MB_OK | MB_ICONSTOP, apv, 1, 0, FALSE); else ReportMessageEx(m_hWnd, IDS_SELECTDOMAIN_DOWNLEVEL_DOMAIN, MB_OK | MB_ICONSTOP, apv, 1, 0, FALSE);
SendDlgItemMessage(IDC_SELECTDOMAIN_DOMAIN, EM_SETSEL, 0, -1); return; }
//
// When exiting from the dialog
// use DNS domain name;
//
SetDlgItemText(IDC_SELECTDOMAIN_DOMAIN, csDnsName);
CHelpDialog::OnOK(); }
BOOL CChooseDomainDlg::OnInitDialog() { CHelpDialog::OnInitDialog(); // Limit the text to DNS_MAX_NAME_LENGTH
SendDlgItemMessage(IDC_SELECTDOMAIN_DOMAIN, EM_SETLIMITTEXT, DNS_MAX_NAME_LENGTH, 0);
//
// for siterepl snapin only,
// change dialog title to "Choose Target Forest"
// change domain label to "Root domain:"
// hide browse button
//
if (m_bSiteRepl) { CString csDlgTitle, csLabel; csDlgTitle.LoadString(IDS_SELECTDOMAIN_TITLE_FOREST); SetWindowText(csDlgTitle); csLabel.LoadString(IDS_SELECTDOMAIN_DOMAIN_LABEL); SetDlgItemText(IDC_SELECTDOMAIN_LABEL, csLabel);
// Hide & Disable the Browse button for SiteRepl snapin
(GetDlgItem(IDC_SELECTDOMAIN_BROWSE))->ShowWindow(SW_HIDE); (GetDlgItem(IDC_SELECTDOMAIN_BROWSE))->EnableWindow(FALSE); } return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CChooseDomainDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (m_bSiteRepl) // 481964-JonN-2002/04/10
? (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_SELECT_FOREST : (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_SELECT_DOMAIN); } }
/////////////////////////////////////////////////////////////////////////////
// CChooseDCDlg dialog
BEGIN_MESSAGE_MAP(CSelectDCEdit, CEdit) ON_WM_KILLFOCUS() END_MESSAGE_MAP()
void CSelectDCEdit::OnKillFocus(CWnd* pNewWnd) { //
// subclass the domain edit control.
// When focus moves to OK/Cancel button, do not invoke
// RefreshDCListView
//
// NTRAID#NTBUG9-472011-2001/10/22-JeffJon
// Don't include the Browse button in this list because tabbing
// from the edit control puts the focus on the Browse button
m_bHandleKillFocus = TRUE; if (pNewWnd) { int id = pNewWnd->GetDlgCtrlID(); if (id == IDOK || id == IDCANCEL) { m_bHandleKillFocus = FALSE; } }
CEdit::OnKillFocus(pNewWnd); }
CChooseDCDlg::CChooseDCDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CChooseDCDlg::IDD, pParent) { //{{AFX_DATA_INIT(CChooseDCDlg)
m_csTargetDomainController = _T(""); m_csTargetDomain = _T(""); //}}AFX_DATA_INIT
m_csPrevDomain = _T(""); m_pDCBufferManager = NULL; m_csAnyDC.LoadString(IDS_ANY_DOMAIN_CONTROLLER); m_csWaiting.LoadString(IDS_WAITING); m_csError.LoadString(IDS_ERROR); }
CChooseDCDlg::~CChooseDCDlg() { TRACE(_T("CChooseDCDlg::~CChooseDCDlg\n"));
if (m_pDCBufferManager) { //
// signal all related running threads to terminate
//
m_pDCBufferManager->SignalExit();
//
// decrement the reference count on the CDCBufferManager instance
//
m_pDCBufferManager->Release(); } }
void CChooseDCDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CChooseDCDlg)
DDX_Control(pDX, IDC_SELECTDC_DCLISTVIEW, m_hDCListView); DDX_Text(pDX, IDC_SELECTDC_DCEDIT, m_csTargetDomainController); DDX_Text(pDX, IDC_SELECTDC_DOMAIN, m_csTargetDomain); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CChooseDCDlg, CHelpDialog) //{{AFX_MSG_MAP(CChooseDCDlg)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_SELECTDC_DCLISTVIEW, OnItemchangedSelectdcDCListView) ON_EN_KILLFOCUS(IDC_SELECTDC_DOMAIN, OnKillfocusSelectdcDomain) ON_BN_CLICKED(IDC_SELECTDC_BROWSE, OnSelectdcBrowse) ON_NOTIFY(LVN_COLUMNCLICK, IDC_SELECTDC_DCLISTVIEW, OnColumnclickSelectdcDCListView) //}}AFX_MSG_MAP
ON_MESSAGE(WM_USER_GETDC_THREAD_DONE, OnGetDCThreadDone) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChooseDCDlg message handlers
typedef struct _DCListViewItem { CString csName; CString csSite; } DCLISTVIEWITEM;
BOOL CChooseDCDlg::OnInitDialog() { CHelpDialog::OnInitDialog();
//
// sub-class the domain edit control, in order to intercept WM_KILLFOCUS
// if the new focus will be set on Cancel button, don't process
// EN_KILLFOCUS (i.e., don't start the thread to refresh DC list view )
//
VERIFY(m_selectDCEdit.SubclassDlgItem(IDC_SELECTDC_DOMAIN, this));
// Limit the text to DNS_MAX_NAME_LENGTH
m_selectDCEdit.SetLimitText(DNS_MAX_NAME_LENGTH); SendDlgItemMessage(IDC_SELECTDC_DCEDIT, EM_SETLIMITTEXT, DNS_MAX_NAME_LENGTH, 0);
//
// create instance of CDCBufferManager
// m_pDCBufferManager will be set to NULL if CreateInstance() failed.
//
(void) CDCBufferManager::CreateInstance(m_hWnd, &m_pDCBufferManager);
//
// display currently targeted domain controller
//
SetDlgItemText(IDC_SELECTDC_DCEDIT_TITLE, m_csTargetDomainController);
//
// calculate the listview column width
//
RECT rect; ZeroMemory(&rect, sizeof(rect)); (GetDlgItem(IDC_SELECTDC_DCLISTVIEW))->GetWindowRect(&rect); int nControlWidth = rect.right - rect.left; int nVScrollbarWidth = GetSystemMetrics(SM_CXVSCROLL); int nBorderWidth = GetSystemMetrics(SM_CXBORDER); int nControlNetWidth = nControlWidth - nVScrollbarWidth - 4 * nBorderWidth; int nWidth1 = nControlNetWidth / 2; int nWidth2 = nControlNetWidth - nWidth1;
//
// insert two columns of DC list view
//
LV_COLUMN col; CString cstrText; ZeroMemory(&col, sizeof(col)); col.mask = LVCF_TEXT | LVCF_WIDTH; col.cx = nWidth1; cstrText.LoadString(IDS_SELECTDC_DCLISTVIEW_NAME); col.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(cstrText)); ListView_InsertColumn(m_hDCListView, 0, &col); col.cx = nWidth2; cstrText.LoadString(IDS_SELECTDC_DCLISTVIEW_SITE); col.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(cstrText)); ListView_InsertColumn(m_hDCListView, 1, &col);
//
// Set full row selection style
//
ListView_SetExtendedListViewStyleEx(m_hDCListView, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
//
// disable the list view control
// In case we failed to create a CDCBufferManager instance, user can
// still use this dialog to type in a domain name and a DC name.
//
m_hDCListView.EnableWindow(FALSE);
//
// insert items into DC list view
//
(void) RefreshDCListView();
if (!m_bSiteRepl) { //
// Disable domain edit box and hide&disable Browse button for non-siterepl snapins
//
(reinterpret_cast<CEdit *>(GetDlgItem(IDC_SELECTDC_DOMAIN)))->SetReadOnly(TRUE); (GetDlgItem(IDC_SELECTDC_BROWSE))->ShowWindow(SW_HIDE); (GetDlgItem(IDC_SELECTDC_BROWSE))->EnableWindow(FALSE);
//
// for non-siterepl snapins, set focus to the DC edit box;
// for siterepl snapin, the focus will be set on the domain edit box.
//
(GetDlgItem(IDC_SELECTDC_DCEDIT))->SetFocus(); return FALSE; }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
int CALLBACK ListViewCompareProc( IN LPARAM lParam1, IN LPARAM lParam2, IN LPARAM lParamSort) { DCLISTVIEWITEM *pItem1 = (DCLISTVIEWITEM *)lParam1; DCLISTVIEWITEM *pItem2 = (DCLISTVIEWITEM *)lParam2; int iResult = 0;
if (pItem1 && pItem2) { switch( lParamSort) { case 0: // Sort by Name.
iResult = pItem1->csName.CompareNoCase(pItem2->csName); break; case 1: // Sort by Site.
iResult = pItem1->csSite.CompareNoCase(pItem2->csSite); break; default: iResult = 0; break; } }
return(iResult); }
void CChooseDCDlg::OnColumnclickSelectdcDCListView(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
ListView_SortItems( m_hDCListView, ListViewCompareProc, (LPARAM)(pNMListView->iSubItem)); *pResult = 0; }
#define MAX_LENGTH_DCNAME 1024
void CChooseDCDlg::OnItemchangedSelectdcDCListView(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//
// set DC edit box to the currently selected item in the dc list view
//
if ( (pNMListView->uChanged & LVIF_STATE) && (pNMListView->uNewState & LVIS_SELECTED) ) { TCHAR pszBuffer[MAX_LENGTH_DCNAME]; ListView_GetItemText( (GetDlgItem(IDC_SELECTDC_DCLISTVIEW))->GetSafeHwnd(), pNMListView->iItem, 0, pszBuffer, MAX_LENGTH_DCNAME * sizeof(TCHAR) );
SetDlgItemText(IDC_SELECTDC_DCEDIT, pszBuffer); }
*pResult = 0; }
void CChooseDCDlg::OnKillfocusSelectdcDomain() { TRACE(_T("CChooseDCDlg::OnKillfocusSelectdcDomain\n"));
//
// when focus leaves domain edit box, refresh the items in the dc list view
// we do this only for siterepl snapin whose domain edit box is enabled.
//
if (m_selectDCEdit.m_bHandleKillFocus) { if (m_bSiteRepl) (void) RefreshDCListView(); } }
void CChooseDCDlg::OnSelectdcBrowse() { CWaitCursor cwait;
//
// bring up the domain tree browse dialog
//
HRESULT hr = S_OK; LPTSTR lpszDomainDnsName = NULL; CString csDomainName, csDCName;
GetDlgItemText(IDC_SELECTDC_DOMAIN, csDomainName); csDomainName.TrimLeft(); csDomainName.TrimRight(); if (!csDomainName.IsEmpty()) hr = GetDCOfDomain(csDomainName, csDCName, FALSE); if (SUCCEEDED(hr)) { hr = BrowseDomainTree(m_hWnd, csDCName, &lpszDomainDnsName); if ( FAILED(hr) && !csDCName.IsEmpty() && HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE) == hr ) { // force the cached info in DsGetDcName to be refreshed
hr = GetDCOfDomain(csDomainName, csDCName, TRUE); if (SUCCEEDED(hr)) hr = BrowseDomainTree(m_hWnd, csDCName, &lpszDomainDnsName); }
if ( (hr == S_OK) && lpszDomainDnsName ) { SetDlgItemText(IDC_SELECTDC_DOMAIN, lpszDomainDnsName); CoTaskMemFree(lpszDomainDnsName);
if (!RefreshDCListView()) { SetDlgItemText(IDC_SELECTDC_DOMAIN, csDomainName); } } } // JonN 9/05/01 464466
// After a fail to Locate Domain Controllers, Browse button repeatedly fails.
else { SetDlgItemText(IDC_SELECTDC_DOMAIN, L""); } if (FAILED(hr)) { PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csDomainName)));
ReportErrorEx(m_hWnd,IDS_CANT_BROWSE_DOMAIN, hr, MB_OK | MB_ICONERROR, apv, 1, 0); }
GetDlgItem(IDC_SELECTDC_DOMAIN)->SetFocus(); }
void CChooseDCDlg::OnOK() { TRACE(_T("CChooseDCDlg::OnOK\n"));
CWaitCursor wait; HRESULT hr = S_OK;
CString csDnsForSelectedDomain; CString csDnsForCurrentForest, csDnsForSelectedForest;
if (m_bSiteRepl) { hr = GetDnsNameOfDomainOrForest( m_csTargetDomain, csDnsForCurrentForest, TRUE, FALSE); // get forest name
if (csDnsForCurrentForest.IsEmpty()) csDnsForCurrentForest = m_csTargetDomain; }
//
// Validate contents in the DC edit box
//
CString csDCEdit; GetDlgItemText(IDC_SELECTDC_DCEDIT, csDCEdit);
// treat empty csDCEdit as same as m_csAnyDC
if (!csDCEdit.IsEmpty() && m_csAnyDC.CompareNoCase(csDCEdit)) { hr = GetDnsNameOfDomainOrForest( csDCEdit, csDnsForSelectedDomain, FALSE, TRUE); // get domain name
if (SUCCEEDED(hr) && m_bSiteRepl) { hr = GetDnsNameOfDomainOrForest( csDCEdit, csDnsForSelectedForest, FALSE, FALSE); // get forest name
} if (csDnsForSelectedDomain.IsEmpty() || (m_bSiteRepl && csDnsForSelectedForest.IsEmpty()) ) { PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csDCEdit))); if (FAILED(hr)) // JonN 12/5/01 500074 TryADsIErrors = FALSE
ReportErrorEx(m_hWnd, IDS_SELECTDC_INCORRECT_DC_DUETO, hr, MB_OK | MB_ICONSTOP, apv, 1, 0, FALSE); else // JonN 12/5/01 500074 TryADsIErrors = FALSE
ReportMessageEx(m_hWnd, IDS_SELECTDC_DOWNLEVEL_DC, MB_OK | MB_ICONSTOP, apv, 1, 0, FALSE); (GetDlgItem(IDC_SELECTDC_DCEDIT))->SetFocus(); return; }
} else {
//
// Validate contents in the domain edit box
//
CString csDomain; GetDlgItemText(IDC_SELECTDC_DOMAIN, csDomain); if (csDomain.IsEmpty()) { ReportMessageEx(m_hWnd, IDS_INCORRECT_INPUT, MB_OK | MB_ICONSTOP); (GetDlgItem(IDC_SELECTDC_DOMAIN))->SetFocus(); return; } hr = GetDnsNameOfDomainOrForest( csDomain, csDnsForSelectedDomain, TRUE, TRUE); // get domain name
if (SUCCEEDED(hr) && m_bSiteRepl) { hr = GetDnsNameOfDomainOrForest( csDomain, csDnsForSelectedForest, TRUE, FALSE); // get forest name
} if (csDnsForSelectedDomain.IsEmpty() || (m_bSiteRepl && csDnsForSelectedForest.IsEmpty()) ) { PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csDomain)));
if (FAILED(hr)) ReportErrorEx(m_hWnd, IDS_SELECTDC_INCORRECT_DOMAIN_DUETO, hr, MB_OK | MB_ICONSTOP, apv, 1, 0, FALSE); else ReportMessageEx(m_hWnd, IDS_SELECTDC_DOWNLEVEL_DOMAIN, MB_OK | MB_ICONSTOP, apv, 1, 0, FALSE);
SetDlgItemText(IDC_SELECTDC_DOMAIN, _T("")); (GetDlgItem(IDC_SELECTDC_DOMAIN))->SetFocus();
return; } }
//
// if the current selected forest/domain does not belong to the current administering forest/domain,
// ask user if he really wants to administer the selected forest/domain
// via the selected DC (or any writable DC)?
//
if ( (m_bSiteRepl && csDnsForSelectedForest.CompareNoCase(csDnsForCurrentForest)) || (!m_bSiteRepl && csDnsForSelectedDomain.CompareNoCase(m_csTargetDomain)) ) { int nArgs = 0; int id = 0; PVOID apv[3]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(m_bSiteRepl ? csDnsForCurrentForest : m_csTargetDomain))); apv[1] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(m_bSiteRepl ? csDnsForSelectedForest : csDnsForSelectedDomain))); if (m_csAnyDC.CompareNoCase(csDCEdit)) { nArgs = 3; apv[2] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csDCEdit))); id = (m_bSiteRepl ? IDS_SELECTDC_UNMATCHED_DC_DOMAIN_SITEREPL : IDS_SELECTDC_UNMATCHED_DC_DOMAIN); } else { nArgs = 2; id = (m_bSiteRepl ? IDS_SELECTDC_UNMATCHED_DC_DOMAIN_SITEREPL_ANY : IDS_SELECTDC_UNMATCHED_DC_DOMAIN_ANY); } if (IDYES != ReportMessageEx(m_hWnd, id, MB_YESNO, apv, nArgs)) { (GetDlgItem(IDC_SELECTDC_DCEDIT))->SetFocus(); return; } }
//
// When exiting from the dialog
// use DNS domain name;
// use blank string if "Any Writable DC"
// clean list view control
//
SetDlgItemText(IDC_SELECTDC_DOMAIN, csDnsForSelectedDomain); if (0 == m_csAnyDC.CompareNoCase(csDCEdit)) SetDlgItemText(IDC_SELECTDC_DCEDIT, _T("")); FreeDCItems(m_hDCListView);
CHelpDialog::OnOK(); }
void CChooseDCDlg::OnCancel() { TRACE(_T("CChooseDCDlg::OnCancel\n"));
//
// When exiting from the dialog
// clean list view control
//
FreeDCItems(m_hDCListView);
CHelpDialog::OnCancel(); }
//+---------------------------------------------------------------------------
//
// Function: CChooseDCDlg::InsertSpecialMsg
//
// Synopsis: Insert "Waiting..." or "Error" into the list view control,
// and disable the control to prevent it from being selected.
//
//----------------------------------------------------------------------------
void CChooseDCDlg::InsertSpecialMsg( IN BOOL bWaiting ) { LV_ITEM item;
//
// clear DC list view
//
FreeDCItems(m_hDCListView);
ZeroMemory(&item, sizeof(item)); item.mask = LVIF_TEXT; item.pszText = const_cast<LPTSTR>( static_cast<LPCTSTR>(bWaiting ? m_csWaiting: m_csError)); ListView_InsertItem(m_hDCListView, &item);
//
// disable the list view to prevent user from clicking on "Waiting..."
//
m_hDCListView.EnableWindow(FALSE); }
//+---------------------------------------------------------------------------
//
// Function: CChooseDCDlg::InsertDCListView
//
// Synopsis: Insert items into the list view control of the owner dialog.
//
//----------------------------------------------------------------------------
HRESULT CChooseDCDlg::InsertDCListView( IN CDCSITEINFO *pEntry ) { ASSERT(pEntry);
DWORD cInfo = pEntry->GetNumOfInfo(); PDS_DOMAIN_CONTROLLER_INFO_1 pDCInfo = pEntry->GetDCInfo();
ASSERT(cInfo > 0); ASSERT(pDCInfo);
LV_ITEM item; int index = 0; DCLISTVIEWITEM *pItem = NULL; DWORD dwErr = 0;
//
// clear DC list view
//
FreeDCItems(m_hDCListView);
//
// insert DC list view
//
ZeroMemory(&item, sizeof(item)); item.mask = LVIF_TEXT | LVIF_PARAM;
for (DWORD i=0; i<cInfo; i++) { //
// Don't add NT4 BDCs to the list
//
if (!pDCInfo[i].fDsEnabled) { continue; } ASSERT(pDCInfo[i].NetbiosName || pDCInfo[i].DnsHostName); if (pDCInfo[i].DnsHostName) item.pszText = pDCInfo[i].DnsHostName; else item.pszText = pDCInfo[i].NetbiosName;
pItem = new DCLISTVIEWITEM; if (!pItem) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; }
pItem->csName = item.pszText; if (pDCInfo[i].SiteName) pItem->csSite = pDCInfo[i].SiteName; else pItem->csSite = _T("");
item.lParam = reinterpret_cast<LPARAM>(pItem);
index = ListView_InsertItem(m_hDCListView, &item); ListView_SetItemText(m_hDCListView, index, 1, const_cast<LPTSTR>(static_cast<LPCTSTR>(pItem->csSite))); }
if (ERROR_NOT_ENOUGH_MEMORY != dwErr) { // add "All writable domain controllers" into the list-view .
item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; item.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(m_csAnyDC)); item.state = LVIS_FOCUSED | LVIS_SELECTED;
pItem = new DCLISTVIEWITEM; if (!pItem) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } else { pItem->csName = _T(""); // always sorted as the top item
pItem->csSite = _T("");
item.lParam = reinterpret_cast<LPARAM>(pItem);
index = ListView_InsertItem(m_hDCListView, &item); ListView_SetItemText(m_hDCListView, index, 1, const_cast<LPTSTR>(static_cast<LPCTSTR>(pItem->csSite))); } }
if (ERROR_NOT_ENOUGH_MEMORY == dwErr) { FreeDCItems(m_hDCListView); return E_OUTOFMEMORY; }
m_hDCListView.EnableWindow(TRUE);
return S_OK; }
void CChooseDCDlg::OnGetDCThreadDone(WPARAM wParam, LPARAM lParam) { ASSERT(m_pDCBufferManager);
CDCSITEINFO* pEntry = reinterpret_cast<CDCSITEINFO*>(wParam); HRESULT hr = (HRESULT)lParam;
ASSERT(pEntry);
CString csDomain = pEntry->GetDomainName(); CString csCurrentDomain;
GetDlgItemText(IDC_SELECTDC_DOMAIN, csCurrentDomain);
TRACE(_T("CChooseDCDlg::OnGetDCThreadDone targetDomain=%s, currentDomain=%s, hr=%x\n"), csDomain, csCurrentDomain, hr);
if (csCurrentDomain.CompareNoCase(csDomain) == 0) { switch (pEntry->GetEntryType()) { case BUFFER_ENTRY_TYPE_VALID: hr = InsertDCListView(pEntry); if (SUCCEEDED(hr)) break; // fall through if error
case BUFFER_ENTRY_TYPE_ERROR: RefreshDCListViewErrorReport(csDomain, hr); break; default: ASSERT(FALSE); break; } } }
void CChooseDCDlg::RefreshDCListViewErrorReport( IN PCTSTR pszDomainName, IN HRESULT hr ) { PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<PTSTR>(pszDomainName)); ReportErrorEx(m_hWnd, IDS_NO_DCS_FOUND, hr, MB_OK | MB_ICONINFORMATION, apv, 1, 0);
InsertSpecialMsg(FALSE); // insert "Error"
if (m_bSiteRepl) (GetDlgItem(IDC_SELECTDC_DOMAIN))->SetFocus(); else (GetDlgItem(IDC_SELECTDC_DCEDIT))->SetFocus(); }
// JonN 9/05/01 464466
// After a fail to Locate Domain Controllers, Browse button repeatedly fails.
// return success/failure
bool CChooseDCDlg::RefreshDCListView() { CString csDomain;
GetDlgItemText(IDC_SELECTDC_DOMAIN, csDomain); if ( csDomain.IsEmpty() || (0 == csDomain.CompareNoCase(m_csPrevDomain)) ) return true;
TRACE(_T("CChooseDCDlg::RefreshDCListView for %s\n"), csDomain);
//
// update m_csPrevDomain
// to prevent LoadInfo() from being invoked multiple times when
// a serial of WM_KILLFOCUS happening on the same DomainName
//
m_csPrevDomain = csDomain;
//
// clear dc edit box
//
SetDlgItemText(IDC_SELECTDC_DCEDIT, _T(""));
//NTRAID#NTBUG9-456420-2001/09/28-lucios
// removed the code to update the title of the lsit box
// that now is static.
if (m_pDCBufferManager) { //
// insert "Waiting..." into the list view control
//
InsertSpecialMsg(TRUE);
UpdateWindow();
CWaitCursor cwait;
//
// Make sure csDomain is a valid domain name
//
CString csSelectedDomainDns; HRESULT hr = GetDnsNameOfDomainOrForest( csDomain, csSelectedDomainDns, TRUE, TRUE); // We're interested in domain name not forest name here
if (FAILED(hr)) { RefreshDCListViewErrorReport(csDomain, hr); return false; }
if (csSelectedDomainDns.IsEmpty()) { // down-level domain
PVOID apv[1]; apv[0] = static_cast<PVOID>(const_cast<LPTSTR>(static_cast<LPCTSTR>(csDomain))); ReportMessageEx(m_hWnd, IDS_SELECTDC_DOWNLEVEL_DOMAIN, MB_OK | MB_ICONSTOP, apv, 1);
InsertSpecialMsg(FALSE); // insert "Error"
(GetDlgItem(IDC_SELECTDC_DOMAIN))->SetFocus();
return false; }
//
// start the thread to calculate a list of DCs in the current selected domain
//
CDCSITEINFO *pEntry = NULL; hr = m_pDCBufferManager->LoadInfo(csSelectedDomainDns, &pEntry);
if (SUCCEEDED(hr)) { //
// Either we get a valid ptr back (ie. data is ready), insert it;
// or, a thread is alreay in progress, wait until a THREAD_DONE message.
//
if (pEntry) { ASSERT(pEntry->GetEntryType() == BUFFER_ENTRY_TYPE_VALID); hr = InsertDCListView(pEntry); } }
if (FAILED(hr)) { RefreshDCListViewErrorReport(csSelectedDomainDns, hr); return false; } }
return true; } //+---------------------------------------------------------------------------
//
// Function: CChooseDCDlg::FreeDCItems
//
// Synopsis: Clear the lParam associated with each item in the list view control.
// The lParam is needed to support column-sorting.
//
//----------------------------------------------------------------------------
void CChooseDCDlg::FreeDCItems(CListCtrl& clv) { int index = -1; LPARAM lParam = 0;
while ( -1 != (index = clv.GetNextItem(index, LVNI_ALL)) ) { lParam = clv.GetItemData(index);
if (lParam) delete ((DCLISTVIEWITEM *)lParam); }
ListView_DeleteAllItems(clv.GetSafeHwnd()); }
void CChooseDCDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_SELECT_DC); } }
/////////////////////////////////////////////////////////////////////////
// CDsAdminChooseDCObj
STDMETHODIMP CDsAdminChooseDCObj::InvokeDialog( /*IN*/ HWND hwndParent, /*IN*/ LPCWSTR lpszTargetDomain, /*IN*/ LPCWSTR lpszTargetDomainController, /*IN*/ ULONG uFlags, /*OUT*/ BSTR* bstrSelectedDC) { TRACE(L"CDsAdminChooseDCObj::InvokeDialog(\n"); TRACE(L" HWND hwndParent = 0x%x\n", hwndParent); TRACE(L" LPCWSTR lpszTargetDomain = %s\n", lpszTargetDomain); TRACE(L" LPCWSTR lpszTargetDomainController = %s\n", lpszTargetDomainController); TRACE(L" ULONG uFlags = 0x%x\n", uFlags); TRACE(L" BSTR* bstrSelectedDC = 0x%x)\n", bstrSelectedDC);
if (!::IsWindow(hwndParent) || (bstrSelectedDC == NULL)) { TRACE(L"InvokeDialog() Failed, invalid arg.\n"); return E_INVALIDARG; }
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CThemeContextActivator activator;
CChooseDCDlg DCdlg(CWnd::FromHandle(hwndParent));
// load current bind info
DCdlg.m_bSiteRepl = TRUE; DCdlg.m_csTargetDomain = lpszTargetDomain; DCdlg.m_csTargetDomainController = lpszTargetDomainController;
//
// invoke the dialog
//
HRESULT hr = S_FALSE; if (DCdlg.DoModal() == IDOK) { TRACE(L"DCdlg.DoModal() returned IDOK\n"); TRACE(L"DCdlg.m_csTargetDomainController = <%s>\n", (LPCWSTR)(DCdlg.m_csTargetDomainController)); TRACE(L"DCdlg.m_csTargetDomain = <%s>\n", (LPCWSTR)(DCdlg.m_csTargetDomain));
LPCWSTR lpsz = NULL; if (DCdlg.m_csTargetDomainController.IsEmpty()) { lpsz = DCdlg.m_csTargetDomain; } else { lpsz = DCdlg.m_csTargetDomainController; } *bstrSelectedDC = ::SysAllocString(lpsz); TRACE(L"returning *bstrSelectedDC = <%s>\n", *bstrSelectedDC); hr = S_OK; }
TRACE(L"InvokeDialog() returning hr = 0x%x\n", hr); return hr; }
/////////////////////////////////////////////////////////////////////////////
// CRenameUserDlg dialog
CRenameUserDlg::CRenameUserDlg(CDSComponentData* pComponentData, CWnd* pParent /*=NULL*/) : m_pComponentData(pComponentData), CHelpDialog(CRenameUserDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRenameUserDlg)
m_login = _T(""); m_samaccountname = _T(""); m_domain = _T(""); m_dldomain = _T(""); m_first = _T(""); m_last = _T(""); m_cn = _T(""); m_oldcn = _T(""); m_displayname = _T(""); //}}AFX_DATA_INIT
}
void CRenameUserDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRenameUserDlg)
DDX_Text(pDX, IDC_EDIT_OBJECT_NAME, m_cn); DDX_Text(pDX, IDC_EDIT_DISPLAY_NAME, m_displayname); DDX_Text(pDX, IDC_FIRST_NAME_EDIT, m_first); DDX_Text(pDX, IDC_LAST_NAME_EDIT, m_last); DDX_Text(pDX, IDC_NT5_USER_EDIT, m_login); DDX_Text(pDX, IDC_NT4_USER_EDIT, m_samaccountname); DDX_Text(pDX, IDC_NT4_DOMAIN_EDIT, m_dldomain); DDX_CBString(pDX, IDC_NT5_DOMAIN_COMBO, m_domain); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRenameUserDlg, CHelpDialog) //{{AFX_MSG_MAP(CRenameUserDlg)
ON_EN_CHANGE(IDC_EDIT_OBJECT_NAME, OnObjectNameChange) ON_EN_CHANGE(IDC_FIRST_NAME_EDIT, OnNameChange) ON_EN_CHANGE(IDC_LAST_NAME_EDIT, OnNameChange) ON_EN_CHANGE(IDC_NT5_USER_EDIT, OnUserNameChange) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRenameUserDlg message handlers
BOOL CRenameUserDlg::OnInitDialog() { CHelpDialog::OnInitDialog(); CString csdomain;
CComboBox* combobox = (CComboBox*)GetDlgItem (IDC_NT5_DOMAIN_COMBO); ASSERT(combobox);
m_nameFormatter.Initialize(m_pComponentData->GetBasePathsInfo(), L"user");
combobox->AddString (m_domain); combobox->SetCurSel(0);
POSITION pos = m_domains.GetHeadPosition(); while (pos != NULL) { csdomain = m_domains.GetNext(INOUT pos); // since we added the UPN suffix for the user above, don't add it
// again
if (m_domain != csdomain) { combobox->AddString (csdomain); } }
UpdateComboBoxDropWidth(combobox);
((CEdit *)GetDlgItem(IDC_EDIT_OBJECT_NAME))->SetLimitText(64); ((CEdit *)GetDlgItem(IDC_FIRST_NAME_EDIT))->SetLimitText(64); ((CEdit *)GetDlgItem(IDC_LAST_NAME_EDIT))->SetLimitText(64); ((CEdit *)GetDlgItem(IDC_EDIT_DISPLAY_NAME))->SetLimitText(259); ((CEdit *)GetDlgItem(IDC_NT4_USER_EDIT))->SetLimitText(MAX_NT4_LOGON_LENGTH);
CString szObjectName; GetDlgItemText(IDC_EDIT_OBJECT_NAME, szObjectName); szObjectName.TrimLeft(); szObjectName.TrimRight(); if (szObjectName.IsEmpty()) { GetDlgItem(IDOK)->EnableWindow(FALSE); } return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CRenameUserDlg::UpdateComboBoxDropWidth(CComboBox* comboBox) { if (!comboBox) { ASSERT(comboBox); return; }
int nHorzExtent = 0; CClientDC dc(comboBox); int nItems = comboBox->GetCount(); for (int i=0; i < nItems; i++) { CString szBuffer; comboBox->GetLBText(i, szBuffer); CSize ext = dc.GetTextExtent(szBuffer,szBuffer.GetLength()); nHorzExtent = max(ext.cx ,nHorzExtent); } comboBox->SetDroppedWidth(nHorzExtent); }
void CRenameUserDlg::OnObjectNameChange() { CString szObjectName; GetDlgItemText(IDC_EDIT_OBJECT_NAME, szObjectName); szObjectName.TrimLeft(); szObjectName.TrimRight(); if (szObjectName.IsEmpty()) { GetDlgItem(IDOK)->EnableWindow(FALSE); } else { GetDlgItem(IDOK)->EnableWindow(TRUE); } }
void CRenameUserDlg::OnNameChange() { GetDlgItemText(IDC_EDIT_FIRST_NAME, OUT m_first); GetDlgItemText(IDC_EDIT_LAST_NAME, OUT m_last);
m_first.TrimLeft(); m_first.TrimRight();
m_last.TrimLeft(); m_last.TrimRight();
m_nameFormatter.FormatName(m_cn, m_first.IsEmpty() ? NULL : (LPCWSTR)m_first, NULL, m_last.IsEmpty() ? NULL : (LPCWSTR)m_last);
SetDlgItemText(IDC_EDIT_DISPLAY_NAME, m_cn); }
void CRenameUserDlg::OnUserNameChange() { GetDlgItemText(IDC_NT5_USER_EDIT, m_login); // NTRAID#NTBUG9-650931-2002/06/28-artm
CString samName = m_login.Left(MAX_NT4_LOGON_LENGTH); SetDlgItemText(IDC_NT4_USER_EDIT, samName); }
void CRenameUserDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_RENAME_USER); } }
/////////////////////////////////////////////////////////////////////////////
// CRenameGroupDlg message handlers
BOOL CRenameGroupDlg::OnInitDialog() { CHelpDialog::OnInitDialog();
((CEdit *)GetDlgItem(IDC_EDIT_OBJECT_NAME))->SetLimitText(64); ((CEdit *)GetDlgItem(IDC_NT4_USER_EDIT))->SetLimitText(m_samtextlimit);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////////////////////
// CRenameGroupDlg dialog
CRenameGroupDlg::CRenameGroupDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CRenameGroupDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRenameGroupDlg)
m_samaccountname = _T(""); m_cn = _T(""); m_samtextlimit = 256; //}}AFX_DATA_INIT
}
void CRenameGroupDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRenameGroupDlg)
DDX_Text(pDX, IDC_NT4_USER_EDIT, m_samaccountname); DDX_Text(pDX, IDC_EDIT_OBJECT_NAME, m_cn); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRenameGroupDlg, CHelpDialog) //{{AFX_MSG_MAP(CRenameGroupDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CRenameGroupDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_RENAME_GROUP); } }
/////////////////////////////////////////////////////////////////////////////
// CRenameContactDlg message handlers
BOOL CRenameContactDlg::OnInitDialog() { CHelpDialog::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CRenameContactDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_RENAME_CONTACT); } }
/////////////////////////////////////////////////////////////////////////////
// CRenameContactDlg dialog
CRenameContactDlg::CRenameContactDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CRenameContactDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRenameContactDlg)
m_cn = _T(""); m_first = _T(""); m_last = _T(""); m_disp = _T(""); //}}AFX_DATA_INIT
}
void CRenameContactDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRenameContactDlg)
DDX_Text(pDX, IDC_EDIT_OBJECT_NAME, m_cn); DDX_Text(pDX, IDC_FIRST_NAME_EDIT, m_first); DDX_Text(pDX, IDC_LAST_NAME_EDIT, m_last); DDX_Text(pDX, IDC_DISP_NAME_EDIT, m_disp); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRenameContactDlg, CHelpDialog) //{{AFX_MSG_MAP(CRenameContactDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRenameGenericDlg message handlers
BOOL CRenameGenericDlg::OnInitDialog() { CHelpDialog::OnInitDialog();
((CEdit *)GetDlgItem(IDC_EDIT_OBJECT_NAME))->SetLimitText(64);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////////////////////
// CRenameGenericDlg dialog
CRenameGenericDlg::CRenameGenericDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CRenameGenericDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRenameGenericDlg)
m_cn = _T(""); //}}AFX_DATA_INIT
}
void CRenameGenericDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRenameGenericDlg)
DDX_Text(pDX, IDC_EDIT_OBJECT_NAME, m_cn); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRenameGenericDlg, CHelpDialog) //{{AFX_MSG_MAP(CRenameGenericDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CRenameGenericDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_RENAME_COMPUTER); } }
/////////////////////////////////////////////////////////////////////////////
// CSpecialMessageBox dialog
CSpecialMessageBox::CSpecialMessageBox(CWnd* pParent /*=NULL*/) : CDialog(CSpecialMessageBox::IDD, pParent) { //{{AFX_DATA_INIT(CSpecialMessageBox)
m_title = _T(""); m_message = _T(""); //}}AFX_DATA_INIT
}
void CSpecialMessageBox::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSpecialMessageBox)
DDX_Text(pDX, IDC_STATIC_MESSAGE, m_message); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSpecialMessageBox, CDialog) //{{AFX_MSG_MAP(CSpecialMessageBox)
ON_BN_CLICKED(IDC_BUTTON_YES, OnYesButton) ON_BN_CLICKED(IDC_BUTTON_NO, OnNoButton) ON_BN_CLICKED(IDC_BUTTON_YESTOALL, OnYesToAllButton) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSpecialMessageBox message handlers
BOOL CSpecialMessageBox::OnInitDialog() { CDialog::OnInitDialog(); if (!m_title.IsEmpty()) { SetWindowText (m_title); }
GetDlgItem(IDC_BUTTON_NO)->SetFocus(); return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CSpecialMessageBox::OnYesButton() { CDialog::EndDialog (IDYES); }
void CSpecialMessageBox::OnNoButton() { CDialog::EndDialog (IDNO); }
void CSpecialMessageBox::OnYesToAllButton() { CDialog::EndDialog (IDC_BUTTON_YESTOALL); }
#ifdef FIXUPDC
/////////////////////////////////////////////////////////////////////////////
// CFixupDC dialog
CFixupDC::CFixupDC(CWnd* pParent /*=NULL*/) : CHelpDialog(CFixupDC::IDD, pParent) { //{{AFX_DATA_INIT(CFixupDC)
m_strServer = _T(""); //}}AFX_DATA_INIT
for (int i=0; i<NUM_FIXUP_OPTIONS; i++) { m_bCheck[i] = FALSE; } }
void CFixupDC::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFixupDC)
DDX_Text(pDX, IDC_FIXUP_DC_SERVER, m_strServer); //}}AFX_DATA_MAP
DDX_Check(pDX, IDC_FIXUP_DC_CHECK0, m_bCheck[0]); DDX_Check(pDX, IDC_FIXUP_DC_CHECK1, m_bCheck[1]); DDX_Check(pDX, IDC_FIXUP_DC_CHECK2, m_bCheck[2]); DDX_Check(pDX, IDC_FIXUP_DC_CHECK3, m_bCheck[3]); DDX_Check(pDX, IDC_FIXUP_DC_CHECK4, m_bCheck[4]); DDX_Check(pDX, IDC_FIXUP_DC_CHECK5, m_bCheck[5]); }
BEGIN_MESSAGE_MAP(CFixupDC, CHelpDialog) //{{AFX_MSG_MAP(CFixupDC)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFixupDC message handlers
extern FixupOptionsMsg g_FixupOptionsMsg[];
BOOL CFixupDC::OnInitDialog() { CHelpDialog::OnInitDialog(); HWND hCheck = NULL; GetDlgItem(IDC_FIXUP_DC_CHECK0, &hCheck); ::SetFocus(hCheck);
for (int i=0; i<NUM_FIXUP_OPTIONS; i++) m_bCheck[i] = g_FixupOptionsMsg[i].bDefaultOn;
UpdateData(FALSE);
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFixupDC::OnOK() { UpdateData(TRUE);
// make sure user has selected some checkboxes
BOOL bCheck = FALSE; for (int i=0; !bCheck && (i<NUM_FIXUP_OPTIONS); i++) { bCheck = bCheck || m_bCheck[i]; } if (!bCheck) { ReportMessageEx(m_hWnd, IDS_FIXUP_DC_SELECTION_WARNING, MB_OK); return; } CHelpDialog::OnOK(); }
void CFixupDC::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_FIXUP_DC); } } #endif // FIXUPDC
/////////////////////////////////////////////////////////////////////////////
// CPasswordDlg dialog
#ifdef FIXUPDC
// NOTICE-2002/04/12-artm
// When I was converting this class to use encrypted strings I noticed that
// it had no validation code to check that the length of the password <=
// MAX_PASSWORD_LENGTH.
//
// Further investigation revealed that the class is only used in code that is
// conditionally compiled in dssite.cpp, and in fact may never be compiled (b/c
// it needs work and the feature might not ever be released).
//
// Rather than spend unnecessary time understanding and fixing this I've
// used the same #ifdef to conditionally include it as the code that uses it.
//
// IF YOU NEED TO USE THIS class make sure you add password length validation
// code!
CPasswordDlg::CPasswordDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CPasswordDlg::IDD, pParent), m_password() { //{{AFX_DATA_INIT(CPasswordDlg)
m_strUserName = _T(""); //}}AFX_DATA_INIT
}
void CPasswordDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPasswordDlg)
DDX_Text(pDX, IDC_USER_NAME, m_strUserName); //}}AFX_DATA_MAP
DDX_EncryptedText(pDX, IDC_PASSWORD, m_password);
// Double check that password has not exceeded
// max length by someone removing validation code.
ASSERT(m_password.GetLength() <= MAX_PASSWORD_LENGTH); }
BEGIN_MESSAGE_MAP(CPasswordDlg, CHelpDialog) //{{AFX_MSG_MAP(CPasswordDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPasswordDlg message handlers
void CPasswordDlg::OnOK() { UpdateData(TRUE); if (m_strUserName.IsEmpty()) { ReportMessageEx(m_hWnd, IDS_PASSWORD_DLG_WARNING, MB_OK); return; }
CHelpDialog::OnOK(); }
void CPasswordDlg::DoContextHelp(HWND hWndControl) { if (hWndControl) { ::WinHelp(hWndControl, DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)g_aHelpIDs_IDD_PASSWORD); } } #endif //FIXUPDC
|