windows-nt/Source/XPSP1/NT/admin/wizards/shrwiz/wizperm.cpp
2020-09-26 16:20:57 +08:00

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;
}
}