// TrusterDlg.cpp : implementation file // #include "stdafx.h" #include "TrstDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTrusterDlg dialog CTrusterDlg::CTrusterDlg(CWnd* pParent /*=NULL*/) : CDialog(CTrusterDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTrusterDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CTrusterDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_USERNAME, m_strUser); DDX_Text(pDX, IDC_PASSWORD, m_strPassword); DDX_Text(pDX, IDC_DOMAINNAME, m_strDomain); //{{AFX_DATA_MAP(CTrusterDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTrusterDlg, CDialog) //{{AFX_MSG_MAP(CTrusterDlg) ON_BN_CLICKED(IDC_OK, OnOK) ON_BN_CLICKED(IDC_CANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTrusterDlg message handlers DWORD CTrusterDlg::VerifyPassword(WCHAR * sUserName, WCHAR * sPassword, WCHAR * sDomain) { CWaitCursor wait; DWORD retVal = 0; CString strDomainUserName; CString localIPC; WCHAR localMachine[MAX_PATH]; NETRESOURCE nr; memset(&nr,0,(sizeof nr)); strDomainUserName.Format(L"%s\\%s",sDomain,sUserName); // get the name of the local machine if ( GetComputerName(localMachine,&len) ) { localIPC.Format(L"\\\\%s",localMachine); nr.dwType = RESOURCETYPE_ANY; nr.lpRemoteName = localIPC.GetBuffer(0); retVal = WNetAddConnection2(&nr,sPassword,strDomainUserName,0); if ( ! retVal ) { retVal = WNetCancelConnection2(localIPC.GetBuffer(0),0,TRUE); if ( retVal ) retVal = 0; } else if ( retVal == ERROR_SESSION_CREDENTIAL_CONFLICT ) { // skip the password check in this case retVal = 0; } } else { retVal = GetLastError(); } return 0; } void CTrusterDlg::OnOK() { toreturn =false; UpdateData(TRUE); m_strUser.TrimLeft();m_strUser.TrimRight(); m_strDomain.TrimLeft();m_strDomain.TrimRight(); m_strPassword.TrimLeft();m_strPassword.TrimRight(); if (m_strUser.IsEmpty() || m_strDomain.IsEmpty()) { CString c; c.LoadString(IDS_MSG_DOMAIN); CString d; d.LoadString(IDS_MSG_INPUT); MessageBox(c,d,MB_OK); toreturn =false; } else { DWORD returncode = VerifyPassword(m_strUser.GetBuffer(1000),m_strPassword.GetBuffer(1000),m_strDomain.GetBuffer(1000)); m_strDomain.ReleaseBuffer(); m_strUser.ReleaseBuffer(); m_strPassword.ReleaseBuffer(); if (returncode==ERROR_LOGON_FAILURE || m_strUser.IsEmpty()) { CString e; err.ErrorCodeToText(returncode,1000,e.GetBuffer(1000)); e.ReleaseBuffer(); CString txt; swprintf(txt.GetBuffer(1000),L"%u",returncode); txt.ReleaseBuffer(); CString text; text.LoadString(IDS_MSG_ERRORBUF); e += text; e+=txt; e+=L")"; CString title; title.LoadString(IDS_MSG_ERROR); MessageBox(e,title,MB_OK); toreturn =false; } else { toreturn =true; } } CDialog::OnOK(); } void CTrusterDlg::OnCancel() { toreturn=false; // TODO: Add your control notification handler code here CDialog::OnCancel(); } BOOL CTrusterDlg::OnInitDialog() { CDialog::OnInitDialog(); toreturn =false; if ( m_strDomain.IsEmpty() ) return TRUE; else UpdateData(FALSE); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }