Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

973 lines
34 KiB

#ifndef INITGUID
#define INITGUID
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iadmw.h> // Interface header
#include <iiscnfg.h> // MD_ & IIS_MD_ defines
#include <objbase.h>
#include "..\..\shared\common.h" // needed for GetUDDIInstallPath
#include "webcaum.h"
#include "resource.h"
#include <string>
#include <vector>
using namespace std;
#define tstring basic_string <TCHAR>
typedef std::vector<tstring> cStrList;
#define APPPOOLNAME TEXT( "MSUDDIAppPool" )
#define DEFAULTLOADFILE TEXT( "default.aspx" )
#define UDDIAPPLICATIONNAME TEXT( "uddi" )
#define UDDIAPPLICATIONDEPENDENCY TEXT( "UDDI;ASP.NET v1.1.4322" )
#define UDDINTAUTHPROVIDERS TEXT( "NTLM" )
#define APIAPPLICATIONNAME TEXT( "uddipublic" )
#ifndef MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM
#define MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM 0
#define MD_APPPOOL_IDENTITY_TYPE_LOCALSERVICE 1
#define MD_APPPOOL_IDENTITY_TYPE_NETWORKSERVICE 2
#define MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER 3
#endif
#define REASONABLE_TIMEOUT 1000
BOOL IsInList( LPCTSTR szStrToFind, cStrList *pList, BOOL bIgnoreCase )
{
if( IsBadReadPtr( pList, sizeof cStrList ) )
return FALSE;
BOOL bFound = FALSE;
for( cStrList::size_type i = 0; ( i < pList->size() ) && !bFound ; i++ )
{
LPCTSTR szEntry = (*pList)[i].c_str();
if ( bIgnoreCase )
bFound = !_tcsicmp( szEntry, szStrToFind );
else
bFound = !_tcscmp( szEntry, szStrToFind );
}
return bFound;
}
BOOL RemoveFromList( LPCTSTR szStrToFind, cStrList *pList, BOOL bIgnoreCase )
{
if( IsBadReadPtr( pList, sizeof cStrList ) )
return FALSE;
BOOL bFound = FALSE;
for( cStrList::size_type i = 0; ( i < pList->size() ) && !bFound ; i++ )
{
LPCTSTR szEntry = (*pList)[i].c_str();
if ( bIgnoreCase )
bFound = !_tcsicmp( szEntry, szStrToFind );
else
bFound = !_tcscmp( szEntry, szStrToFind );
if( bFound )
{
pList->erase(pList->begin() + i);
}
}
return bFound;
}
//--------------------------------------------------------------------------
class CIISObjectBase
{
protected:
static IMSAdminBase* pIMSAdminBase;
METADATA_HANDLE m_hMetabase;
PTCHAR m_szKeyName;
PTCHAR m_szRoot;
public:
CIISObjectBase() : m_hMetabase( NULL ), m_szKeyName( NULL ), m_szRoot( NULL )
{
}
virtual ~CIISObjectBase()
{
Release();
}
static void Initialize()
{
HRESULT hr = CoCreateInstance(
CLSID_MSAdminBase,
NULL,
CLSCTX_ALL,
IID_IMSAdminBase,
(void**)&pIMSAdminBase );
if( FAILED( hr ) )
{
LogError( TEXT( "CIISObjectBase::Initialize::CoCreateInstance() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
static void Uninitialize()
{
if( pIMSAdminBase )
{
pIMSAdminBase->Release();
pIMSAdminBase = NULL;
}
}
void SetData( DWORD dwIdentifier, DWORD dwValue, DWORD dwAttributes, DWORD dwUserType )
{
HRESULT hr;
METADATA_RECORD mr;
mr.dwMDIdentifier = dwIdentifier;
mr.dwMDAttributes = dwAttributes;
mr.dwMDUserType = dwUserType;
mr.dwMDDataType = DWORD_METADATA;
mr.dwMDDataLen = sizeof( DWORD );
mr.pbMDData = reinterpret_cast<unsigned char *>(&dwValue);
hr = pIMSAdminBase->SetData( m_hMetabase, m_szKeyName, &mr );
if( FAILED( hr ) )
{
LogError( TEXT( "CIISObjectBase::SetData::pIMSAdminBase->SetData() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
void SetData( DWORD dwIdentifier, PTCHAR szValue, DWORD dwAttributes, DWORD dwUserType )
{
HRESULT hr;
METADATA_RECORD mr;
mr.dwMDIdentifier = dwIdentifier;
mr.dwMDAttributes = dwAttributes;
mr.dwMDUserType = dwUserType;
mr.dwMDDataType = STRING_METADATA;
mr.dwMDDataLen = (DWORD) ( _tcslen( szValue ) + 1) * sizeof( TCHAR );
mr.pbMDData = reinterpret_cast<unsigned char *>(szValue);
hr = pIMSAdminBase->SetData( m_hMetabase, m_szKeyName, &mr );
if( FAILED( hr ) )
{
LogError( TEXT( "CIISObjectBase::SetData::pIMSAdminBase->SetData() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
void GetData( DWORD dwIdentifier, PTCHAR szValue, DWORD dwBufferLen, DWORD dwAttributes, DWORD dwUserType )
{
HRESULT hr;
METADATA_RECORD mr;
DWORD dwMDRequiredDataLen = 0;
mr.dwMDIdentifier = dwIdentifier;
mr.dwMDAttributes = dwAttributes;
mr.dwMDUserType = dwUserType;
mr.dwMDDataType = STRING_METADATA;
mr.dwMDDataLen = 0;
mr.pbMDData = NULL;
mr.dwMDDataLen = dwBufferLen;
mr.pbMDData = reinterpret_cast<unsigned char *>(szValue);
hr = pIMSAdminBase->GetData( m_hMetabase, m_szKeyName, &mr, &dwMDRequiredDataLen );
if( FAILED( hr ) )
{
Log( TEXT( "CIISObjectBase::GetData::pIMSAdminBase->GetData() failed with HRESULT 0x%x." ), hr );
throw hr;
}
}
void GetMultiSzData( DWORD dwIdentifier, cStrList* pList, DWORD dwAttributes, DWORD dwUserType )
{
HRESULT hr;
METADATA_RECORD mr;
DWORD dwMDRequiredDataLen = 0;
PTCHAR szValue = NULL;
mr.dwMDIdentifier = dwIdentifier;
mr.dwMDAttributes = dwAttributes;
mr.dwMDUserType = dwUserType;
mr.dwMDDataType = MULTISZ_METADATA;
mr.dwMDDataLen = 0;
mr.pbMDData = NULL;
hr = pIMSAdminBase->GetData( m_hMetabase, m_szKeyName, &mr, &dwMDRequiredDataLen );
DWORD dwMDDataLen = dwMDRequiredDataLen / sizeof(TCHAR);
//
// Let API calculate needed buffer size, then allocate
//
if( ERROR_INSUFFICIENT_BUFFER == HRESULT_CODE(hr) )
{
szValue = new TCHAR[ dwMDDataLen ];
if( NULL == szValue )
{
hr = E_OUTOFMEMORY;
LogError( TEXT( "CIISObjectBase::GetMultiSzData::new TCHAR[] failed..." ), HRESULT_CODE(hr) );
throw hr;
}
mr.dwMDDataLen = dwMDRequiredDataLen;
mr.pbMDData = reinterpret_cast<unsigned char *>(szValue);
hr = pIMSAdminBase->GetData( m_hMetabase, m_szKeyName, &mr, &dwMDRequiredDataLen );
}
else
{
//
// Should never get here, should always fail with insufficient buffer
//
hr = E_FAIL;
LogError( TEXT( "CIISObjectBase::GetMultiSzData::pIMSAdminBase->GetData() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
if( FAILED( hr ) )
{
//
// Don't forget to free buffer before throwing exception
//
if( NULL != szValue )
{
delete [] szValue;
}
LogError( TEXT( "CIISObjectBase::GetMultiSzData::pIMSAdminBase->GetData() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
if( NULL != szValue )
{
while( *szValue )
{
//
// Add value at front to cStrList
//
pList->push_back( szValue );
//
// Walk past null-delimited string
//
while( *szValue )
szValue++;
//
// Walk past null character
//
szValue++;
}
//
// Free allocated buffer
//
delete [] szValue;
}
}
void SetMultiSzData( DWORD dwIdentifier, cStrList* pList, DWORD dwAttributes, DWORD dwUserType )
{
HRESULT hr;
METADATA_RECORD mr;
DWORD dwMDDataLen = 0;
tstring szValue;
//
// Convert cStrList to multisz string
//
for( cStrList::size_type i = 0; ( i < pList->size() ); i++ )
{
LPCTSTR szEntry = (*pList)[i].c_str();
szValue += szEntry;
szValue += TEXT( '\t' );
}
//
// Add trailing tab (which will become null) character
//
szValue += TEXT( '\t' );
//
// Calculate string data length
//
dwMDDataLen = (DWORD)szValue.length() * sizeof(TCHAR);
//
// Replace /t with /0, to properly create multisz string
//
PTCHAR szTemp = (PTCHAR)szValue.c_str();
while( *szTemp )
{
if( TEXT( '\t' ) == *szTemp )
*szTemp = TEXT( '\0' );
szTemp++;
}
mr.dwMDIdentifier = dwIdentifier;
mr.dwMDAttributes = dwAttributes;
mr.dwMDUserType = dwUserType;
mr.dwMDDataType = MULTISZ_METADATA;
mr.dwMDDataLen = dwMDDataLen;
mr.pbMDData = reinterpret_cast<unsigned char *>( (PTCHAR)szValue.c_str() );
hr = pIMSAdminBase->SetData( m_hMetabase, m_szKeyName, &mr );
if( FAILED( hr ) )
{
LogError( TEXT( "CIISObjectBase::SetMultiSzData::pIMSAdminBase->SetData() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
void Delete()
{
HRESULT hr;
//
// Attempt to open the virtual dir set on Web server #1 (default server)
//
hr = pIMSAdminBase->OpenKey( METADATA_MASTER_ROOT_HANDLE,
m_szRoot,
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE,
REASONABLE_TIMEOUT,
&m_hMetabase );
if( FAILED( hr ))
{
LogError( TEXT( "CIISObjectBase::Delete::pIMSAdminBase->OpenKey() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
//
// We don't check the return value since the key may already
// not exist and we could get an error for that reason.
//
pIMSAdminBase->DeleteKey( m_hMetabase, m_szKeyName );
pIMSAdminBase->CloseKey( m_hMetabase );
m_hMetabase = NULL;
}
void Release()
{
if( m_hMetabase && pIMSAdminBase )
{
pIMSAdminBase->CloseKey( m_hMetabase );
m_hMetabase = NULL;
}
}
};
//--------------------------------------------------------------------------
IMSAdminBase* CIISObjectBase::pIMSAdminBase = NULL;
class CIISApplicationPool : public CIISObjectBase
{
public:
CIISApplicationPool( PTCHAR szName )
{
m_szKeyName = szName;
m_szRoot = TEXT( "/LM/W3SVC/AppPools" );
}
void Create()
{
HRESULT hr;
METADATA_RECORD mr = {0};
DWORD dwMDRequiredDataLen = 0;
TCHAR achBuffer[ 256 ];
//
// Attempt to open the UDDI Application Pool
//
hr = pIMSAdminBase->OpenKey( METADATA_MASTER_ROOT_HANDLE,
m_szRoot,
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE,
REASONABLE_TIMEOUT,
&m_hMetabase );
//
// Create the key if it does not exist.
//
if( FAILED( hr ))
{
LogError( TEXT( "CIISApplicationPool::pIMSAdminBase->OpenKey() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
mr.dwMDIdentifier = MD_KEY_TYPE;
mr.dwMDAttributes = 0;
mr.dwMDUserType = IIS_MD_UT_SERVER;
mr.dwMDDataType = STRING_METADATA;
mr.dwMDDataLen = sizeof(achBuffer);
mr.pbMDData = reinterpret_cast<unsigned char *>(achBuffer);
//
// See if MD_KEY_TYPE exists
//
hr = pIMSAdminBase->GetData( m_hMetabase, m_szKeyName, &mr, &dwMDRequiredDataLen );
if( FAILED( hr ))
{
if( MD_ERROR_DATA_NOT_FOUND == hr || ERROR_PATH_NOT_FOUND == HRESULT_CODE(hr) )
{
//
// Write both the key and the values if GetData() failed with any of the two errors.
//
hr = pIMSAdminBase->AddKey( m_hMetabase, m_szKeyName );
if( FAILED( hr ) )
{
LogError( TEXT( "CIISApplicationPool::pIMSAdminBase->AddKey() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
else
{
LogError( TEXT( "CIISApplicationPool::pIMSAdminBase->GetData() failed..." ), HRESULT_CODE(hr));
throw hr;
}
//
// Setup default properties
//
// TODO: Need to use #define for IIsApplicationPool
//
SetData( MD_KEY_TYPE, TEXT( "IIsApplicationPool" ), 0, IIS_MD_UT_SERVER );
}
}
};
//--------------------------------------------------------------------------
class CIISWebService : public CIISObjectBase
{
public:
CIISWebService()
{
m_szKeyName = TEXT( "/W3SVC" );
m_szRoot = TEXT( "/LM" );
}
void Create()
{
HRESULT hr;
METADATA_RECORD mr = {0};
DWORD dwMDRequiredDataLen = 0;
TCHAR achBuffer[ 256 ];
//
// Attempt to open the IIS Web Service
//
hr = pIMSAdminBase->OpenKey( METADATA_MASTER_ROOT_HANDLE,
m_szRoot,
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE,
REASONABLE_TIMEOUT,
&m_hMetabase );
//
// Create the key if it does not exist.
//
if( FAILED( hr ))
{
LogError( TEXT( "CIISWebService::pIMSAdminBase->OpenKey() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
mr.dwMDIdentifier = MD_KEY_TYPE;
mr.dwMDAttributes = 0;
mr.dwMDUserType = IIS_MD_UT_SERVER;
mr.dwMDDataType = STRING_METADATA;
mr.dwMDDataLen = sizeof(achBuffer);
mr.pbMDData = reinterpret_cast<unsigned char *>(achBuffer);
//
// See if MD_KEY_TYPE exists
//
hr = pIMSAdminBase->GetData( m_hMetabase, m_szKeyName, &mr, &dwMDRequiredDataLen );
if( FAILED( hr ))
{
LogError( TEXT( "CIISWebService::pIMSAdminBase->GetData() failed..." ), HRESULT_CODE(hr));
throw hr;
}
}
};
class CIISApplication : public CIISObjectBase
{
private:
PTCHAR m_szPath;
public:
CIISApplication( PTCHAR szVDir, PTCHAR szPath )
{
m_szKeyName = szVDir;
m_szPath = szPath;
m_szRoot = TEXT( "/LM/W3SVC/1/ROOT" );
}
void Create()
{
HRESULT hr;
METADATA_RECORD mr;
DWORD dwMDRequiredDataLen = 0;
TCHAR szTempPath[ MAX_PATH ];
//
// Attempt to open the virtual dir set on Web server #1 (default server)
//
hr = pIMSAdminBase->OpenKey( METADATA_MASTER_ROOT_HANDLE,
m_szRoot,
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE,
REASONABLE_TIMEOUT,
&m_hMetabase );
//
// Create the key if it does not exist.
//
if( FAILED( hr ))
{
LogError( TEXT( "CIISApplication::pIMSAdminBase->OpenKey() failed..." ), HRESULT_CODE( hr ) );
throw hr;
}
mr.dwMDIdentifier = MD_VR_PATH;
mr.dwMDAttributes = METADATA_INHERIT;
mr.dwMDUserType = IIS_MD_UT_FILE;
mr.dwMDDataType = STRING_METADATA;
mr.dwMDDataLen = sizeof( szTempPath );
mr.pbMDData = reinterpret_cast<unsigned char *>(szTempPath);
//
// See if MD_VR_PATH exists.
//
hr = pIMSAdminBase->GetData( m_hMetabase, m_szKeyName, &mr, &dwMDRequiredDataLen );
if( FAILED( hr ))
{
if( MD_ERROR_DATA_NOT_FOUND == hr ||
ERROR_PATH_NOT_FOUND == HRESULT_CODE(hr) )
{
//
// Write both the key and the values if GetData() failed with any of the two errors.
//
hr = pIMSAdminBase->AddKey( m_hMetabase, m_szKeyName );
if( FAILED( hr ) )
{
LogError( TEXT( "CIISApplication::pIMSAdminBase->AddKey() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
else
{
LogError( TEXT( "CIISApplication::pIMSAdminBase->GetData() failed..." ), HRESULT_CODE(hr) );
throw hr;
}
}
//
// Set default property information
//
SetData( MD_VR_PATH, m_szPath, METADATA_INHERIT, IIS_MD_UT_FILE );
SetData( MD_KEY_TYPE, IIS_CLASS_WEB_VDIR_W, 0, IIS_MD_UT_SERVER );
//
// Setup the path to the application root
//
TCHAR szAppRoot [ MAX_PATH + 1 ];
_sntprintf( szAppRoot, MAX_PATH, TEXT( "%s/%s" ), m_szRoot, m_szKeyName );
SetData( MD_APP_ROOT, szAppRoot, METADATA_INHERIT, IIS_MD_UT_FILE );
}
};
//--------------------------------------------------------------------------
UINT SetupIISUDDIMetabase( int AppPoolIdentityType, LPCTSTR szUserName, LPCTSTR szPwd )
{
ENTER();
UINT errCode = ERROR_SUCCESS;
// ::MessageBox( NULL, TEXT( "Attach Debugger" ), TEXT( "SetupIISUDDIMetabase" ), MB_OK );
if( FAILED( CoInitializeEx( NULL, COINIT_MULTITHREADED ) ) )
{
Log( TEXT( "SetupIISUDDIMetabase() failed: CoInitializeEx() failed" ) );
return ERROR_INSTALL_FAILURE;
}
//
// Get the root UDDI application path from the registry
//
//
TCHAR szUddiApplicationFilePath[ MAX_PATH ];
if( !GetUDDIInstallPath( szUddiApplicationFilePath , MAX_PATH ) )
{
return ERROR_INSTALL_FAILURE;
}
_tcscat( szUddiApplicationFilePath, TEXT( "webroot" ) );
//
// Set the api application path to the root UDDI path also
//
TCHAR szApiApplicationFilePath[ MAX_PATH ];
_tcscpy( szApiApplicationFilePath, szUddiApplicationFilePath );
try
{
//
// Initialize the connection the the IIS metabase
//
try
{
CIISObjectBase::Initialize();
}
catch( HRESULT hr )
{
LogError( TEXT( "CIISObjectBase::Initialize() failed" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Create the application pool for the SOAP API and the User Interface
//
try
{
CIISApplicationPool pool( APPPOOLNAME );
pool.Create();
//
// These values are set by the user on an OCM property page
//
pool.SetData( MD_APPPOOL_IDENTITY_TYPE, AppPoolIdentityType, METADATA_INHERIT, IIS_MD_UT_SERVER );
//
// If the user type is "Specific User," then set the user name and password
//
if( MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER == AppPoolIdentityType )
{
pool.SetData( MD_WAM_USER_NAME, ( PTCHAR ) szUserName, METADATA_INHERIT, IIS_MD_UT_FILE );
pool.SetData( MD_WAM_PWD, ( PTCHAR ) szPwd, METADATA_INHERIT | METADATA_SECURE, IIS_MD_UT_FILE );
}
pool.SetData( MD_APPPOOL_MAX_PROCESS_COUNT, 1, METADATA_INHERIT, IIS_MD_UT_SERVER );
pool.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error creating application pool" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Create the uddi application for access to the user interface
//
try
{
TCHAR wszBuf[ 512 ];
wszBuf[ 0 ] = 0x00;
LoadString( g_hinst, IDS_UDDI_APPLICATION_FRIENDLY_NAME, wszBuf, 512 );
CIISApplication uddi( UDDIAPPLICATIONNAME, szUddiApplicationFilePath );
uddi.Create();
uddi.SetData( MD_AUTHORIZATION, MD_AUTH_BASIC | MD_AUTH_NT, METADATA_INHERIT, IIS_MD_UT_FILE );
uddi.SetData( MD_ACCESS_PERM, MD_ACCESS_READ | MD_ACCESS_SCRIPT, METADATA_INHERIT, IIS_MD_UT_FILE );
uddi.SetData( MD_DEFAULT_LOAD_FILE, DEFAULTLOADFILE, 0, IIS_MD_UT_FILE );
uddi.SetData( MD_APP_ISOLATED, 2, 0, IIS_MD_UT_WAM );
uddi.SetData( MD_APP_FRIENDLY_NAME, wszBuf, 0, IIS_MD_UT_WAM );
uddi.SetData( MD_APP_APPPOOL_ID, APPPOOLNAME, METADATA_INHERIT, IIS_MD_UT_SERVER );
uddi.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error creating uddi application for access to the user interface" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Create the api application for access to the SOAP interface
//
try
{
TCHAR wszBuf[ 512 ];
wszBuf[ 0 ] = 0x00;
LoadString( g_hinst, IDS_API_APPLICATION_FRIENDLY_NAME, wszBuf, 512 );
CIISApplication api( APIAPPLICATIONNAME, szApiApplicationFilePath );
api.Create();
api.SetData( MD_AUTHORIZATION, MD_AUTH_ANONYMOUS /* todo remove by Mark Patton | MD_AUTH_NT*/, METADATA_INHERIT, IIS_MD_UT_FILE );
api.SetData( MD_ACCESS_PERM, MD_ACCESS_READ | MD_ACCESS_SCRIPT, METADATA_INHERIT, IIS_MD_UT_FILE );
// api.SetData( MD_DEFAULT_LOAD_FILE, DEFAULTLOADFILE, 0, IIS_MD_UT_FILE );
api.SetData( MD_APP_ISOLATED, 2, 0, IIS_MD_UT_WAM );
api.SetData( MD_APP_FRIENDLY_NAME, wszBuf, 0, IIS_MD_UT_WAM );
api.SetData( MD_APP_APPPOOL_ID, APPPOOLNAME, METADATA_INHERIT, IIS_MD_UT_SERVER );
//
// Use the default account.
//
#if 0
//
// Set the anonymous user name and password
//
if ( MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER == AppPoolIdentityType )
{
//
// Domain account:
//
api.SetData( MD_ANONYMOUS_USER_NAME, (PTCHAR) szUserName, METADATA_INHERIT, IIS_MD_UT_FILE );
if( szPwd && _tcslen( szPwd ) )
{
api.SetData( MD_ANONYMOUS_PWD, (PTCHAR) szPwd, METADATA_INHERIT | METADATA_SECURE, IIS_MD_UT_FILE );
}
}
else
{
//
// Network service account:
//
api.SetData( MD_ANONYMOUS_USER_NAME, (PTCHAR) szUserName, METADATA_NO_ATTRIBUTES, IIS_MD_UT_WAM );
}
#endif
api.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error creating the api application for access to the SOAP interface" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Create the UDDI application dependency
//
try
{
cStrList cAppDep;
CIISWebService ws;
ws.Create();
ws.GetMultiSzData( MD_APP_DEPENDENCIES, &cAppDep, 0, IIS_MD_UT_SERVER );
if( !IsInList( UDDIAPPLICATIONDEPENDENCY, &cAppDep, FALSE ) )
{
//
// Append UDDI app dependency string
//
cAppDep.push_back( UDDIAPPLICATIONDEPENDENCY );
//
// Set new app dependency string into record
//
ws.SetMultiSzData( MD_APP_DEPENDENCIES, &cAppDep, 0, IIS_MD_UT_SERVER );
}
TCHAR szAuthProv[ 256 ];
Log( TEXT( "Attempting to get string value for MD_NTAUTHENTICATION_PROVIDERS." ) );
try
{
ws.GetData( MD_NTAUTHENTICATION_PROVIDERS, szAuthProv, sizeof(szAuthProv), 0, IIS_MD_UT_FILE );
Log( TEXT( "Found NT Authentication Providers: %s" ), szAuthProv );
}
catch( HRESULT hr )
{
//
// Not an error if it doesn't exist already.
//
Log( TEXT( "Failed to get MD_NTAUTHENTICATION_PROVIDERS as IIS_MD_UT_FILE, HRESULT 0x%x." ), hr );
}
try
{
ws.SetData( MD_NTAUTHENTICATION_PROVIDERS, UDDINTAUTHPROVIDERS, METADATA_INHERIT, IIS_MD_UT_FILE );
Log( TEXT( "Set NT Authentication Providers: %s" ), UDDINTAUTHPROVIDERS );
}
catch( HRESULT hr )
{
Log( TEXT( "Failed to set MD_NTAUTHENTICATION_PROVIDERS as IIS_MD_UT_FILE, HRESULT 0x%x." ), hr );
throw hr;
}
ws.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error creating application dependency" ), HRESULT_CODE( hr ) );
throw hr;
}
}
catch( ... )
{
errCode = ERROR_INSTALL_FAILURE;
}
CIISObjectBase::Uninitialize();
CoUninitialize();
return errCode;
}
//--------------------------------------------------------------------------
UINT RemoveIISUDDIMetabase(void)
{
ENTER();
UINT errCode = ERROR_INSTALL_FAILURE;
// ::MessageBox( NULL, TEXT( "Attach Debugger" ), TEXT( "RemoveIISUDDIMetabase" ), MB_OK );
//
// Get the root UDDI application path from the registry
//
TCHAR szUddiApplicationFilePath[ MAX_PATH + 1 ];
if( !GetUDDIInstallPath( szUddiApplicationFilePath , MAX_PATH ) )
{
return ERROR_INSTALL_FAILURE;
}
if( FAILED( CoInitializeEx( NULL, COINIT_MULTITHREADED ) ) )
{
Log( TEXT( "RemoveIISUDDIMetabase() failed: CoInitializeEx() failed" ) );
return ERROR_INSTALL_FAILURE;
}
_tcsncat( szUddiApplicationFilePath, TEXT( "webroot" ), MAX_PATH - _tcslen( szUddiApplicationFilePath ) );
szUddiApplicationFilePath[ MAX_PATH ] = NULL;
//
// Set the api application path to the root UDDI path also
//
TCHAR szApiApplicationFilePath[ MAX_PATH+1 ];
memset( szApiApplicationFilePath, 0, sizeof szApiApplicationFilePath );
_tcsncpy( szApiApplicationFilePath, szUddiApplicationFilePath, MAX_PATH );
try
{
try
{
CIISObjectBase::Initialize();
}
catch( HRESULT hr )
{
LogError( TEXT( "CIISObjectBase::Initialize() failed" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Delete the api application for access to the SOAP interface
//
try
{
CIISApplication api( APIAPPLICATIONNAME, szApiApplicationFilePath );
api.Delete();
api.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error deleting the api application for access to the SOAP interface" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Delete the uddi application for access to the user interface
//
try
{
CIISApplication uddi( UDDIAPPLICATIONNAME, szUddiApplicationFilePath );
uddi.Delete();
uddi.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error deleting uddi application for access to the user interface" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Delete the application pool entry
//
try
{
CIISApplicationPool pool( APPPOOLNAME );
pool.Delete();
pool.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error deleting application pool" ), HRESULT_CODE( hr ) );
throw hr;
}
//
// Remove the UDDI application dependency
//
try
{
cStrList cAppDep;
CIISWebService ws;
ws.Create();
ws.GetMultiSzData( MD_APP_DEPENDENCIES, &cAppDep, 0, IIS_MD_UT_SERVER );
if( RemoveFromList( UDDIAPPLICATIONDEPENDENCY, &cAppDep, FALSE ) )
{
//
// Set new app dependency string into record
//
ws.SetMultiSzData( MD_APP_DEPENDENCIES, &cAppDep, 0, IIS_MD_UT_SERVER );
}
ws.Release();
}
catch( HRESULT hr )
{
LogError( TEXT( "Error deleting application dependency" ), HRESULT_CODE( hr ) );
throw hr;
}
}
catch( ... )
{
errCode = ERROR_INSTALL_FAILURE;
}
CIISObjectBase::Uninitialize();
CoUninitialize();
return errCode;
}