windows-nt/Source/XPSP1/NT/ds/security/gina/snapins/ade/deploy.cpp
2020-09-26 16:20:57 +08:00

602 lines
19 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1998.
//
// File: deploy.cpp
//
// Contents: application deployment property page
//
// Classes: CDeploy
//
// History: 03-14-1998 stevebl Commented
//
//---------------------------------------------------------------------------
#include "precomp.hxx"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Guid of appmgmt client side GP extension, and guids for snapins
//
GUID guidExtension = { 0xc6dc5466, 0x785a, 0x11d2, {0x84, 0xd0, 0x00, 0xc0, 0x4f, 0xb1, 0x69, 0xf7}};
GUID guidUserSnapin = CLSID_Snapin;
GUID guidMachSnapin = CLSID_MachineSnapin;
GUID guidRSOPUserSnapin = CLSID_RSOP_Snapin;
GUID guidRSOPMachSnapin = CLSID_RSOP_MachineSnapin;
/////////////////////////////////////////////////////////////////////////////
// CDeploy property page
IMPLEMENT_DYNCREATE(CDeploy, CPropertyPage)
CDeploy::CDeploy() : CPropertyPage(CDeploy::IDD)
{
//{{AFX_DATA_INIT(CDeploy)
m_fAutoInst = FALSE;
m_fFullInst = FALSE;
m_iUI = -1;
m_iDeployment = -1;
m_fUninstallOnPolicyRemoval = FALSE;
m_hConsoleHandle = NULL;
m_fNotUserInstall = FALSE;
//}}AFX_DATA_INIT
m_pIClassAdmin = NULL;
m_fPreDeploy = FALSE;
m_ppThis = NULL;
m_dlgAdvDep.m_pDeploy = this;
}
CDeploy::~CDeploy()
{
if (m_ppThis)
{
*m_ppThis = NULL;
}
MMCFreeNotifyHandle(m_hConsoleHandle);
if (m_pIClassAdmin)
{
m_pIClassAdmin->Release();
}
}
void CDeploy::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDeploy)
DDX_Check(pDX, IDC_CHECK2, m_fAutoInst);
DDX_Radio(pDX, IDC_RADIO3, m_iUI);
DDX_Radio(pDX, IDC_RADIO2, m_iDeployment);
DDX_Check(pDX, IDC_CHECK1, m_fUninstallOnPolicyRemoval);
DDX_Check(pDX, IDC_CHECK3, m_fNotUserInstall);
DDX_Check(pDX, IDC_CHECK4, m_fFullInst);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDeploy, CPropertyPage)
//{{AFX_MSG_MAP(CDeploy)
ON_BN_CLICKED(IDC_BUTTON1, OnAdvanced)
ON_BN_CLICKED(IDC_RADIO2, OnPublished)
ON_BN_CLICKED(IDC_RADIO1, OnAssigned)
ON_BN_CLICKED(IDC_CHECK2, OnChanged)
ON_BN_CLICKED(IDC_CHECK3, OnChanged)
ON_BN_CLICKED(IDC_RADIO3, OnChanged)
ON_BN_CLICKED(IDC_RADIO4, OnChanged)
ON_BN_CLICKED(IDC_CHECK1, OnChanged)
ON_BN_CLICKED(IDC_CHECK4, OnChanged)
ON_WM_DESTROY()
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDeploy message handlers
BOOL CDeploy::OnApply()
{
if (m_fRSOP)
{
return CPropertyPage::OnApply();
}
DWORD dwActFlags = m_pData->m_pDetails->pInstallInfo->dwActFlags;
dwActFlags &= ~(ACTFLG_Assigned | ACTFLG_Published |
ACTFLG_OnDemandInstall | ACTFLG_UserInstall |
ACTFLG_OrphanOnPolicyRemoval | ACTFLG_UninstallOnPolicyRemoval |
ACTFLG_InstallUserAssign |
ACTFLG_ExcludeX86OnIA64 | ACTFLG_IgnoreLanguage | ACTFLG_UninstallUnmanaged);
switch (m_iDeployment)
{
case 2:
// Disabled
break;
case 0:
// Published
dwActFlags |= ACTFLG_Published;
if (m_fAutoInst)
{
dwActFlags |= ACTFLG_OnDemandInstall;
}
if (!m_fNotUserInstall)
{
dwActFlags |= ACTFLG_UserInstall;
}
break;
case 1:
// Assigned
dwActFlags |= (ACTFLG_Assigned | ACTFLG_OnDemandInstall);
if (!m_fNotUserInstall)
{
dwActFlags |= ACTFLG_UserInstall;
}
if (m_fFullInst)
{
dwActFlags |= ACTFLG_InstallUserAssign;
}
break;
default:
break;
}
if (m_pData->m_pDetails->pInstallInfo->PathType == SetupNamePath)
{
// legacy app
if (m_dlgAdvDep.m_f32On64)
dwActFlags |= ACTFLG_ExcludeX86OnIA64;
}
else
{
// not a legacy app
if (!m_dlgAdvDep.m_f32On64)
dwActFlags |= ACTFLG_ExcludeX86OnIA64;
}
if (m_fUninstallOnPolicyRemoval)
{
dwActFlags |= ACTFLG_UninstallOnPolicyRemoval;
}
else
{
// never set this flag for legacy applications
if (m_pData->m_pDetails->pInstallInfo->PathType != SetupNamePath)
dwActFlags |= ACTFLG_OrphanOnPolicyRemoval;
}
if (m_dlgAdvDep.m_fIgnoreLCID)
{
dwActFlags |= ACTFLG_IgnoreLanguage;
}
if (m_dlgAdvDep.m_fUninstallUnmanaged)
{
dwActFlags |= ACTFLG_UninstallUnmanaged;
}
UINT UILevel;
switch (m_iUI)
{
case 1:
UILevel = INSTALLUILEVEL_FULL;
break;
case 0:
default:
UILevel = INSTALLUILEVEL_BASIC;
break;
}
HRESULT hr = E_FAIL;
if (m_pIClassAdmin)
{
hr = m_pIClassAdmin->ChangePackageProperties(m_pData->m_pDetails->pszPackageName,
NULL,
&dwActFlags,
NULL,
NULL,
&UILevel,
NULL);
}
if (SUCCEEDED(hr))
{
m_pData->m_pDetails->pInstallInfo->InstallUiLevel = UILevel;
m_pData->m_pDetails->pInstallInfo->dwActFlags = dwActFlags;
#if 0
if (FAILED(m_pIGPEInformation->PolicyChanged(m_fMachine,
TRUE,
&guidExtension,
m_fMachine ? &guidMachSnapin
: &guidUserSnapin)))
{
ReportPolicyChangedError(m_hWnd);
}
#endif
if (!m_fPreDeploy)
{
MMCPropertyChangeNotify(m_hConsoleHandle, (long) m_cookie);
}
else
{
// we're in pre-deploy mode - check to see if the fExtensionsOnly
// flag has changed (which requires a re-deploy)
// note that these two flags are normally the same,
// meaning that when they're different, the user has requested a
// change.
if (m_dlgAdvDep.m_fIncludeOLEInfo != m_pData->m_pDetails->pActInfo->bHasClasses)
{
// need to redeploy
BOOL fBuildSucceeded = FALSE;
PACKAGEDETAIL * ppd;
//
// Apply the current setting for classes
//
m_pData->m_pDetails->pActInfo->bHasClasses = m_dlgAdvDep.m_fIncludeOLEInfo;
if (FAILED(CopyPackageDetail(ppd, m_pData->m_pDetails)))
{
return FALSE;
}
CString sz;
// Create a name for the new script file.
// set the script path
GUID guid;
HRESULT hr = CoCreateGuid(&guid);
if (FAILED(hr))
{
// undone
}
//
// For MSI packages, we must regenerate class information
//
if ( DrwFilePath == ppd->pInstallInfo->PathType )
{
OLECHAR szGuid [256];
StringFromGUID2(guid, szGuid, 256);
CString szScriptFile = m_pScopePane->m_szGPT_Path;
szScriptFile += L"\\";
szScriptFile += szGuid;
szScriptFile += L".aas";
OLESAFE_DELETE(ppd->pInstallInfo->pszScriptPath);
OLESAFE_COPYSTRING(ppd->pInstallInfo->pszScriptPath, szScriptFile);
CString szOldName = ppd->pszPackageName;
hr = BuildScriptAndGetActInfo(*ppd, !m_dlgAdvDep.m_fIncludeOLEInfo);
if ( SUCCEEDED( hr ) )
{
if (0 != wcscmp(m_szInitialPackageName, szOldName))
{
// The User changed the name so we have to preserve his choice.
// If the user hasn't changed the package name then it's ok to
// set the packagename to whatever is in the script file.
OLESAFE_DELETE(ppd->pszPackageName);
OLESAFE_COPYSTRING(ppd->pszPackageName, szOldName);
}
}
}
if (SUCCEEDED(hr))
{
fBuildSucceeded = TRUE;
hr = m_pScopePane->PrepareExtensions(*ppd);
if (SUCCEEDED(hr))
{
CString szUniqueName;
int nHint;
nHint = 1;
m_pScopePane->GetUniquePackageName(ppd->pszPackageName, szUniqueName, nHint);
OLESAFE_DELETE(ppd->pszPackageName);
OLESAFE_COPYSTRING(ppd->pszPackageName, szUniqueName);
if ( ppd->pszPackageName )
{
hr = m_pIClassAdmin->RedeployPackage(
&m_pData->m_pDetails->pInstallInfo->PackageGuid,
ppd);
}
else
{
hr = E_OUTOFMEMORY;
}
if (SUCCEEDED(hr))
{
// delete the old script
DeleteFile(m_pData->m_pDetails->pInstallInfo->pszScriptPath);
// update indexes and property sheets
m_pScopePane->RemoveExtensionEntry(m_cookie, *m_pData);
m_pScopePane->RemoveUpgradeEntry(m_cookie, *m_pData);
FreePackageDetail(m_pData->m_pDetails);
m_pData->m_pDetails = ppd;
m_pScopePane->InsertExtensionEntry(m_cookie, *m_pData);
m_pScopePane->InsertUpgradeEntry(m_cookie, *m_pData);
if (m_pScopePane->m_pFileExt)
{
m_pScopePane->m_pFileExt->SendMessage(WM_USER_REFRESH, 0, 0);
}
}
}
}
if (FAILED(hr))
{
CString sz;
sz.LoadString(fBuildSucceeded ? IDS_REDEPLOY_FAILED_IN_CS : IDS_REDEPLOY_FAILED);
ReportGeneralPropertySheetError(m_hWnd, sz, hr);
// delete new script file (assuming it was created)
if ( ( DrwFilePath == ppd->pInstallInfo->PathType ) &&
ppd->pInstallInfo->pszScriptPath )
{
DeleteFile(ppd->pInstallInfo->pszScriptPath);
}
FreePackageDetail(ppd);
return FALSE;
}
}
}
}
else
{
DebugMsg((DM_WARNING, TEXT("ChangePackageProperties failed with 0x%x"), hr));
CString sz;
sz.LoadString(IDS_CHANGEFAILED);
ReportGeneralPropertySheetError(m_hWnd, sz, hr);
return FALSE;
}
return CPropertyPage::OnApply();
}
BOOL CDeploy::OnInitDialog()
{
RefreshData();
if (m_pData->m_pDetails->pInstallInfo->PathType == SetupNamePath)
{
// legacy apps can't be assigned
GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);
// legacy apps don't have a UI level
GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE);
// legacy apps can't be uninstalled
GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
}
m_szInitialPackageName = m_pData->m_pDetails->pszPackageName;
if (m_fMachine)
{
GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);
// machine deployed apps don't have a UI
GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE);
}
if (0 != (m_pData->m_pDetails->pInstallInfo->dwActFlags & ACTFLG_MinimalInstallUI))
{
GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE);
}
CPropertyPage::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDeploy::OnAdvanced()
{
BOOL fIgnoreLCID = m_dlgAdvDep.m_fIgnoreLCID;
BOOL fInstallOnAlpha = m_dlgAdvDep.m_fInstallOnAlpha;
BOOL fUninstallUnmanaged = m_dlgAdvDep.m_fUninstallUnmanaged;
BOOL f32On64 = m_dlgAdvDep.m_f32On64;
BOOL fIncludeOLEInfo = m_dlgAdvDep.m_fIncludeOLEInfo;
m_dlgAdvDep.m_szScriptName = m_pData->m_pDetails->pInstallInfo->pszScriptPath;
if (IDOK == m_dlgAdvDep.DoModal())
{
if (fIgnoreLCID != m_dlgAdvDep.m_fIgnoreLCID
|| fInstallOnAlpha != m_dlgAdvDep.m_fInstallOnAlpha
|| fUninstallUnmanaged != m_dlgAdvDep.m_fUninstallUnmanaged
|| f32On64 != m_dlgAdvDep.m_f32On64
|| fIncludeOLEInfo != m_dlgAdvDep.m_fIncludeOLEInfo)
{
if (!m_fPreDeploy)
SetModified();
}
}
}
void CDeploy::OnDisable()
{
if (!m_fPreDeploy)
SetModified();
m_fAutoInst = FALSE;
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK3)->EnableWindow(FALSE);
if (NULL == GetFocus())
{
GetParent()->GetDlgItem(IDOK)->SetFocus();
}
}
void CDeploy::OnPublished()
{
if (!m_fPreDeploy)
SetModified();
GetDlgItem(IDC_CHECK2)->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK3)->EnableWindow(!m_fMachine);
GetDlgItem(IDC_CHECK4)->EnableWindow(FALSE);
if (NULL == GetFocus())
{
GetParent()->GetDlgItem(IDOK)->SetFocus();
}
}
void CDeploy::OnAssigned()
{
if (!m_fPreDeploy)
SetModified();
m_fAutoInst = TRUE;
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK3)->EnableWindow(!m_fMachine);
GetDlgItem(IDC_CHECK4)->EnableWindow(TRUE);
if (NULL == GetFocus())
{
GetParent()->GetDlgItem(IDOK)->SetFocus();
}
}
void CDeploy::OnChanged()
{
if (!m_fPreDeploy)
SetModified();
}
LRESULT CDeploy::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_HELP:
StandardHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, IDD);
return 0;
case WM_USER_REFRESH:
RefreshData();
UpdateData(FALSE);
return 0;
case WM_USER_CLOSE:
m_dlgAdvDep.EndDialog(IDCANCEL);
return GetOwner()->SendMessage(WM_CLOSE);
default:
return CPropertyPage::WindowProc(message, wParam, lParam);
}
}
void CDeploy::RefreshData(void)
{
DWORD dwActFlags = m_pData->m_pDetails->pInstallInfo->dwActFlags;
m_fAutoInst = (0 != (dwActFlags & ACTFLG_OnDemandInstall));
m_fNotUserInstall = (0 == (dwActFlags & ACTFLG_UserInstall));
m_fFullInst = (0 != (dwActFlags & ACTFLG_InstallUserAssign));
if (dwActFlags & ACTFLG_Assigned)
{
m_iDeployment = 1;
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK3)->EnableWindow(!m_fMachine);
// Only enable full assign checkbox when an app is
// assigned and not legacy. And only enable this
// when we're in USER mode.
// Of course .ZAP (legacy) packages can't be assigned
// anyway so we don't actually need to check for that.
GetDlgItem(IDC_CHECK4)->EnableWindow( m_fMachine == FALSE);
}
else if (dwActFlags & ACTFLG_Published)
{
m_iDeployment = 0;
GetDlgItem(IDC_CHECK2)->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK3)->EnableWindow(!m_fMachine);
GetDlgItem(IDC_CHECK4)->EnableWindow(FALSE);
}
else
{
m_iDeployment = 2;
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK4)->EnableWindow(FALSE);
}
if (this->m_fRSOP)
{
// disable EVERYTHING
GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK4)->EnableWindow(FALSE);
}
if (NULL == GetFocus())
{
GetParent()->GetDlgItem(IDOK)->SetFocus();
}
if (dwActFlags & ACTFLG_UninstallOnPolicyRemoval)
{
m_fUninstallOnPolicyRemoval = TRUE;
}
else
{
m_fUninstallOnPolicyRemoval = FALSE;
}
// initialize the state flags for the advanced dialog
m_dlgAdvDep.m_szDeploymentCount.Format(TEXT("%u"), m_pData->m_pDetails->pInstallInfo->dwRevision);
OLECHAR szTemp[80];
StringFromGUID2(m_pData->m_pDetails->pInstallInfo->ProductCode,
szTemp,
sizeof(szTemp) / sizeof(szTemp[0]));
m_dlgAdvDep.m_szProductCode = szTemp;
m_dlgAdvDep.m_f32On64 = ((dwActFlags & ACTFLG_ExcludeX86OnIA64) == ACTFLG_ExcludeX86OnIA64);
if (m_pData->m_pDetails->pInstallInfo->PathType != SetupNamePath)
{
// this is not a legacy app
// reverse the sense of m_f32On64
m_dlgAdvDep.m_f32On64 = !m_dlgAdvDep.m_f32On64;
}
if (dwActFlags & ACTFLG_UninstallUnmanaged)
{
m_dlgAdvDep.m_fUninstallUnmanaged = TRUE;
}
else
{
m_dlgAdvDep.m_fUninstallUnmanaged = FALSE;
}
m_dlgAdvDep.m_fInstallOnAlpha = FALSE;
m_dlgAdvDep.m_fIncludeOLEInfo = m_pData->m_pDetails->pActInfo->bHasClasses;
if (dwActFlags & ACTFLG_IgnoreLanguage)
{
m_dlgAdvDep.m_fIgnoreLCID = TRUE;
}
else
{
m_dlgAdvDep.m_fIgnoreLCID = FALSE;
}
switch (m_pData->m_pDetails->pInstallInfo->InstallUiLevel)
{
case INSTALLUILEVEL_FULL:
m_iUI = 1;
break;
case INSTALLUILEVEL_BASIC:
default:
m_iUI = 0;
break;
}
SetModified(FALSE);
}
void CDeploy::OnContextMenu(CWnd* pWnd, CPoint point)
{
StandardContextMenu(pWnd->m_hWnd, IDD_DEPLOYMENT);
}