408 lines
11 KiB
C++
408 lines
11 KiB
C++
|
// WizPerm.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "shrwiz.h"
|
||
|
#include "WizPerm.h"
|
||
|
#include "aclpage.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CWizPerm property page
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CWizPerm, CPropertyPage)
|
||
|
|
||
|
CWizPerm::CWizPerm() : CPropertyPage(CWizPerm::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CWizPerm)
|
||
|
// NOTE: the ClassWizard will add member initialization here
|
||
|
//}}AFX_DATA_INIT
|
||
|
}
|
||
|
|
||
|
CWizPerm::~CWizPerm()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CWizPerm::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CWizPerm)
|
||
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CWizPerm, CPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CWizPerm)
|
||
|
ON_BN_CLICKED(IDC_RADIO_PERM1, OnRadioPerm1)
|
||
|
ON_BN_CLICKED(IDC_RADIO_PERM2, OnRadioPerm2)
|
||
|
ON_BN_CLICKED(IDC_RADIO_PERM3, OnRadioPerm3)
|
||
|
ON_BN_CLICKED(IDC_RADIO_PERM4, OnRadioPerm4)
|
||
|
ON_BN_CLICKED(IDC_PERM_CUSTOM, OnPermCustom)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CWizPerm message handlers
|
||
|
void CWizPerm::OnRadioPerm1()
|
||
|
{
|
||
|
Reset();
|
||
|
GetDlgItem(IDC_PERM_CUSTOM)->EnableWindow(FALSE);
|
||
|
GetParent()->GetDlgItem(ID_WIZFINISH)->EnableWindow(TRUE);
|
||
|
}
|
||
|
|
||
|
void CWizPerm::OnRadioPerm2()
|
||
|
{
|
||
|
Reset();
|
||
|
GetDlgItem(IDC_PERM_CUSTOM)->EnableWindow(FALSE);
|
||
|
GetParent()->GetDlgItem(ID_WIZFINISH)->EnableWindow(TRUE);
|
||
|
}
|
||
|
|
||
|
void CWizPerm::OnRadioPerm3()
|
||
|
{
|
||
|
Reset();
|
||
|
GetDlgItem(IDC_PERM_CUSTOM)->EnableWindow(FALSE);
|
||
|
GetParent()->GetDlgItem(ID_WIZFINISH)->EnableWindow(TRUE);
|
||
|
}
|
||
|
|
||
|
void CWizPerm::OnRadioPerm4()
|
||
|
{
|
||
|
Reset();
|
||
|
GetDlgItem(IDC_PERM_CUSTOM)->EnableWindow(TRUE);
|
||
|
GetParent()->GetDlgItem(ID_WIZFINISH)->EnableWindow(FALSE);
|
||
|
}
|
||
|
|
||
|
void CWizPerm::OnPermCustom()
|
||
|
{
|
||
|
CWaitCursor wait;
|
||
|
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
TRACE(_T("CoInitializeEx failed hr=%x"), hr);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CShrwizApp *pApp = (CShrwizApp *)AfxGetApp();
|
||
|
CShareSecurityInformation *pssInfo = NULL;
|
||
|
HPROPSHEETPAGE phPages[2];
|
||
|
int cPages = 1;
|
||
|
|
||
|
CString cstrSheetTitle, cstrSharePageTitle;
|
||
|
cstrSheetTitle.LoadString(IDS_CUSTOM_PERM);
|
||
|
cstrSharePageTitle.LoadString(IDS_SHARE_PERMISSIONS);
|
||
|
|
||
|
// create "Share Permissions" property page
|
||
|
BOOL bSFMOnly = (!pApp->m_bSMB && !pApp->m_bFPNW && pApp->m_bSFM);
|
||
|
if (bSFMOnly)
|
||
|
{
|
||
|
PROPSHEETPAGE psp;
|
||
|
ZeroMemory(&psp, sizeof(psp));
|
||
|
psp.dwSize = sizeof(psp);
|
||
|
psp.dwFlags = PSP_USETITLE;
|
||
|
psp.hInstance = AfxGetResourceHandle();
|
||
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_NO_SHARE_PERMISSIONS);
|
||
|
psp.pszTitle = cstrSharePageTitle;
|
||
|
|
||
|
phPages[0] = CreatePropertySheetPage(&psp);
|
||
|
if ( !(phPages[0]) )
|
||
|
{
|
||
|
hr = GetLastError();
|
||
|
DisplayMessageBox(m_hWnd, MB_OK|MB_ICONWARNING, hr, IDS_FAILED_TO_CREATE_ACLUI);
|
||
|
}
|
||
|
} else
|
||
|
{
|
||
|
pssInfo = new CShareSecurityInformation(pApp->m_pSD);
|
||
|
if (!pssInfo)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
DisplayMessageBox(m_hWnd, MB_OK|MB_ICONWARNING, hr, IDS_FAILED_TO_CREATE_ACLUI);
|
||
|
} else
|
||
|
{
|
||
|
pssInfo->Initialize(pApp->m_cstrTargetComputer, pApp->m_cstrShareName, cstrSharePageTitle);
|
||
|
phPages[0] = CreateSecurityPage(pssInfo);
|
||
|
if ( !(phPages[0]) )
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
DisplayMessageBox(m_hWnd, MB_OK|MB_ICONWARNING, hr, IDS_FAILED_TO_CREATE_ACLUI);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
// create "File Security" property page
|
||
|
CFileSecurityDataObject *pfsDataObject = new CFileSecurityDataObject;
|
||
|
if (!pfsDataObject)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
DisplayMessageBox(m_hWnd, MB_OK|MB_ICONWARNING, hr, IDS_FAILED_TO_CREATE_ACLUI);
|
||
|
// destroy pages that have not been passed to the PropertySheet function
|
||
|
DestroyPropertySheetPage(phPages[0]);
|
||
|
} else
|
||
|
{
|
||
|
pfsDataObject->Initialize(pApp->m_cstrTargetComputer, pApp->m_cstrFolder);
|
||
|
hr = CreateFileSecurityPropPage(&(phPages[1]), pfsDataObject);
|
||
|
if (SUCCEEDED(hr))
|
||
|
cPages = 2;
|
||
|
|
||
|
PROPSHEETHEADER psh;
|
||
|
ZeroMemory(&psh, sizeof(psh));
|
||
|
psh.dwSize = sizeof(psh);
|
||
|
psh.dwFlags = PSH_DEFAULT | PSH_NOAPPLYNOW;
|
||
|
psh.hwndParent = m_hWnd;
|
||
|
psh.hInstance = AfxGetResourceHandle();
|
||
|
psh.pszCaption = cstrSheetTitle;
|
||
|
psh.nPages = cPages;
|
||
|
psh.phpage = phPages;
|
||
|
|
||
|
// create the property sheet
|
||
|
PropertySheet(&psh);
|
||
|
|
||
|
// acl pages have been successfully added, enable the Finish button
|
||
|
GetParent()->GetDlgItem(ID_WIZFINISH)->EnableWindow(TRUE);
|
||
|
|
||
|
pfsDataObject->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!bSFMOnly)
|
||
|
{
|
||
|
if (pssInfo)
|
||
|
pssInfo->Release();
|
||
|
}
|
||
|
|
||
|
CoUninitialize();
|
||
|
}
|
||
|
|
||
|
LRESULT CWizPerm::OnWizardBack()
|
||
|
{
|
||
|
Reset();
|
||
|
|
||
|
CShrwizApp *pApp = (CShrwizApp *)AfxGetApp();
|
||
|
pApp->m_bNextButtonClicked = FALSE;
|
||
|
|
||
|
return CPropertyPage::OnWizardBack();
|
||
|
}
|
||
|
|
||
|
BOOL CWizPerm::OnWizardFinish()
|
||
|
{
|
||
|
CWaitCursor wait;
|
||
|
HRESULT hr = S_OK;
|
||
|
BOOL bCustom = FALSE;
|
||
|
CShrwizApp *pApp = (CShrwizApp *)AfxGetApp();
|
||
|
pApp->m_bNextButtonClicked = TRUE;
|
||
|
|
||
|
switch (GetCheckedRadioButton(IDC_RADIO_PERM1, IDC_RADIO_PERM4))
|
||
|
{
|
||
|
case IDC_RADIO_PERM1:
|
||
|
{
|
||
|
CPermEntry permEntry;
|
||
|
hr = permEntry.Initialize(pApp->m_cstrTargetComputer, ACCOUNT_EVERYONE, SHARE_PERM_FULL_CONTROL);
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = BuildSecurityDescriptor(&permEntry, 1, &(pApp->m_pSD));
|
||
|
}
|
||
|
break;
|
||
|
case IDC_RADIO_PERM2:
|
||
|
{
|
||
|
CPermEntry permEntry[2];
|
||
|
hr = permEntry[0].Initialize(pApp->m_cstrTargetComputer, ACCOUNT_EVERYONE, SHARE_PERM_READ_ONLY);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = permEntry[1].Initialize(pApp->m_cstrTargetComputer, ACCOUNT_ADMINISTRATORS, SHARE_PERM_FULL_CONTROL);
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = BuildSecurityDescriptor(permEntry, 2, &(pApp->m_pSD));
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case IDC_RADIO_PERM3:
|
||
|
{
|
||
|
CPermEntry permEntry;
|
||
|
hr = permEntry.Initialize(pApp->m_cstrTargetComputer, ACCOUNT_ADMINISTRATORS, SHARE_PERM_FULL_CONTROL);
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = BuildSecurityDescriptor(&permEntry, 1, &(pApp->m_pSD));
|
||
|
}
|
||
|
break;
|
||
|
case IDC_RADIO_PERM4:
|
||
|
bCustom = TRUE;
|
||
|
break;
|
||
|
default:
|
||
|
ASSERT(FALSE);
|
||
|
return FALSE; // prevent the property sheet from being destroyed
|
||
|
}
|
||
|
|
||
|
if (!bCustom && FAILED(hr))
|
||
|
{
|
||
|
DisplayMessageBox(m_hWnd, MB_OK|MB_ICONERROR, hr, IDS_FAILED_TO_GET_SD);
|
||
|
return FALSE; // prevent the property sheet from being destroyed
|
||
|
}
|
||
|
|
||
|
switch (CreateShare())
|
||
|
{
|
||
|
case IDNO: // succeeded, no more shares
|
||
|
break;
|
||
|
case IDYES: // succeeded, need to create more shares
|
||
|
pApp->Reset(); // jump back to the first page, and fall through
|
||
|
default: // error happened
|
||
|
return FALSE; // prevent the property sheet from being destroyed
|
||
|
}
|
||
|
|
||
|
return CPropertyPage::OnWizardFinish();
|
||
|
}
|
||
|
|
||
|
BOOL CWizPerm::OnSetActive()
|
||
|
{
|
||
|
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
|
||
|
|
||
|
CShrwizApp *pApp = (CShrwizApp *)AfxGetApp();
|
||
|
if (pApp->m_bNextButtonClicked)
|
||
|
{
|
||
|
BOOL bSFMOnly = (!pApp->m_bSMB && !pApp->m_bFPNW && pApp->m_bSFM);
|
||
|
if (bSFMOnly)
|
||
|
{
|
||
|
GetDlgItem(IDC_RADIO_PERM1)->EnableWindow(FALSE);
|
||
|
GetDlgItem(IDC_RADIO_PERM2)->EnableWindow(FALSE);
|
||
|
GetDlgItem(IDC_RADIO_PERM3)->EnableWindow(FALSE);
|
||
|
CheckRadioButton(IDC_RADIO_PERM1, IDC_RADIO_PERM4, IDC_RADIO_PERM4);
|
||
|
OnRadioPerm4();
|
||
|
// enable the Finish button initially if only MAC is selected
|
||
|
GetParent()->GetDlgItem(ID_WIZFINISH)->EnableWindow(TRUE);
|
||
|
} else
|
||
|
{
|
||
|
GetDlgItem(IDC_RADIO_PERM1)->EnableWindow(TRUE);
|
||
|
GetDlgItem(IDC_RADIO_PERM2)->EnableWindow(TRUE);
|
||
|
GetDlgItem(IDC_RADIO_PERM3)->EnableWindow(TRUE);
|
||
|
CheckRadioButton(IDC_RADIO_PERM1, IDC_RADIO_PERM4, IDC_RADIO_PERM1);
|
||
|
OnRadioPerm1();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return CPropertyPage::OnSetActive();
|
||
|
}
|
||
|
|
||
|
void CWizPerm::Reset()
|
||
|
{
|
||
|
CShrwizApp *pApp = (CShrwizApp *)AfxGetApp();
|
||
|
|
||
|
if (pApp->m_pSD)
|
||
|
{
|
||
|
LocalFree((HLOCAL)(pApp->m_pSD));
|
||
|
pApp->m_pSD = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int
|
||
|
CWizPerm::CreateShare()
|
||
|
{
|
||
|
DWORD dwRet = NERR_Success;
|
||
|
CShrwizApp *pApp = (CShrwizApp *)AfxGetApp();
|
||
|
UINT iSuccess = 0;
|
||
|
CString cstrSuccessMsg;
|
||
|
CString cstrFailureMsg;
|
||
|
CString cstrLineReturn;
|
||
|
cstrLineReturn.LoadString(IDS_LINE_RETURN);
|
||
|
|
||
|
do {
|
||
|
CString cstrMsg;
|
||
|
cstrSuccessMsg.LoadString(IDS_SUCCEEDED_IN_CREATING_SHARE);
|
||
|
|
||
|
if (pApp->m_bSMB)
|
||
|
{
|
||
|
CString cstrSMB;
|
||
|
cstrSMB.LoadString(IDS_SMB_CLIENTS);
|
||
|
|
||
|
dwRet = SMBCreateShare(
|
||
|
pApp->m_cstrTargetComputer,
|
||
|
pApp->m_cstrShareName,
|
||
|
pApp->m_cstrShareDescription,
|
||
|
pApp->m_cstrFolder,
|
||
|
pApp->m_pSD
|
||
|
);
|
||
|
if (NERR_Success != dwRet)
|
||
|
{
|
||
|
GetDisplayMessage(cstrMsg, dwRet, IDS_FAILED_TO_CREATE_SHARE, cstrSMB);
|
||
|
cstrFailureMsg += cstrMsg;
|
||
|
cstrFailureMsg += cstrLineReturn;
|
||
|
} else
|
||
|
{
|
||
|
iSuccess++;
|
||
|
cstrSuccessMsg += cstrSMB;
|
||
|
cstrSuccessMsg += cstrLineReturn;
|
||
|
pApp->m_bSMB = FALSE;
|
||
|
|
||
|
if (pApp->m_bIsLocal) // refresh shell
|
||
|
SHChangeNotify(SHCNE_NETSHARE, SHCNF_PATH | SHCNF_FLUSH, pApp->m_cstrFolder, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pApp->m_bFPNW)
|
||
|
{
|
||
|
CString cstrFPNW;
|
||
|
cstrFPNW.LoadString(IDS_FPNW_CLIENTS);
|
||
|
|
||
|
dwRet = FPNWCreateShare(
|
||
|
pApp->m_cstrTargetComputer,
|
||
|
pApp->m_cstrShareName,
|
||
|
pApp->m_cstrFolder,
|
||
|
pApp->m_pSD,
|
||
|
pApp->m_hLibFPNW
|
||
|
);
|
||
|
if (NERR_Success != dwRet)
|
||
|
{
|
||
|
GetDisplayMessage(cstrMsg, dwRet, IDS_FAILED_TO_CREATE_SHARE, cstrFPNW);
|
||
|
cstrFailureMsg += cstrMsg;
|
||
|
cstrFailureMsg += cstrLineReturn;
|
||
|
} else
|
||
|
{
|
||
|
iSuccess++;
|
||
|
cstrSuccessMsg += cstrFPNW;
|
||
|
cstrSuccessMsg += cstrLineReturn;
|
||
|
pApp->m_bFPNW = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pApp->m_bSFM)
|
||
|
{
|
||
|
CString cstrSFM;
|
||
|
cstrSFM.LoadString(IDS_SFM_CLIENTS);
|
||
|
|
||
|
dwRet = SFMCreateShare(
|
||
|
pApp->m_cstrTargetComputer,
|
||
|
pApp->m_cstrMACShareName,
|
||
|
pApp->m_cstrFolder,
|
||
|
pApp->m_hLibSFM
|
||
|
);
|
||
|
if (NERR_Success != dwRet)
|
||
|
{
|
||
|
GetDisplayMessage(cstrMsg, dwRet, IDS_FAILED_TO_CREATE_SHARE, cstrSFM);
|
||
|
cstrFailureMsg += cstrMsg;
|
||
|
cstrFailureMsg += cstrLineReturn;
|
||
|
} else
|
||
|
{
|
||
|
iSuccess++;
|
||
|
cstrSuccessMsg += cstrSFM;
|
||
|
cstrSuccessMsg += cstrLineReturn;
|
||
|
pApp->m_bSFM = FALSE;
|
||
|
}
|
||
|
}
|
||
|
} while (0);
|
||
|
|
||
|
cstrSuccessMsg += cstrLineReturn;
|
||
|
if (cstrFailureMsg.IsEmpty())
|
||
|
{
|
||
|
CString cstrMoreShares;
|
||
|
cstrMoreShares.LoadString(IDS_OPERATION_SUCCEEDED_MORE_SHARES);
|
||
|
return DisplayMessageBox(m_hWnd, MB_YESNO|MB_ICONINFORMATION, 0, 0,
|
||
|
cstrSuccessMsg + cstrMoreShares);
|
||
|
} else
|
||
|
{
|
||
|
DisplayMessageBox(m_hWnd, MB_OK|MB_ICONERROR, 0, 0,
|
||
|
(iSuccess ? (cstrSuccessMsg + cstrFailureMsg) : cstrFailureMsg));
|
||
|
return IDRETRY;
|
||
|
}
|
||
|
}
|