windows-nt/Source/XPSP1/NT/com/ole32/oleui/srvppg.cpp
2020-09-26 16:20:57 +08:00

1093 lines
30 KiB
C++

//+---------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1997.
//
// File: srvppg.cpp
//
// Contents: Implements the classes CServersPropertyPage,
// CMachinePropertyPage and CDefaultSecurityPropertyPage to
// manage the three property pages for top level info
//
// Classes:
//
// Methods: CServersPropertyPage::CServersPropertyPage
// CServersPropertyPage::~CServersPropertyPage
// CServersPropertyPage::OnProperties
// CServersPropertyPage::DoDataExchange
// CServersPropertyPage::OnServerProperties
// CServersPropertyPage::OnInitDialog
// CServersPropertyPage::FetchAndDisplayClasses
// CServersPropertyPage::OnList1
// CServersPropertyPage::OnDoubleclickedList1
// CServersPropertyPage::OnButton2
// CMachinePropertyPage::CMachinePropertyPage
// CMachinePropertyPage::~CMachinePropertyPage
// CMachinePropertyPage::DoDataExchange
// CMachinePropertyPage::OnInitDialog
// CMachinePropertyPage::OnCombo1
// CMachinePropertyPage::OnCheck1
// CMachinePropertyPage::OnCheck2
// CMachinePropertyPage::OnEditchangeCombo1
// CMachinePropertyPage::OnSelchangeCombo1
// CMachinePropertyPage::OnEditchangeCombo2
// CMachinePropertyPage::OnSelchangeCombo2
// CDefaultSecurityPropertyPage::CDefaultSecurityPropertyPage
// CDefaultSecurityPropertyPage::~CDefaultSecurityPropertyPage
// CDefaultSecurityPropertyPage::DoDataExchange
// CDefaultSecurityPropertyPage::OnInitDialog
// CDefaultSecurityPropertyPage::OnButton1
// CDefaultSecurityPropertyPage::OnButton2
// CDefaultSecurityPropertyPage::OnButton3
//
// History: 23-Apr-96 BruceMa Created.
//
//----------------------------------------------------------------------
#include "stdafx.h"
#include "afxtempl.h"
#include "assert.h"
#include "resource.h"
#include "CStrings.h"
#include "CReg.h"
#include "types.h"
#include "SrvPPg.h"
#include "ClsPSht.h"
#include "newsrvr.h"
#include "datapkt.h"
#if !defined(STANDALONE_BUILD)
extern "C"
{
#include <getuser.h>
}
#endif
#include "util.h"
#include "virtreg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CDefaultSecurityPropertyPage, CPropertyPage)
IMPLEMENT_DYNCREATE(CServersPropertyPage, CPropertyPage)
IMPLEMENT_DYNCREATE(CMachinePropertyPage, CPropertyPage)
// The globals used for communicating arguments between dialog classes
CUtility g_util;
CVirtualRegistry g_virtreg;
HKEY g_hAppid;
HKEY *g_rghkCLSID;
unsigned g_cCLSIDs;
TCHAR *g_szAppTitle;
BOOL g_fReboot = FALSE;
TCHAR *g_szAppid;
/////////////////////////////////////////////////////////////////////////////
// CServersPropertyPage property page
CServersPropertyPage::CServersPropertyPage() : CPropertyPage(CServersPropertyPage::IDD)
{
//{{AFX_DATA_INIT(CServersPropertyPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_fApplications = TRUE;
}
CServersPropertyPage::~CServersPropertyPage()
{
}
void CServersPropertyPage::OnProperties()
{
CClsidPropertySheet propSheet;
SItem *pItem;
HKEY hKey;
HKEY *phClsids;
TCHAR szBuf[128];
// Get the selected item
pItem = m_registry.GetItem((DWORD)m_classesLst.GetItemData(m_dwSelection));
// Save the AppID
g_szAppid = (TCHAR*)(LPCTSTR)pItem->szAppid;
// Open the appid key
_tcscpy(szBuf, TEXT("AppId\\"));
_tcscat(szBuf, (LPCTSTR)(pItem->szAppid));
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szBuf, 0, KEY_ALL_ACCESS, &hKey)
!= ERROR_SUCCESS)
{
g_util.PostErrorMessage();
return;
}
// Open a key for each clsid associated with this appid
phClsids = new HKEY[pItem->ulClsids];
if (phClsids == NULL)
{
g_util.PostErrorMessage();
return;
}
for (UINT ul = 0; ul < pItem->ulClsids; ul++)
{
_tcscpy(szBuf, TEXT("ClsId\\"));
_tcscat(szBuf, pItem->ppszClsids[ul]);
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szBuf, 0, KEY_ALL_ACCESS,
&phClsids[ul])
!= ERROR_SUCCESS)
{
g_util.PostErrorMessage();
RegCloseKey(hKey);
for (UINT ul2 = 0; ul2 < ul; ul2++)
{
RegCloseKey(phClsids[ul2]);
}
delete phClsids;
return;
}
}
if (propSheet.InitData(m_szSelection, hKey, phClsids, pItem->ulClsids))
{
propSheet.DoModal();
}
// This is where you would retrieve information from the property
// sheet if propSheet.DoModal() returned IDOK. We aren't doing
// anything for simplicity.
// Close the registry keys we opened for the ClsidPropertySheet
RegCloseKey(hKey);
for (ul = 0; ul < pItem->ulClsids; ul++)
{
RegCloseKey(phClsids[ul]);
}
delete phClsids;
}
void CServersPropertyPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServersPropertyPage)
DDX_Control(pDX, IDC_LIST1, m_classesLst);
//}}AFX_DATA_MAP
GotoDlgCtrl(GetDlgItem(IDC_BUTTON1));
}
BEGIN_MESSAGE_MAP(CServersPropertyPage, CPropertyPage)
//{{AFX_MSG_MAP(CServersPropertyPage)
ON_BN_CLICKED(IDC_BUTTON1, OnServerProperties)
ON_LBN_SELCHANGE(IDC_LIST1, OnList1)
ON_LBN_DBLCLK(IDC_LIST1, OnDoubleclickedList1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CServersPropertyPage::OnServerProperties()
{
m_dwSelection = m_classesLst.GetCurSel();
m_classesLst.GetText(m_dwSelection, m_szSelection);
OnProperties();
}
BOOL CServersPropertyPage::OnInitDialog()
{
// Disable property sheet help button
// m_psp.dwFlags &= ~PSH_HASHELP;
CPropertyPage::OnInitDialog();
// Fetch and display the servers for the types specified
FetchAndDisplayClasses();
GotoDlgCtrl(GetDlgItem(IDC_BUTTON1));
// Invoke the work-around to fix WM_HELP problem on subclassed controls
g_util.FixHelp(this);
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CServersPropertyPage::FetchAndDisplayClasses(void)
{
// Collect applications
m_registry.Init();
// Clear the list box
m_classesLst.ResetContent();
// Store application names in the list box
SItem *pItem;
while (pItem = m_registry.GetNextItem())
{
if (!pItem->fDontDisplay)
{
if (!pItem->szTitle.IsEmpty())
{
m_classesLst.AddString(pItem->szTitle);
}
else if (!pItem->szItem.IsEmpty())
{
m_classesLst.AddString(pItem->szItem);
}
else
{
m_classesLst.AddString(pItem->szAppid);
}
}
}
// The list box sorted the items during the AddString's, so now we
// have to associate each item with its index in CRegistry
DWORD cbItems = m_registry.GetNumItems();
for (DWORD k = 0; k < cbItems; k++)
{
SItem *pItem = m_registry.GetItem(k);
int iLBItem;
if (!pItem->fDontDisplay)
{
if (!pItem->szTitle.IsEmpty())
{
iLBItem = m_classesLst.FindStringExact(-1, pItem->szTitle);
}
else if (!pItem->szItem.IsEmpty())
{
iLBItem = m_classesLst.FindStringExact(-1, pItem->szItem);
}
else
{
iLBItem = m_classesLst.FindStringExact(-1, pItem->szAppid);
}
m_classesLst.SetItemData(iLBItem, k);
}
}
// Select the first item
m_classesLst.SetCurSel(0);
OnList1();
}
void CServersPropertyPage::OnList1()
{
m_dwSelection = m_classesLst.GetCurSel();
// enable or disable the properties button as necessary
BOOL bEnableState = GetDlgItem(IDC_BUTTON1)->IsWindowEnabled();
BOOL bNewEnableState = m_dwSelection != LB_ERR;
if (bNewEnableState != bEnableState)
GetDlgItem(IDC_BUTTON1)->EnableWindow(bNewEnableState);
m_classesLst.GetText(m_dwSelection, m_szSelection);
}
void CServersPropertyPage::OnDoubleclickedList1()
{
m_dwSelection = m_classesLst.GetCurSel();
m_classesLst.GetText(m_dwSelection, m_szSelection);
OnProperties();
}
void CServersPropertyPage::OnButton2()
{
CNewServer newServerDialog;
newServerDialog.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CMachinePropertyPage property page
CMachinePropertyPage::CMachinePropertyPage() : CPropertyPage(CMachinePropertyPage::IDD)
{
//{{AFX_DATA_INIT(CMachinePropertyPage)
//}}AFX_DATA_INIT
m_fEnableDCOM = FALSE;
m_fEnableDCOMIndex = -1;
m_fEnableDCOMHTTP = FALSE;
m_fEnableDCOMHTTPIndex = -1;
m_fEnableRpcProxy = FALSE;
m_fOriginalEnableRpcProxy = FALSE;
m_fEnableRpcProxyIndex = -1;
m_authLevel = Connect;
m_authLevelIndex = -1;
m_impersonateLevel = Identify;
m_impersonateLevelIndex = -1;
m_fLegacySecureReferences = FALSE;
m_fLegacySecureReferencesIndex = -1;
}
CMachinePropertyPage::~CMachinePropertyPage()
{
}
void CMachinePropertyPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMachinePropertyPage)
DDX_Control(pDX, IDC_ENABLEINTERNET, m_EnableDCOMInternet);
DDX_Control(pDX, IDC_CHECK2, m_legacySecureReferencesChk);
DDX_Control(pDX, IDC_CHECK1, m_EnableDCOMChk);
DDX_Control(pDX, IDC_COMBO2, m_impersonateLevelCBox);
DDX_Control(pDX, IDC_COMBO1, m_authLevelCBox);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMachinePropertyPage, CPropertyPage)
//{{AFX_MSG_MAP(CMachinePropertyPage)
ON_BN_CLICKED(IDC_COMBO1, OnCombo1)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditchangeCombo1)
ON_CBN_EDITCHANGE(IDC_COMBO2, OnEditchangeCombo2)
ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
ON_CBN_SELCHANGE(IDC_COMBO2, OnSelchangeCombo2)
ON_WM_HELPINFO()
ON_BN_CLICKED(IDC_ENABLEINTERNET, OnChkEnableInternet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CMachinePropertyPage::OnInitDialog()
{
int iIndex;
// Disable property sheet help button
// m_psp.dwFlags &= ~PSH_HASHELP;
CPropertyPage::OnInitDialog();
// Populate the authentication combo boxe
CString sTemp;
m_authLevelCBox.ResetContent();
// Associate values with entries
sTemp.LoadString(IDS_DEFAULT);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, Defaultx);
sTemp.LoadString(IDS_NONE);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, None);
sTemp.LoadString(IDS_CONNECT);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, Connect);
sTemp.LoadString(IDS_CALL);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, Call);
sTemp.LoadString(IDS_PACKET);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, Packet);
sTemp.LoadString(IDS_PACKETINTEGRITY);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, PacketIntegrity);
sTemp.LoadString(IDS_PACKETPRIVACY);
iIndex = m_authLevelCBox.AddString(sTemp);
m_authLevelCBox.SetItemData(iIndex, PacketPrivacy);
// Populate the impersonation level combo box
m_impersonateLevelCBox.ResetContent();
// Associate values with entries
sTemp.LoadString(IDS_ANONYMOUS);
iIndex = m_impersonateLevelCBox.AddString(sTemp);
m_impersonateLevelCBox.SetItemData(iIndex, Anonymous);
sTemp.LoadString(IDS_IDENTIFY);
iIndex = m_impersonateLevelCBox.AddString(sTemp);
m_impersonateLevelCBox.SetItemData(iIndex, Identify);
sTemp.LoadString(IDS_IMPERSONATE);
iIndex = m_impersonateLevelCBox.AddString(sTemp);
m_impersonateLevelCBox.SetItemData(iIndex, Impersonate);
sTemp.LoadString(IDS_DELEGATE);
iIndex = m_impersonateLevelCBox.AddString(sTemp);
m_impersonateLevelCBox.SetItemData(iIndex, Delegate);
// Set defaults
// EnableDCOM is unchecked initially
m_authLevelCBox.SetCurSel(Connect);
m_impersonateLevelCBox.SetCurSel(Identify);
// Attempt to read HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE.EnableDCOM
int err;
err = g_virtreg.ReadRegSzNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("EnableDCOM"),
&m_fEnableDCOMIndex);
if (err == ERROR_SUCCESS)
{
CRegSzNamedValueDp * pCdp = (CRegSzNamedValueDp*)g_virtreg.GetAt(m_fEnableDCOMIndex);
CString sTmp = pCdp->Value();
if (sTmp[0] == TEXT('y') ||
sTmp[0] == TEXT('Y'))
{
m_fEnableDCOM = TRUE;
}
}
else if (err != ERROR_ACCESS_DENIED && err !=
ERROR_FILE_NOT_FOUND)
{
g_util.PostErrorMessage();
}
// Attempt to read HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE.EnableInternetDCOM
err = g_virtreg.ReadRegSzNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("EnableDCOMHTTP"),
&m_fEnableDCOMHTTPIndex);
if (err == ERROR_SUCCESS)
{
CRegSzNamedValueDp * pCdp = (CRegSzNamedValueDp*)g_virtreg.GetAt(m_fEnableDCOMHTTPIndex);
CString sTmp = pCdp->Value();
if (m_fEnableDCOM &&
((sTmp[0] == TEXT('y')) ||
(sTmp[0] == TEXT('Y'))))
{
m_fEnableDCOMHTTP = TRUE;
}
}
else if (err != ERROR_ACCESS_DENIED && err !=
ERROR_FILE_NOT_FOUND)
{
g_util.PostErrorMessage();
}
// Attempt to read HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc\RpcProxy\Enabled
err = g_virtreg.ReadRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Rpc\\RpcProxy"),
TEXT("Enabled"),
&m_fEnableRpcProxyIndex);
if (err == ERROR_SUCCESS)
{
CDataPacket * pCdp = (CDataPacket*)g_virtreg.GetAt(m_fEnableRpcProxyIndex);
DWORD dwTmp = pCdp -> GetDwordValue();
if (dwTmp)
{
m_fEnableRpcProxy = TRUE;
m_fOriginalEnableRpcProxy = TRUE;
}
}
else if ((err != ERROR_ACCESS_DENIED) && (err != ERROR_FILE_NOT_FOUND))
{
g_util.PostErrorMessage();
}
// enable proxy if dcomhttp is enabled
if (m_fEnableDCOMHTTP)
{
m_fEnableRpcProxy = TRUE;
if (m_fEnableRpcProxyIndex == -1)
{
g_virtreg.NewRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Rpc\\RpcProxy"),
TEXT("Enabled"),
1,
&m_fEnableRpcProxyIndex);
}
// Else simply update it in the virtual registry
else
{
g_virtreg.ChgRegDwordNamedValue(m_fEnableRpcProxyIndex,1);
}
}
// Attempt to read HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE.
// LegacyAuthenticationLevel
err = g_virtreg.ReadRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("LegacyAuthenticationLevel"),
&m_authLevelIndex);
if (err == ERROR_SUCCESS)
{
CDataPacket * pCdp = g_virtreg.GetAt(m_authLevelIndex);
m_authLevel = (AUTHENTICATIONLEVEL) pCdp->GetDwordValue();
}
else if (err != ERROR_ACCESS_DENIED && err !=
ERROR_FILE_NOT_FOUND)
{
g_util.PostErrorMessage();
}
// Attempt to read HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE.
// LegacyImpersonationLevel
err = g_virtreg.ReadRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("LegacyImpersonationLevel"),
&m_impersonateLevelIndex);
if (err == ERROR_SUCCESS)
{
CDataPacket * pCdp = g_virtreg.GetAt(m_impersonateLevelIndex);
m_impersonateLevel = (IMPERSONATIONLEVEL) pCdp->GetDwordValue();
}
else if (err != ERROR_ACCESS_DENIED && err !=
ERROR_FILE_NOT_FOUND)
{
g_util.PostErrorMessage();
}
// Attempt to read HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE.
// LegacySecureReferences
err = g_virtreg.ReadRegSzNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("LegacySecureReferences"),
&m_fLegacySecureReferencesIndex );
if (err == ERROR_SUCCESS)
{
CRegSzNamedValueDp * pCdp = (CRegSzNamedValueDp*)g_virtreg.GetAt(m_fLegacySecureReferencesIndex);
CString sTmp = pCdp->Value();
if (sTmp[0] == TEXT('y') ||
sTmp[0] == TEXT('Y'))
{
m_fLegacySecureReferences = TRUE;
}
}
else if (err != ERROR_ACCESS_DENIED && err !=
ERROR_FILE_NOT_FOUND)
{
g_util.PostErrorMessage();
}
// Set the controls according to the current values
// EnableDCOM
if (m_fEnableDCOM)
{
m_EnableDCOMChk.SetCheck(1);
GetDlgItem(IDC_COMBO1)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO2)->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK2)->EnableWindow(TRUE);
GetDlgItem(IDC_ENABLEINTERNET)->EnableWindow(TRUE);
}
else
{
m_EnableDCOMChk.SetCheck(0);
GetDlgItem(IDC_ENABLEINTERNET)->EnableWindow(FALSE);
}
m_EnableDCOMInternet.SetCheck(m_fEnableDCOMHTTP);
// AuthenticationLevel
for (int k = 0; k < m_authLevelCBox.GetCount(); k++)
{
if (((AUTHENTICATIONLEVEL) m_authLevelCBox.GetItemData(k)) ==
m_authLevel)
{
m_authLevelCBox.SetCurSel(k);
break;
}
}
// ImpersonationLevel
for (k = 0; k < m_impersonateLevelCBox.GetCount(); k++)
{
if (((AUTHENTICATIONLEVEL) m_impersonateLevelCBox.GetItemData(k)) ==
m_impersonateLevel)
{
m_impersonateLevelCBox.SetCurSel(k);
break;
}
}
// LegacySecureReferences
if (m_fLegacySecureReferences)
{
m_legacySecureReferencesChk.SetCheck(1);
}
else
{
m_legacySecureReferencesChk.SetCheck(0);
}
// Invoke the work-around to fix WM_HELP problem on subclassed controls
g_util.FixHelp(this);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMachinePropertyPage::OnCombo1()
{
m_authLevelCBox.ShowDropDown(TRUE);
}
void CMachinePropertyPage::OnCheck1()
{
// Flip the EnableDCOM flag
m_fEnableDCOM ^= 1;
// Disable or enable the other dialog controls:
GetDlgItem(IDC_COMBO1)->EnableWindow(m_fEnableDCOM);
GetDlgItem(IDC_COMBO2)->EnableWindow(m_fEnableDCOM);
GetDlgItem(IDC_CHECK2)->EnableWindow(m_fEnableDCOM);
GetDlgItem(IDC_ENABLEINTERNET)->EnableWindow(m_fEnableDCOM);
// Virtually write it to the registry
if (m_fEnableDCOMIndex == -1)
{
g_virtreg.NewRegSzNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("EnableDCOM"),
m_fEnableDCOM ? _T("Y") : _T("N"),
&m_fEnableDCOMIndex);
}
// Else simply update it in the virtual registry
else
{
g_virtreg.ChgRegSzNamedValue(m_fEnableDCOMIndex,
m_fEnableDCOM ? _T("Y") : _T("N"));
}
// This is a reboot event
g_fReboot = TRUE;
// Enable the Apply button
SetModified(TRUE);
}
void CMachinePropertyPage::OnChkEnableInternet()
{
// Flip the EnableDCOM flag
m_fEnableDCOMHTTP ^= 1;
// if Com Internet services are enable then enable proxy
// otherwise set it to its original value in case non DCOM RPC application is using it
if (m_fEnableDCOMHTTP)
m_fEnableRpcProxy = TRUE;
else
m_fEnableRpcProxy = m_fOriginalEnableRpcProxy;
// Virtually write it to the registry
if (m_fEnableDCOMHTTPIndex == -1)
{
g_virtreg.NewRegSzNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("EnableDCOMHTTP"),
m_fEnableDCOMHTTP ? _T("Y") : _T("N"),
&m_fEnableDCOMHTTPIndex);
}
// Else simply update it in the virtual registry
else
{
g_virtreg.ChgRegSzNamedValue(m_fEnableDCOMHTTPIndex,
m_fEnableDCOMHTTP ? _T("Y") : _T("N"));
}
if (m_fEnableRpcProxyIndex == -1)
{
g_virtreg.NewRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Rpc\\RpcProxy"),
TEXT("Enabled"),
m_fEnableRpcProxy ? 1 : 0,
&m_fEnableRpcProxyIndex);
}
// Else simply update it in the virtual registry
else
{
g_virtreg.ChgRegDwordNamedValue(m_fEnableRpcProxyIndex,
m_fEnableRpcProxy ? 1 : 0);
}
// This is a reboot event
g_fReboot = TRUE;
// Enable the Apply button
SetModified(TRUE);
}
void CMachinePropertyPage::OnCheck2()
{
// Flip LegacySecureeferences flag
m_fLegacySecureReferences ^= 1;
// Virtually write it to the registry
if (m_fLegacySecureReferencesIndex == -1)
{
g_virtreg.NewRegSzNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("LegacySecureReferences"),
m_fLegacySecureReferences ? _T("Y")
: _T("N"),
&m_fLegacySecureReferencesIndex);
}
// Else simply update it in the virtual registry
else
{
g_virtreg.ChgRegSzNamedValue(m_fLegacySecureReferencesIndex,
m_fLegacySecureReferences ? _T("Y") : _T("N"));
}
// This is a reboot event
g_fReboot = TRUE;
// Enable the Apply button
SetModified(TRUE);
}
void CMachinePropertyPage::OnEditchangeCombo1()
{
}
void CMachinePropertyPage::OnSelchangeCombo1()
{
int iSel;
// Get the new selection
iSel = m_authLevelCBox.GetCurSel();
m_authLevel = (AUTHENTICATIONLEVEL) m_authLevelCBox.GetItemData(iSel);
// Virtually write it to the registry
if (m_authLevelIndex == -1)
{
g_virtreg.NewRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("LegacyAuthenticationLevel"),
m_authLevel,
&m_authLevelIndex);
}
else
{
g_virtreg.ChgRegDwordNamedValue(m_authLevelIndex,
m_authLevel);
}
// This is a reboot event
g_fReboot = TRUE;
// Enable the Apply button
SetModified(TRUE);
}
void CMachinePropertyPage::OnEditchangeCombo2()
{
}
void CMachinePropertyPage::OnSelchangeCombo2()
{
int iSel;
// Get the new selection
iSel = m_impersonateLevelCBox.GetCurSel();
m_impersonateLevel =
(IMPERSONATIONLEVEL) m_impersonateLevelCBox.GetItemData(iSel);
// Virtually write it to the registry
if (m_impersonateLevelIndex == -1)
{
g_virtreg.NewRegDwordNamedValue(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("LegacyImpersonationLevel"),
m_impersonateLevel,
&m_impersonateLevelIndex);
}
else
{
g_virtreg.ChgRegDwordNamedValue(m_impersonateLevelIndex,
m_impersonateLevel);
}
// This is a reboot event
g_fReboot = TRUE;
// Enable the Apply button
SetModified(TRUE);
}
/////////////////////////////////////////////////////////////////////////////
// CDefaultSecurityPropertyPage property page
CDefaultSecurityPropertyPage::CDefaultSecurityPropertyPage() : CPropertyPage(CDefaultSecurityPropertyPage::IDD)
{
//{{AFX_DATA_INIT(CDefaultSecurityPropertyPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_accessPermissionIndex = -1;
m_launchPermissionIndex = -1;
m_configurationPermissionIndex = -1;
m_fAccessChecked = FALSE;
}
CDefaultSecurityPropertyPage::~CDefaultSecurityPropertyPage()
{
}
void CDefaultSecurityPropertyPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDefaultSecurityPropertyPage)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDefaultSecurityPropertyPage, CPropertyPage)
//{{AFX_MSG_MAP(CDefaultSecurityPropertyPage)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// Default access permissions
BOOL CDefaultSecurityPropertyPage::OnInitDialog(void)
{
BOOL fPostMsg = FALSE;
// Disable property sheet help button
// m_psp.dwFlags &= ~PSH_HASHELP;
if (!m_fAccessChecked)
{
// Check whether we are denied access to
// HKEY_LOCAL_MACHINE
if (!g_util.CkAccessRights(HKEY_LOCAL_MACHINE, NULL))
{
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
fPostMsg = TRUE;
}
// Post a message to the user
if (fPostMsg)
{
CString sMsg;
CString sCaption;
sMsg.LoadString(IDS_ACCESSDENIED);
sCaption.LoadString(IDS_SYSTEMMESSAGE);
MessageBox(sMsg, sCaption, MB_OK);
}
}
m_fAccessChecked = TRUE;
return TRUE;
}
// Default access permissions
void CDefaultSecurityPropertyPage::OnButton1()
{
int err;
// Invoke the ACL editor
err = g_util.ACLEditor(m_hWnd,
HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("DefaultAccessPermission"),
&m_accessPermissionIndex,
SingleACL,
dcomAclAccess);
// Enable the Apply button
if (err == ERROR_SUCCESS)
{
// This is a reboot event
g_fReboot = TRUE;
SetModified(TRUE);
}
}
// Default launch permissions
void CDefaultSecurityPropertyPage::OnButton2()
{
int err;
// Invoke the ACL editor
err = g_util.ACLEditor(m_hWnd,
HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\OLE"),
TEXT("DefaultLaunchPermission"),
&m_launchPermissionIndex,
SingleACL,
dcomAclLaunch);
// Enable the Apply button
if (err == ERROR_SUCCESS)
{
// This is a reboot event
g_fReboot = TRUE;
SetModified(TRUE);
}
}
// Default configuration permissions
void CDefaultSecurityPropertyPage::OnButton3()
{
int err;
err = g_util.ACLEditor2(m_hWnd,
HKEY_CLASSES_ROOT,
NULL,
0,
NULL,
&m_configurationPermissionIndex,
RegKeyACL);
// Enable the Apply button
if (err == ERROR_SUCCESS)
SetModified(TRUE);
}
BOOL CDefaultSecurityPropertyPage::OnHelpInfo(HELPINFO* pHelpInfo)
{
if(-1 != pHelpInfo->iCtrlId)
{
WORD hiWord = 0x8000 | CDefaultSecurityPropertyPage::IDD;
WORD loWord = (WORD) pHelpInfo->iCtrlId;
DWORD dwLong = MAKELONG(loWord,hiWord);
WinHelp(dwLong, HELP_CONTEXTPOPUP);
return TRUE;
}
else
{
return CPropertyPage::OnHelpInfo(pHelpInfo);
}
return CPropertyPage::OnHelpInfo(pHelpInfo);
}
BOOL CMachinePropertyPage::OnHelpInfo(HELPINFO* pHelpInfo)
{
if(-1 != pHelpInfo->iCtrlId)
{
WORD hiWord = 0x8000 | CMachinePropertyPage::IDD;
WORD loWord = (WORD) pHelpInfo->iCtrlId;
DWORD dwLong = MAKELONG(loWord,hiWord);
WinHelp(dwLong, HELP_CONTEXTPOPUP);
return TRUE;
}
else
{
return CPropertyPage::OnHelpInfo(pHelpInfo);
}
}
BOOL CServersPropertyPage::OnHelpInfo(HELPINFO* pHelpInfo)
{
if(-1 != pHelpInfo->iCtrlId)
{
WORD hiWord = 0x8000 | CServersPropertyPage::IDD;
WORD loWord = (WORD) pHelpInfo->iCtrlId;
DWORD dwLong = MAKELONG(loWord,hiWord);
WinHelp(dwLong, HELP_CONTEXTPOPUP);
return TRUE;
}
else
{
return CPropertyPage::OnHelpInfo(pHelpInfo);
}
}