#include #include "CPasswdP.h" #include "AccntWiz.h" #include "proputil.h" #include #include #define PASSWD_NOCHANGE 0x01 #define PASSWD_CANCHANGE 0x02 #define PASSWD_MUSTCHANGE 0x04 // -------------------------------------------------------------------------------------------------------------------------------- // CPasswdPage class // -------------------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Constructor // ---------------------------------------------------------------------------- CPasswdPage::CPasswdPage( CAddUser_AccntWiz* pASW ) : m_csUserOU(), m_csPasswd1a(), m_csPasswd1b() { m_pASW = pASW; m_psp.dwFlags |= PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; m_psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_PASSWD_GEN_TITLE); m_psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_PASSWD_GEN_SUBTITLE); // Defaults m_fInit = TRUE; m_dwOptions = 0; } // ---------------------------------------------------------------------------- // Destructor // ---------------------------------------------------------------------------- CPasswdPage::~CPasswdPage( ) { } // ---------------------------------------------------------------------------- // OnDestroy() // ---------------------------------------------------------------------------- LRESULT CPasswdPage::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Detach all of our controls from the windows. m_ctrlPasswd1a.Detach(); m_ctrlPasswd1b.Detach(); m_ctrlRad2Must.Detach(); m_ctrlRad2Cannot.Detach(); m_ctrlRad2Can.Detach(); return 0; } // ---------------------------------------------------------------------------- // OnInitDialog() // ---------------------------------------------------------------------------- LRESULT CPasswdPage::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { // Attach controls. m_ctrlPasswd1a.Attach ( GetDlgItem(IDC_PASSWD_1A) ); m_ctrlPasswd1b.Attach ( GetDlgItem(IDC_PASSWD_1B) ); m_ctrlRad2Must.Attach ( GetDlgItem(IDC_RAD_2_MUST) ); m_ctrlRad2Cannot.Attach ( GetDlgItem(IDC_RAD_2_CANNOT) ); m_ctrlRad2Can.Attach ( GetDlgItem(IDC_RAD_2_CAN) ); // Limit the Edit boxes m_ctrlPasswd1a.SetLimitText( PWLEN ); m_ctrlPasswd1b.SetLimitText( PWLEN ); // Initialize the controls' state m_ctrlRad2Can.SetCheck(1); // Disable IME for the controls. ::ImmAssociateContext( m_ctrlPasswd1a.m_hWnd, NULL ); ::ImmAssociateContext( m_ctrlPasswd1b.m_hWnd, NULL ); return(0); } // ---------------------------------------------------------------------------- // Init() // // Initializes the controls on the page with the values from the property bag. // NOTE: This is called from OnSetActive(), but only on the first SetActive. // This is because even though the control attaching could be done in // the WM_INITDIALOG handler, setting the values of the controls from // the values read from the property bag can only safely be done in the // PSN_SETACTIVE. // ---------------------------------------------------------------------------- LRESULT CPasswdPage::Init( ) { return 0; } // ---------------------------------------------------------------------------- // ReadProperties() // ---------------------------------------------------------------------------- HRESULT CPasswdPage::ReadProperties( IPropertyPagePropertyBag * pPPPBag ) { return S_OK; } // ---------------------------------------------------------------------------- // WriteProperties() // ---------------------------------------------------------------------------- HRESULT CPasswdPage::WriteProperties( IPropertyPagePropertyBag * pPPPBag ) { m_dwOptions = 0; if ( !m_fInit ) // IF the page has already been initialized... { // Get the values from the edit boxes. m_csPasswd1a = StrGetWindowText( m_ctrlPasswd1a.m_hWnd ).c_str(); if( m_ctrlRad2Must.GetCheck() ) { m_dwOptions |= PASSWD_MUSTCHANGE; } else if( m_ctrlRad2Cannot.GetCheck() ) { m_dwOptions |= PASSWD_NOCHANGE; } else { m_dwOptions |= PASSWD_CANCHANGE; } } // Write the values to the property bag. WriteString( pPPPBag, PROP_PASSWD_GUID_STRING, m_csPasswd1a, FALSE ); WriteInt4 ( pPPPBag, PROP_ACCOUNT_OPT_GUID_STRING, (LONG)m_dwOptions, FALSE ); return S_OK; } // ---------------------------------------------------------------------------- // ProvideFinishText() // ---------------------------------------------------------------------------- HRESULT CPasswdPage::ProvideFinishText( CString &str ) { if ( m_fInit ) return E_FAIL; return S_OK; } // ---------------------------------------------------------------------------- // DeleteProperties() // ---------------------------------------------------------------------------- HRESULT CPasswdPage::DeleteProperties( IPropertyPagePropertyBag * pPPPBag ) { return S_OK; } // ---------------------------------------------------------------------------- // OnSetActive() // ---------------------------------------------------------------------------- BOOL CPasswdPage::OnSetActive() { CWaitCursor cWaitCur; // Enable the next and back buttons. ::SendMessage( GetParent(), PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_NEXT ); // Our fake InitDialog() // NOTE: This is because if this is the first wizard page, it will get // the WM_INITDIALOG message before its ReadProperties() function // has been called. if ( m_fInit ) // Is this the first SetActive? { Init(); // Call our init function. m_fInit = FALSE; // And mark that this isn't the first SetActive. } return TRUE; } // ---------------------------------------------------------------------------- // OnWizardBack() // ---------------------------------------------------------------------------- int CPasswdPage::OnWizardBack() { return 0; // Go back. } // ---------------------------------------------------------------------------- // OnWizardNext() // ---------------------------------------------------------------------------- int CPasswdPage::OnWizardNext() { CWaitCursor cWaitCur; CString csPasswd; CString csTitle; CString csError; HWND hWndPasswd; HRESULT hr = S_OK; // Get the values from the edit boxes. m_csPasswd1a = StrGetWindowText( m_ctrlPasswd1a.m_hWnd ).c_str(); m_csPasswd1b = StrGetWindowText( m_ctrlPasswd1b.m_hWnd ).c_str(); hWndPasswd = m_ctrlPasswd1a.m_hWnd; csPasswd = m_csPasswd1a; // Make sure they match... if ( _tcscmp((LPCTSTR)m_csPasswd1a, (LPCTSTR)m_csPasswd1b) ) { csError.LoadString(IDS_ERROR_PASSWD_MATCH); csTitle.LoadString(IDS_TITLE); ::MessageBox(m_hWnd, (LPCTSTR)csError, (LPCTSTR)csTitle, MB_OK | MB_TASKMODAL | MB_ICONERROR); ::SetFocus(hWndPasswd); return(-1); } // Make sure it meets the minimum length requirements. (bug 4210) CString csDns = _T(""); CString csDCName = _T(""); PDOMAIN_CONTROLLER_INFO pDCI = NULL; hr = DsGetDcName( NULL, NULL, NULL, NULL, DS_DIRECTORY_SERVICE_REQUIRED | DS_RETURN_DNS_NAME, &pDCI ); if( (hr == S_OK) && (pDCI != NULL) ) { csDns = pDCI->DomainName; NetApiBufferFree (pDCI); pDCI = NULL; } tstring strDomain = GetDomainPath((LPCTSTR)csDns); csDCName = L"LDAP://"; csDCName += strDomain.c_str(); // Now open the IADs object for the LDAP version of the DC.. // Then convert to WinNT version. CComPtr spADs = NULL; hr = ::ADsGetObject( (LPTSTR)(LPCTSTR)csDCName, IID_IADs, (VOID**)&spADs ); if( SUCCEEDED(hr) ) { CComVariant var; CComBSTR bstrProp = _T("dc"); spADs->Get( bstrProp, &var ); csDCName = L"WinNT://"; csDCName += V_BSTR(&var); } CComPtr spADsDomain = NULL; hr = ::ADsOpenObject( (LPTSTR)(LPCTSTR)csDCName, NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADsDomain, (VOID**)&spADsDomain ); if( SUCCEEDED(hr) ) { long lMinLength = 0; spADsDomain->get_MinPasswordLength( &lMinLength ); if( csPasswd.GetLength() < lMinLength ) { TCHAR szMin[128]; _itot(lMinLength, szMin, 10); csError.FormatMessage(IDS_ERROR_PASSWDLEN, szMin); csTitle.LoadString(IDS_TITLE); ::MessageBox(m_hWnd, (LPCTSTR)csError, (LPCTSTR)csTitle, MB_OK | MB_TASKMODAL | MB_ICONERROR); ::SetFocus(hWndPasswd); return(-1); } } // Finally Check if it is more than 14 characters. if( csPasswd.GetLength() > LM20_PWLEN ) { csError.LoadString(IDS_ERROR_LONGPW); csTitle.LoadString(IDS_TITLE); if( ::MessageBox( m_hWnd, (LPCTSTR)csError, (LPCTSTR)csTitle, MB_YESNO | MB_ICONWARNING ) == IDNO ) { ::SetFocus( hWndPasswd ); return -1; } } return 0; // Go next. }