Windows-Server-2003/inetsrv/iis/setup/osrc/comncomp.cxx

398 lines
9.5 KiB
C++
Raw Normal View History

2024-08-04 01:28:15 +02:00
/*++
Copyright (c) 2001 Microsoft Corporation
Module Name :
comncomp.cxx
Abstract:
Class used to install the Common Components
Author:
Christopher Achille (cachille)
Project:
Internet Services Setup
Revision History:
June 2002: Created
--*/
#include "stdafx.h"
#include "comncomp.hxx"
#include "reg.hxx"
#include "iadmw.h"
#include "iiscnfg.h"
#include "mdkey.h"
#include "acl.hxx"
// Define extinct properties, so we can remove them
#define MD_MAX_GLOBAL_CONNECTIONS (IIS_MD_GLOBAL_BASE+2)
sExtinctProperties g_ExtinctProps[] =
{ { MD_MAX_GLOBAL_CONNECTIONS,
ALL_METADATA }
};
// SetInstallStateInRegistry
//
// Set the Install state in the registry. This is so that other
// components can know that we are in install mode. Such as the
// metabase, which only wants to create an new metabase.xml
// during setup
//
BOOL
SetInstallStateInRegistry( DWORD dwState )
{
CRegistry Reg;
if ( !Reg.OpenRegistry( HKEY_LOCAL_MACHINE,
REG_INETSTP,
KEY_ALL_ACCESS,
dwState != INSTALLSTATE_DONE ) )
{
if ( dwState == INSTALLSTATE_DONE )
{
// This is fine, since we were only going to remove
// it anyways
return TRUE;
}
return FALSE;
}
if ( dwState == INSTALLSTATE_DONE )
{
// We are done, so remove registry entry
if ( !Reg.DeleteValue( REG_INSTALLSTATE ) )
{
return FALSE;
}
}
else
{
CRegValue Value;
if ( !Value.SetDword( dwState ) ||
!Reg.SetValue( REG_INSTALLSTATE, Value ) )
{
return FALSE;
}
}
return TRUE;
}
// DeleteHistoryFiles
//
// Remove all the metabase History Files.
// This is because the history files were created during the setup
// process, and are only partially complete
//
BOOL
CCommonInstallComponent::DeleteHistoryFiles()
{
TSTR_PATH strHistoryLocation;
BOOL bRet = TRUE;
if ( !strHistoryLocation.Copy( g_pTheApp->m_csPathInetsrv.GetBuffer(0) ) ||
!strHistoryLocation.PathAppend( PATH_HISTORYFILES ) )
{
// Could not construct Path
bRet = FALSE;
}
if ( bRet &&
!RecRemoveDir( strHistoryLocation.QueryStr(), FALSE ) )
{
bRet = FALSE;
}
if ( !bRet )
{
// This is really a very minor issue, so we will just issue a warning
iisDebugOut((LOG_TYPE_WARN, _T("Could not delete history files after install, some of them will be incomplete") ));
}
return TRUE;
}
// DeleteOldBackups
//
// Remove all the backups that we had from previous versions
// This is because they are not valid on the current version, and
// can not be used
//
BOOL
CCommonInstallComponent::DeleteOldBackups()
{
TSTR_PATH strBackupLocation;
BOOL bRet = TRUE;
if ( !strBackupLocation.Copy( g_pTheApp->m_csPathInetsrv.GetBuffer(0) ) ||
!strBackupLocation.PathAppend( PATH_METABASEBACKUPS ) )
{
// Could not construct Path
bRet = FALSE;
}
if ( bRet &&
!RecRemoveDir( strBackupLocation.QueryStr(), FALSE ) )
{
bRet = FALSE;
}
if ( !bRet )
{
// This is really a very minor issue, so we will just issue a warning
iisDebugOut((LOG_TYPE_WARN, _T("Could not delete the old backup's from the previous version") ));
}
return TRUE;
}
// PreInstall
//
// PreInstall the Common Component
//
BOOL
CCommonInstallComponent::PreInstall()
{
BOOL bRet = TRUE;
bRet = bRet && SetInstallStateInRegistry( INSTALLSTATE_CURRENTLYINSTALLING );
return bRet;
}
// Install
//
// Install the Common Component
//
BOOL
CCommonInstallComponent::Install()
{
BOOL bRet = TRUE;
if ( IsUpgrade() )
{
bRet = bRet && DeleteOldBackups();
bRet = bRet && RemoveExtinctMbProperties();
}
return bRet;
}
// PostInstall
//
// All work that is necessary after instalation
//
BOOL
CCommonInstallComponent::PostInstall()
{
BOOL bRet = TRUE;
bRet = bRet && SetInstallStateInRegistry( INSTALLSTATE_DONE );
bRet = bRet && DeleteHistoryFiles();
return bRet;
}
// PreUnInstall
//
// PreUnInstall the Common Component
//
BOOL
CCommonInstallComponent::PreUnInstall()
{
BOOL bRet = TRUE;
bRet = bRet && SetInstallStateInRegistry( INSTALLSTATE_CURRENTLYUNINSTALLING );
return bRet;
}
// PostUnInstall
//
// All work that is necessary after removal
//
BOOL
CCommonInstallComponent::PostUnInstall()
{
BOOL bRet = TRUE;
bRet = bRet && SetInstallStateInRegistry( INSTALLSTATE_DONE );
return bRet;
}
// GetFriendlyName
//
// Retireve the Friendly Name for the Component
//
BOOL
CCommonInstallComponent::GetFriendlyName( TSTR *pstrFriendlyName )
{
return pstrFriendlyName->LoadString( IDS_IIS_COMPONENTNAME );
}
// GetName
//
// Retrieve the OCM component name
//
LPTSTR
CCommonInstallComponent::GetName()
{
return g_ComponentList[COMPONENT_IIS_COMMON].szComponentName;
}
// RemoveExtinctMbProperties
//
// Remove Metabase properties that were used in old version, but no longer
// get used
//
BOOL
CCommonInstallComponent::RemoveExtinctMbProperties()
{
DWORD i;
CMDKey cmdKey;
CStringList cslpathList;
CString csPath;
POSITION pos;
if ( FAILED( cmdKey.OpenNode( _T("/LM") ) ) )
{
// Failed to open MB
return FALSE;
}
for ( i = 0;
i < ( (DWORD) ( sizeof( g_ExtinctProps ) / sizeof( sExtinctProperties ) ) );
i++ )
{
if (FAILED( cmdKey.GetDataPaths( g_ExtinctProps[i].dwPropertyId,
g_ExtinctProps[i].dwUserType,
cslpathList) ))
{
// Ignore errors, since this is cosmetic, just continue
// with next item
continue;
}
pos = cslpathList.GetHeadPosition();
while ( NULL != pos )
{
csPath = cslpathList.GetNext( pos );
// Ignore errors, since what we are doing is cosmetic
cmdKey.DeleteData( g_ExtinctProps[i].dwPropertyId,
g_ExtinctProps[i].dwUserType,
csPath.GetBuffer(0) );
}
}
cmdKey.Close();
return TRUE;
}
// SetMetabaseFileAcls
//
// Set the ACL's on all the Metabase Specific Files, these are going to be
// the following:
// %windir%\system32\inetsrv\History
// %windir%\system32\inetsrv\History\*
// %windir%\system32\inetsrv\Metaback\*
// %windir%\system32\inetsrv\Metabase.xml
// %windir%\system32\inetsrv\mbschema.xml
// %windir%\system32\inetsrv\mbschema.bin.*
// %windir%\system32\inetsrv\metabase.bak
// %windir%\system32\inetsrv\metabase.xml.tmp
//
BOOL
CCommonInstallComponent::SetMetabaseFileAcls()
{
TSTR_PATH strHistory;
TSTR_PATH strHistoryAll;
TSTR_PATH strMetabackAll;
TSTR_PATH strMetabase;
TSTR_PATH strMBSchema;
TSTR_PATH strMBSchemaAll;
TSTR_PATH strMetabaseBackup;
TSTR_PATH strMetabaseTemp;
CSecurityDescriptor AdminSD;
BOOL bDriveIsAclable;
if ( !strHistory.Copy( PATH_FULL_HISTORY_DIR ) ||
!strHistoryAll.Copy( PATH_FULL_HISTORY_ALLFILES ) ||
!strMetabackAll.Copy( PATH_FULL_METABACK_ALLFILES ) ||
!strMetabase.Copy( PATH_FULL_METABASE_FILE ) ||
!strMBSchema.Copy( PATH_FULL_MBSCHEMA_FILE ) ||
!strMBSchemaAll.Copy( PATH_FULL_MBSCHEMA_BINFILES ) ||
!strMetabaseBackup.Copy( PATH_FULL_METABASE_BACKUPFILE ) ||
!strMetabaseTemp.Copy( PATH_FULL_METABASE_TEMPFILE ) ||
!strHistory.ExpandEnvironmentVariables() ||
!strHistoryAll.ExpandEnvironmentVariables() ||
!strMetabackAll.ExpandEnvironmentVariables() ||
!strMetabase.ExpandEnvironmentVariables() ||
!strMBSchema.ExpandEnvironmentVariables() ||
!strMBSchemaAll.ExpandEnvironmentVariables() ||
!strMetabaseBackup.ExpandEnvironmentVariables() ||
!strMetabaseTemp.ExpandEnvironmentVariables()
)
{
// Failed to construct Path
return FALSE;
}
if ( !CSecurityDescriptor::DoesFileSystemSupportACLs( // All of these are on the same drive
strHistory.QueryStr(), // so just use one to test
&bDriveIsAclable ) )
{
// Failed to check if ACL is valid for this filesystem
return FALSE;
}
if ( !bDriveIsAclable )
{
// This drive is not aclable, so skip it
return TRUE;
}
if ( !AdminSD.AddAccessAcebyWellKnownID( CSecurityDescriptor::GROUP_ADMINISTRATORS,
CSecurityDescriptor::ACCESS_FULL,
TRUE,
TRUE ) ||
!AdminSD.AddAccessAcebyWellKnownID( CSecurityDescriptor::USER_LOCALSYSTEM,
CSecurityDescriptor::ACCESS_FULL,
TRUE,
TRUE ) )
{
// Failed to create Admin SD
return FALSE;
}
if ( !AdminSD.SetSecurityInfoOnFiles( strHistory.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strHistoryAll.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strMetabackAll.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strMetabase.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strMBSchema.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strMBSchemaAll.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strMetabaseBackup.QueryStr(), FALSE ) ||
!AdminSD.SetSecurityInfoOnFiles( strMetabaseTemp.QueryStr(), FALSE ) )
{
// Failed to set ACL on one of these nodes
return FALSE;
}
return TRUE;
}