windows-nt/Source/XPSP1/NT/base/cluster/mgmt/cluscfg/wizard/csaccountpage.cpp
2020-09-26 16:20:57 +08:00

887 lines
21 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2001 Microsoft Corporation
//
// Module Name:
// CSAccountPage.cpp
//
// Maintained By:
// David Potter (DavidP) 22-MAR-2001
// Geoffrey Pease (GPease) 12-MAY-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "CSAccountPage.h"
DEFINE_THISCLASS("CCSAccountPage");
//////////////////////////////////////////////////////////////////////////////
//++
//
// CCSAccountPage::CCSAccountPage(
// IServiceProvider * pspIn,
// ECreateAddMode ecamCreateAddModeIn,
// BSTR * pbstrUsernameIn,
// BSTR * pbstrPasswordIn,
// BSTR * pbstrDomainIn,
// BSTR * pbstrClusterNameIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
CCSAccountPage::CCSAccountPage(
IServiceProvider * pspIn,
ECreateAddMode ecamCreateAddModeIn,
BSTR * pbstrUsernameIn,
BSTR * pbstrPasswordIn,
BSTR * pbstrDomainIn,
BSTR * pbstrClusterNameIn
)
{
TraceFunc( "" );
// m_hwnd
THR( pspIn->TypeSafeQI( IServiceProvider, &m_psp ) );
m_ecamCreateAddMode = ecamCreateAddModeIn;
m_pbstrUsername = pbstrUsernameIn;
m_pbstrPassword = pbstrPasswordIn;
m_pbstrDomain = pbstrDomainIn;
m_pbstrClusterName = pbstrClusterNameIn;
m_cRef = 0;
m_ptgd = NULL;
Assert( m_pbstrUsername != NULL );
Assert( m_pbstrPassword != NULL );
Assert( m_pbstrDomain != NULL );
Assert( m_pbstrClusterName != NULL );
TraceFuncExit();
} //*** CCSAccountPage::CCSAccountPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CCSAccountPage::~CCSAccountPage( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
CCSAccountPage::~CCSAccountPage( void )
{
TraceFunc( "" );
if ( m_psp != NULL )
{
m_psp->Release();
}
if ( m_ptgd != NULL )
{
// Make sure we don't get called anymore.
THR( m_ptgd->SetCallback( NULL ) );
m_ptgd->Release();
}
Assert( m_cRef == 0 );
TraceFuncExit();
} //*** CCSAccountPage::~CCSAccountPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnInitDialog( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CCSAccountPage::OnInitDialog( void )
{
TraceFunc( "" );
BOOL bRet;
HRESULT hr;
BSTR bstrDomain = NULL;
IUnknown * punk = NULL;
ITaskManager * ptm = NULL;
LRESULT lr = FALSE;
//
// (jfranco, bug #377545) Limit user name length to MAX_USERNAME_LENGTH
//
// according to msdn, EM_(SET)LIMITTEXT does not return a value, so ignore what SendDlgItemMessage returns
SendDlgItemMessage( m_hwnd, IDC_CSACCOUNT_E_USERNAME, EM_SETLIMITTEXT, MAX_USERNAME_LENGTH, 0 );
//
// Create the task to get the domains.
//
hr = THR( m_psp->TypeSafeQS( CLSID_TaskManager,
ITaskManager,
&ptm
) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( ptm->CreateTask( TASK_GetDomains, &punk ) );
if ( FAILED( hr ) )
goto Cleanup;
// TraceMoveFromMemoryList( punk, g_GlobalMemoryList );
hr = THR( punk->TypeSafeQI( ITaskGetDomains, &m_ptgd ) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( m_ptgd->SetCallback( static_cast< ITaskGetDomainsCallback * >( this ) ) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( ptm->SubmitTask( m_ptgd ) );
if ( FAILED( hr ) )
goto Cleanup;
//
// Default to the script supplied information.
//
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_USERNAME, *m_pbstrUsername );
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_PASSWORD, *m_pbstrPassword );
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN, *m_pbstrDomain );
//
// Get the domain of the current computer.
//
hr = THR( HrGetComputerName( ComputerNameDnsDomain, &bstrDomain ) );
if ( FAILED( hr ) )
goto Cleanup;
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN, bstrDomain );
Cleanup:
THR( HrUpdateWizardButtons( FALSE ) );
if ( punk != NULL )
{
punk->Release();
}
if ( ptm != NULL )
{
ptm->Release();
}
TraceSysFreeString( bstrDomain );
RETURN( lr );
} //*** CCSAccountPage::OnInitDialog()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnCommand(
// UINT idNotificationIn,
// UINT idControlIn,
// HWND hwndSenderIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CCSAccountPage::OnCommand(
UINT idNotificationIn,
UINT idControlIn,
HWND hwndSenderIn
)
{
TraceFunc( "" );
LRESULT lr = FALSE;
switch ( idControlIn )
{
case IDC_CSACCOUNT_E_PASSWORD:
case IDC_CSACCOUNT_E_USERNAME:
if ( idNotificationIn == EN_CHANGE )
{
THR( HrUpdateWizardButtons( FALSE ) );
lr = TRUE;
}
break;
case IDC_CSACCOUNT_CB_DOMAIN:
if ( idNotificationIn == CBN_EDITCHANGE )
{
THR( HrUpdateWizardButtons( FALSE ) );
lr = TRUE;
}
else if ( idNotificationIn == CBN_SELCHANGE )
{
THR( HrUpdateWizardButtons( TRUE ) );
lr = TRUE;
}
break;
}
RETURN( lr );
} //*** CCSAccountPage::OnCommand()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CCSAccountPage::HrUpdateWizardButtons(
// BOOL fIgnoreComboxBoxIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CCSAccountPage::HrUpdateWizardButtons(
BOOL fIgnoreComboxBoxIn
)
{
TraceFunc( "" );
DWORD dwLen;
HRESULT hr = S_OK;
DWORD dwFlags = PSWIZB_BACK | PSWIZB_NEXT;
dwLen = GetWindowTextLength( GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_USERNAME ) );
if ( dwLen == 0 )
{
dwFlags &= ~PSWIZB_NEXT;
}
//
// It is valid to have a blank password. No need to check it.
//
if ( !fIgnoreComboxBoxIn )
{
LRESULT lr;
dwLen = GetWindowTextLength( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ) );
lr = ComboBox_GetCurSel( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ) );
if ( lr == CB_ERR )
{
if ( dwLen == 0 )
{
dwFlags &= ~PSWIZB_NEXT;
}
}
else if ( dwLen == 0 )
{
dwFlags &= ~PSWIZB_NEXT;
}
}
PropSheet_SetWizButtons( GetParent( m_hwnd ), dwFlags );
HRETURN( hr );
} //*** CCSAccountPage::HrUpdateWizardButtons()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotifyQueryCancel( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CCSAccountPage::OnNotifyQueryCancel( void )
{
TraceFunc( "" );
LRESULT lr = TRUE;
int iRet;
iRet = MessageBoxFromStrings( m_hwnd,
IDS_QUERY_CANCEL_TITLE,
IDS_QUERY_CANCEL_TEXT,
MB_YESNO
);
if ( iRet == IDNO )
{
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
}
RETURN( lr );
} //*** CCSAccountPage::OnNotifyQueryCancel()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotifySetActive( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CCSAccountPage::OnNotifySetActive( void )
{
TraceFunc( "" );
HRESULT hr;
OBJECTCOOKIE cookieDummy;
LRESULT lr = TRUE;
IUnknown * punk = NULL;
IClusCfgClusterInfo * pccci = NULL;
IClusCfgCredentials * piccc = NULL;
IObjectManager * pom = NULL;
BSTR bstrUsername = NULL;
BSTR bstrPassword = NULL;
BSTR bstrDomain = NULL;
if ( m_ecamCreateAddMode == camADDING )
{
Assert( *m_pbstrClusterName != NULL );
//
// See if the cluster configuration information has something
// different.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager,
IObjectManager,
&pom
) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType,
NULL,
*m_pbstrClusterName,
DFGUID_ClusterConfigurationInfo,
&cookieDummy,
&punk
) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, &pccci ) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( pccci->GetClusterServiceAccountCredentials( &piccc ) );
if ( FAILED( hr ) )
goto Cleanup;
hr = THR( piccc->GetCredentials( &bstrUsername,
&bstrDomain,
&bstrPassword
) );
if ( FAILED( hr ) )
goto Cleanup;
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_USERNAME, bstrUsername );
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN, bstrDomain );
//
// Only update the password if we actually received something from GetCredentials().
// When we first enter this page, this will not be the case and we would nuke the
// scripted password.
//
if ( ( bstrPassword != NULL )
&& ( *bstrPassword != L'\0' ) )
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_PASSWORD, bstrPassword );
//
// Disable the username and domain windows.
//
EnableWindow( GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_USERNAME ), FALSE );
EnableWindow( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ), FALSE );
}
Cleanup:
THR( HrUpdateWizardButtons( FALSE ) );
if ( punk != NULL )
{
punk->Release();
}
if ( pom != NULL )
{
pom->Release();
}
if ( piccc != NULL )
{
piccc->Release();
}
if ( pccci != NULL )
{
pccci->Release();
}
TraceSysFreeString( bstrUsername );
TraceSysFreeString( bstrPassword );
TraceSysFreeString( bstrDomain );
RETURN( lr );
} //*** CCSAccountPage::OnNotifySetActive()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotifyWizNext( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CCSAccountPage::OnNotifyWizNext( void )
{
TraceFunc( "" );
HRESULT hr;
HWND hwnd;
DWORD dwLen;
BSTR bstrUsername = NULL;
BSTR bstrPassword = NULL;
BSTR bstrDomain = NULL;
OBJECTCOOKIE cookieDummy;
LRESULT lr = TRUE;
IUnknown * punk = NULL;
IObjectManager * pom = NULL;
IClusCfgClusterInfo * pccci = NULL;
IClusCfgCredentials * piccc = NULL;
//
// Get the username from the UI.
//
hwnd = GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_USERNAME );
Assert( hwnd != NULL );
dwLen = GetWindowTextLength( hwnd );
Assert( dwLen != 0 );
dwLen ++;
bstrUsername = TraceSysAllocStringByteLen( NULL, sizeof(WCHAR) * ( dwLen + 1 ) );
if ( bstrUsername == NULL )
goto OutOfMemory;
GetWindowText( hwnd, bstrUsername, dwLen );
//
// Get the password from the UI.
//
hwnd = GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_PASSWORD );
Assert( hwnd != NULL );
dwLen = GetWindowTextLength( hwnd );
dwLen ++;
bstrPassword = TraceSysAllocStringByteLen( NULL, sizeof(WCHAR) * ( dwLen + 1 ) );
if ( bstrPassword == NULL )
goto OutOfMemory;
GetWindowText( hwnd, bstrPassword, dwLen );
//
// Get the domain from the UI.
//
hwnd = GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN );
Assert( hwnd != NULL );
dwLen = GetWindowTextLength( hwnd );
Assert( dwLen != 0 );
dwLen ++;
bstrDomain = TraceSysAllocStringByteLen( NULL, sizeof(WCHAR) * ( dwLen + 1 ) );
if ( bstrDomain == NULL )
goto OutOfMemory;
GetWindowText( hwnd, bstrDomain, dwLen );
//
// Release the old strings (if any).
//
TraceSysFreeString( *m_pbstrUsername );
TraceSysFreeString( *m_pbstrPassword );
TraceSysFreeString( *m_pbstrDomain );
//
// Give ownership away.
//
*m_pbstrUsername = bstrUsername;
*m_pbstrPassword = bstrPassword;
*m_pbstrDomain = bstrDomain;
bstrUsername = NULL;
bstrPassword = NULL;
bstrDomain = NULL;
//
// Grab the object manager.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager,
IObjectManager,
&pom
) );
if ( FAILED( hr ) )
goto Error;
//
// Get the cluster configuration info.
//
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType,
NULL,
*m_pbstrClusterName,
DFGUID_ClusterConfigurationInfo,
&cookieDummy,
&punk
) );
if ( FAILED( hr ) )
goto Error;
hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, &pccci ) );
if ( FAILED( hr ) )
goto Cleanup;
//
// Set the cluster service account credentials...
//
hr = THR( pccci->GetClusterServiceAccountCredentials( &piccc ) );
if ( FAILED( hr ) )
goto Error;
hr = THR( piccc->SetCredentials( *m_pbstrUsername, *m_pbstrDomain, *m_pbstrPassword ) );
if ( FAILED( hr ) )
goto Error;
Cleanup:
if ( punk != NULL )
{
punk->Release();
}
TraceSysFreeString( bstrUsername );
TraceSysFreeString( bstrPassword );
TraceSysFreeString( bstrDomain );
if ( piccc != NULL )
{
piccc->Release();
}
if ( pccci != NULL )
{
pccci->Release();
}
if ( pom != NULL )
{
pom->Release();
}
RETURN( lr );
Error:
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
goto Cleanup;
OutOfMemory:
goto Error;
} //*** CCSAccountPage::OnNotifyWizNext()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotify(
// WPARAM idCtrlIn,
// LPNMHDR pnmhdrIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CCSAccountPage::OnNotify(
WPARAM idCtrlIn,
LPNMHDR pnmhdrIn
)
{
TraceFunc( "" );
LRESULT lr = TRUE;
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, 0 );
switch( pnmhdrIn->code )
{
case PSN_SETACTIVE:
lr = OnNotifySetActive();
break;
case PSN_WIZNEXT:
lr = OnNotifyWizNext();
break;
case PSN_QUERYCANCEL:
lr = OnNotifyQueryCancel();
break;
}
RETURN( lr );
} //*** CCSAccountPage::OnNotify()
//////////////////////////////////////////////////////////////////////////////
//++
//
// INT_PTR
// CALLBACK
// CCSAccountPage::S_DlgProc(
// HWND hDlgIn,
// UINT MsgIn,
// WPARAM wParam,
// LPARAM lParam
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
INT_PTR
CALLBACK
CCSAccountPage::S_DlgProc(
HWND hDlgIn,
UINT MsgIn,
WPARAM wParam,
LPARAM lParam
)
{
// Don't do TraceFunc because every mouse movement
// will cause this function to be called.
WndMsg( hDlgIn, MsgIn, wParam, lParam );
LRESULT lr = FALSE;
CCSAccountPage * pPage = reinterpret_cast< CCSAccountPage *> ( GetWindowLongPtr( hDlgIn, GWLP_USERDATA ) );
if ( MsgIn == WM_INITDIALOG )
{
PROPSHEETPAGE * ppage = reinterpret_cast< PROPSHEETPAGE * >( lParam );
SetWindowLongPtr( hDlgIn, GWLP_USERDATA, (LPARAM) ppage->lParam );
pPage = reinterpret_cast< CCSAccountPage * >( ppage->lParam );
pPage->m_hwnd = hDlgIn;
}
if ( pPage != NULL )
{
Assert( hDlgIn == pPage->m_hwnd );
switch( MsgIn )
{
case WM_INITDIALOG:
lr = pPage->OnInitDialog();
break;
case WM_NOTIFY:
lr = pPage->OnNotify( wParam, reinterpret_cast< LPNMHDR >( lParam ) );
break;
case WM_COMMAND:
lr= pPage->OnCommand( HIWORD( wParam ), LOWORD( wParam ), (HWND) lParam );
break;
// no default clause needed
}
}
return lr;
} //*** CCSAccountPage::S_DlgProc()
// ************************************************************************
//
// IUnknown
//
// ************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CCSAccountPage::QueryInterface(
// REFIID riidIn,
// LPVOID * ppvOut
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CCSAccountPage::QueryInterface(
REFIID riidIn,
LPVOID * ppvOut
)
{
TraceQIFunc( riidIn, ppvOut );
HRESULT hr = E_NOINTERFACE;
if ( IsEqualIID( riidIn, IID_IUnknown ) )
{
*ppvOut = static_cast< ITaskGetDomainsCallback * >( this );
hr = S_OK;
} // if: IUnknown
else if ( IsEqualIID( riidIn, IID_ITaskGetDomainsCallback ) )
{
*ppvOut = TraceInterface( __THISCLASS__, ITaskGetDomainsCallback, this, 0 );
hr = S_OK;
} // else if: ITaskGetDomainsCallback
if ( SUCCEEDED( hr ) )
{
((IUnknown*) *ppvOut)->AddRef();
} // if: success
QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
} //*** CCSAccountPage::QueryInterface()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CCSAccountPage::AddRef( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG )
CCSAccountPage::AddRef( void )
{
TraceFunc( "[IUnknown]" );
InterlockedIncrement( &m_cRef );
RETURN( m_cRef );
} //*** CCSAccountPage::AddRef()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CCSAccountPage::Release( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG )
CCSAccountPage::Release( void )
{
TraceFunc( "[IUnknown]" );
InterlockedDecrement( &m_cRef );
if ( m_cRef )
RETURN( m_cRef );
// TraceDo( delete this );
RETURN(0);
} //*** CCSAccountPage::Release()
//****************************************************************************
//
// ITaskGetDomainsCallback
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CCSAccountPage::ReceiveDomainResult(
// HRESULT hrIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CCSAccountPage::ReceiveDomainResult(
HRESULT hrIn
)
{
TraceFunc( "[ITaskGetDomainsCallback]" );
HRESULT hr;
hr = THR( m_ptgd->SetCallback( NULL ) );
HRETURN( hr );
} //*** CCSAccountPage::ReceiveResult()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CCSAccountPage::ReceiveDomainName(
// LPCWSTR pcszDomainIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CCSAccountPage::ReceiveDomainName(
LPCWSTR pcszDomainIn
)
{
TraceFunc( "[ITaskGetDomainsCallback]" );
HRESULT hr = S_OK;
ComboBox_AddString( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ), pcszDomainIn );
HRETURN( hr );
} //*** CCSAccountPage::ReceiveName()