2025-11-28 00:35:46 +09:00

287 lines
5.7 KiB
C++

//----------------------------------------------------------------------------
//
// Microsoft Active Directory 2.5 Sample Code
//
// Copyright (C) Microsoft Corporation, 1996 - 2000
//
// File: ADsOpenDSObject.cpp
//
// Contents: IADsOpenDSObject and ADsOpenObject usage
//
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "ADQI.h"
#include "ADsOpenDSObject.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void DlgProcIADsOpenDSObject( LPUNKNOWN pUnk, LPUNKNOWN *ppNew)
{
CDlgIADsOpenDSObject dlg( pUnk, ppNew );
dlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CDlgIADsOpenDSObject dialog
CDlgIADsOpenDSObject::CDlgIADsOpenDSObject( LPUNKNOWN pUnk, LPUNKNOWN *ppNew, CWnd* pParent /*=NULL*/)
: CDialog(CDlgIADsOpenDSObject::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgIADsOpenDSObject)
m_sPassword = _T("");
m_sUserName = _T("");
m_bEncrypt = FALSE;
m_bReadOnly = FALSE;
m_bSecured = FALSE;
m_bPrompt = FALSE;
m_bNoAuthentication = FALSE;
m_sADsPath = _T("");
m_bClearText = FALSE;
m_bFastBind = FALSE;
m_bSealing = FALSE;
m_bSigning = FALSE;
//}}AFX_DATA_INIT
HRESULT hr;
m_pOpenDS = NULL;
m_ppUnk = ppNew;
hr = pUnk->QueryInterface( IID_IADsOpenDSObject, (void **) &m_pOpenDS );
if ( !SUCCEEDED(hr) )
{
// Give warning... ADsOpenObject has the same functionality as IADsOpenDSObject,
// the only different is the IADsOpenDSObject normally lives on the namespace object
AfxMessageBox(_T("Warning: QI for IADsOpenDSObject failed, we will use ADsOpenObject()"));
}
CComPtr<IADs> pADs=NULL;
BSTR bstr;
hr = pUnk->QueryInterface( IID_IADs, (void**) &pADs );
if ( SUCCEEDED(hr) )
{
pADs->get_ADsPath( &bstr );
m_sADsPath = bstr;
SysFreeString( bstr );
}
pUnk->Release();
}
CDlgIADsOpenDSObject::~CDlgIADsOpenDSObject()
{
if ( m_pOpenDS )
{
m_pOpenDS->Release();
}
}
void CDlgIADsOpenDSObject::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgIADsOpenDSObject)
DDX_Text(pDX, IDC_PASSWORD, m_sPassword);
DDX_Text(pDX, IDC_USERNAME, m_sUserName);
DDX_Check(pDX, IDC_ENCRYPT, m_bEncrypt);
DDX_Check(pDX, IDC_READONLY, m_bReadOnly);
DDX_Check(pDX, IDC_SECURED, m_bSecured);
DDX_Check(pDX, IDC_PROMPTCREDENTIAL, m_bPrompt);
DDX_Check(pDX, IDC_NOAUTHENTICATION, m_bNoAuthentication);
DDX_Text(pDX, IDC_ADSPATH, m_sADsPath);
DDX_Check(pDX, IDC_CLEARTEXT, m_bClearText);
DDX_Check(pDX, IDC_FASTBIND, m_bFastBind);
DDX_Check(pDX, IDC_SEALING, m_bSealing);
DDX_Check(pDX, IDC_SIGNING, m_bSigning);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgIADsOpenDSObject, CDialog)
//{{AFX_MSG_MAP(CDlgIADsOpenDSObject)
ON_EN_CHANGE(IDC_USERNAME, OnChangeUsername)
ON_EN_CHANGE(IDC_ADSPATH, OnChangeADsPath)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgIADsOpenDSObject message handlers
void CDlgIADsOpenDSObject::OnOK()
{
HRESULT hr;
DWORD dwFlag;
UpdateData(TRUE);
dwFlag = 0;
if ( m_bSecured )
{
dwFlag |= ADS_SECURE_AUTHENTICATION;
}
if ( m_bReadOnly )
{
dwFlag |= ADS_READONLY_SERVER;
}
if ( m_bEncrypt )
{
dwFlag |= ADS_USE_ENCRYPTION;
}
if ( m_bPrompt )
{
dwFlag |= ADS_PROMPT_CREDENTIALS;
}
if ( m_bNoAuthentication )
{
dwFlag = ADS_NO_AUTHENTICATION;
}
if ( m_bFastBind )
{
dwFlag |= ADS_FAST_BIND;
}
if ( m_bSigning )
{
dwFlag |= ADS_USE_SIGNING;
}
if ( m_bSealing )
{
dwFlag |= ADS_USE_SEALING;
}
USES_CONVERSION;
LPWSTR pszUser=NULL;
LPWSTR pszPwd=NULL;
IUnknown *pNewUnk;
if ( !m_sUserName.IsEmpty() )
{
pszUser = T2OLE(m_sUserName);
}
pszPwd = T2OLE(m_sPassword);
if ( pszUser == NULL )
{
hr = ADsGetObject( T2OLE(m_sADsPath), IID_IUnknown, (void**) &pNewUnk );
}
else
{
if ( m_pOpenDS )
{
hr = m_pOpenDS->OpenDSObject( T2OLE(m_sADsPath), pszUser, pszPwd,
dwFlag, (IDispatch**) &pNewUnk );
}
else
{
hr = ADsOpenObject( T2OLE(m_sADsPath), pszUser, pszPwd,
dwFlag, IID_IUnknown, (void**) &pNewUnk );
}
}
if ( !SUCCEEDED(hr) )
{
AfxMessageBox(GetErrorMessage(hr));
return;
}
//////////////////////////////////////////////////////////////////////
// Save it so, somebody can ask the pointer with its credentials have
// been validated
////////////////////////////////////////////////////////////////////
if (SUCCEEDED(hr) )
{
*m_ppUnk = pNewUnk; // new validate iunkown;
////////////////////////////////////////////////////////////
// IMPORTANT!!: DO NOT SAVE THE PASSWORD IN MEMORY
///////////////////////////////////////////////////////////
if ( pszUser )
{
App->SetCredentials( OLE2T(pszUser), dwFlag ); // save it for later use
}
else
{
App->SetCredentials( _T(""), dwFlag ); // save it for later use
}
}
CDialog::OnOK();
}
void CDlgIADsOpenDSObject::OnChangeUsername()
{
BOOL bADsLength;
//////////////////////////////////////////////////////////////
// Turn off/on the OK button depending if ADsPath Edit box is filled.
//////////////////////////////////////////////////////////////////////
bADsLength = GetDlgItem(IDC_ADSPATH)->GetWindowTextLength() > 0 ? TRUE : FALSE;
GetDlgItem( IDOK )->EnableWindow( bADsLength );
}
void CDlgIADsOpenDSObject::OnChangeADsPath()
{
OnChangeUsername();
}
BOOL CDlgIADsOpenDSObject::OnInitDialog()
{
CDialog::OnInitDialog();
// Get the current DN;
OnChangeUsername();
UpdateData(FALSE); // update to relect the UI
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}