153 lines
3.6 KiB
C++
153 lines
3.6 KiB
C++
// 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
|
|
}
|