IIS网站和虚拟目录动态创建源码

IIS网站和虚拟目录动态创建源码

ACL.CPP文件内容


#include "stdafx.h"
#include "acl.h"
#include "SetupKit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//ACL Function definition
BOOL InternalEnableDirectoryACL(LPCTSTR lpDirectory)
{
	PACL pDACL = NULL,pNewDACL = NULL;
	PSECURITY_DESCRIPTOR pSD = NULL;
	EXPLICIT_ACCESS ea;

	try
	{
		GetNamedSecurityInfo((LPTSTR)lpDirectory,SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
			NULL, NULL, &pDACL, NULL, &pSD);
		
		ZeroMemory(&ea,sizeof(ea));
		ea.grfAccessMode = GRANT_ACCESS ;
		ea.grfAccessPermissions = GENERIC_READ|GENERIC_EXECUTE|GENERIC_WRITE;
		ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
		ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
		ea.Trustee.ptstrName = _T("EVERYONE");
		
		SetEntriesInAcl(1,&ea,pDACL,&pNewDACL);

		SetNamedSecurityInfo((LPTSTR)lpDirectory,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,
			NULL,NULL,pNewDACL,NULL);
		if(pSD)
			LocalFree((HLOCAL)pSD);
		if(pNewDACL)
			LocalFree((HLOCAL)pNewDACL);
		return TRUE;
	}
	catch(...)
	{
		if(pSD)
			LocalFree((HLOCAL)pSD);
		if(pNewDACL)
			LocalFree((HLOCAL)pNewDACL);
		GetError(_T("EnableDirectoryACL"));
	}
	return FALSE;
}

BOOL _stdcall EnableDirectoryACL(LPTSTR lpDirectory)
{
	CFileFind finder;
	CString strName(lpDirectory);
	
	BOOL bRet = finder.FindFile(strName);
	
	while (bRet)
	{
		bRet = finder.FindNextFile();
		strName = finder.GetFilePath();

		if(finder.IsDots())
		{
			continue;
		}
		
		InternalEnableDirectoryACL(strName);

		if (finder.IsDirectory())
		{
			strName += _T("\\*.*");
			EnableDirectoryACL(strName.GetBuffer(5));
			strName.ReleaseBuffer();
			
		}
	}
	
   finder.Close();
   return TRUE;

}

#include "stdafx.h"
#include "Service.h"
#include "SetupKit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#import "C:\\windows\\system32\\com\\Comadmin.dll" no_namespace 


//Service Function definition

BOOL _stdcall BeginService(LPTSTR lpServiceName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	SC_HANDLE   schService = NULL;
	SC_HANDLE   schSCManager = NULL;

	try
	{
		schSCManager = OpenSCManager(
			NULL,                   // Computer (NULL == local)
			NULL,                   // Database (NULL == default)
			SC_MANAGER_ALL_ACCESS   // Access required
			);
		if (!schSCManager) 
		{
			return FALSE;
		}
		
		schService = OpenService( schSCManager,lpServiceName,SC_MANAGER_ALL_ACCESS);
		
		if (!schService)
		{ 
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
		
		if (!StartService(schService,0,NULL) )
		{
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);
			return FALSE; 
		}
		
		CloseServiceHandle(schService);
		CloseServiceHandle(schSCManager);
		return TRUE;	
	}
	catch(_com_error& err)
	{
		GetComErr(_T("BeginService"),err);
	}
	catch(...)
	{
		GetError(_T("BeginService"));
	}
	return FALSE;
}

BOOL _stdcall EndService(LPTSTR lpServiceName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	
	SC_HANDLE   schService = NULL;
	SC_HANDLE   schSCManager = NULL;
	
	SERVICE_STATUS ss;
	
	try
	{
		schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
		if (!schSCManager) 
		{
			return FALSE;
		}
		
		schService = OpenService(schSCManager,lpServiceName,SC_MANAGER_ALL_ACCESS);
		
		if (!schService)
		{ 
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
		
		DWORD dwStartTime = GetTickCount();
		DWORD dwTimeout = 9000;
		// Make sure the service is not already stopped
		if(!QueryServiceStatus( schService, &ss ))
		{
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
		
		if(ss.dwCurrentState==SERVICE_STOPPED) 
		{
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);
			return TRUE;
		}
		
		// If a stop is pending, just wait for it
		while (ss.dwCurrentState==SERVICE_STOP_PENDING) 
		{
			Sleep( ss.dwWaitHint );
			if(!QueryServiceStatus( schService, &ss ) )
			{
				CloseServiceHandle(schService);
				CloseServiceHandle(schSCManager);
				return FALSE;   
			}
			
			if(ss.dwCurrentState == SERVICE_STOPPED )
			{
				CloseServiceHandle(schService);
				CloseServiceHandle(schSCManager);
				return TRUE;
			}
			
			if (GetTickCount() - dwStartTime > dwTimeout)
			{
				CloseServiceHandle(schService);
				CloseServiceHandle(schSCManager);
				return FALSE;   
			}
		}
		
		DWORD i;
		DWORD dwBytesNeeded;
		DWORD dwCount;
		
		LPENUM_SERVICE_STATUS   lpDependencies = NULL;
		ENUM_SERVICE_STATUS     ess;
		SC_HANDLE               hDepService;
		
		// Pass a zero-length buffer to get the required buffer size
		if ( EnumDependentServices(schService, SERVICE_ACTIVE,
			lpDependencies, 0, &dwBytesNeeded, &dwCount ) ) 
		{
			// If the Enum call succeeds, then there are no dependent
			// services so do nothing
		} 
		else 
		{
			if ( GetLastError() != ERROR_MORE_DATA )
			{
				CloseServiceHandle(schService);
				CloseServiceHandle(schSCManager);
				return FALSE; // Unexpected error
			}
			
			// Allocate a buffer for the dependencies
			lpDependencies = (LPENUM_SERVICE_STATUS) HeapAlloc(
				GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded );
			
			try 
			{
				// Enumerate the dependencies
				if ( !EnumDependentServices( schService, SERVICE_ACTIVE, 
					lpDependencies, dwBytesNeeded, &dwBytesNeeded,
					&dwCount ) )
					return GetLastError();
				
				for ( i = 0; i < dwCount; i++ ) 
				{
					ess = *(lpDependencies + i);
					
					// Open the service
					hDepService = OpenService(schSCManager, ess.lpServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS );
					if ( !hDepService )
					{
						CloseServiceHandle(schService);
						CloseServiceHandle(schSCManager);
						return FALSE; // Unexpected error
					}
					
					// Send a stop code
					if ( !ControlService( hDepService, SERVICE_CONTROL_STOP,&ss ) )
					{
						CloseServiceHandle(schService);
						CloseServiceHandle(schSCManager);
						return FALSE;
					}
					
					// Wait for the service to stop
					while ( ss.dwCurrentState != SERVICE_STOPPED ) 
					{
						Sleep( ss.dwWaitHint );
						if ( !QueryServiceStatus( hDepService, &ss ) )
						{
							CloseServiceHandle(schService);
							CloseServiceHandle(schSCManager);
							return FALSE;
						}
						
						if ( ss.dwCurrentState == SERVICE_STOPPED )
							break;
						
						if ( GetTickCount() - dwStartTime > dwTimeout )
						{
							CloseServiceHandle(schService);
							CloseServiceHandle(schSCManager);
							return FALSE;
						}
					}
					CloseServiceHandle( hDepService );				
				}
			}
			catch(_com_error& err)
			{
				GetComErr(_T("EndService_EndDependency"),err);
			}
			catch(...)
			{
				GetError(_T("EndService_EndDependency"));
			}
			HeapFree( GetProcessHeap(), 0, lpDependencies );
		}
		
		// Send a stop code to the main service
		if(!ControlService( schService, SERVICE_CONTROL_STOP, &ss ))
		{
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
		
		// Wait for the service to stop
		while ( ss.dwCurrentState != SERVICE_STOPPED ) 
		{
			Sleep( ss.dwWaitHint );
			if ( !QueryServiceStatus(schService, &ss ) )
			{
				CloseServiceHandle(schService);
				CloseServiceHandle(schSCManager);
				return FALSE;
			}
			
			if ( ss.dwCurrentState == SERVICE_STOPPED )
				break;
			
		if( GetTickCount() - dwStartTime > dwTimeout )
		{
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
	}		
	CloseServiceHandle(schService);
	CloseServiceHandle(schSCManager);
	return TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("EndService"),err);
	}
	catch(...)
	{
		GetError(_T("EndService"));
	}
	return FALSE;
}

BOOL _stdcall InstallService(LPTSTR lpServiceName,LPTSTR lpServiceDispName,LPTSTR lpServicePath)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	
	SC_HANDLE   schService = NULL;
	SC_HANDLE   schSCManager = NULL;
	
	try
	{
		schSCManager = OpenSCManager(
			NULL,                   // Computer (NULL == local)
			NULL,                   // Database (NULL == default)
			SC_MANAGER_ALL_ACCESS   // Access required
			);
		if (!schSCManager) 
		{
			return FALSE;
		}
		
		schService = OpenService(schSCManager,lpServiceName,SC_MANAGER_ALL_ACCESS);
		//if exsit,return true
		if (schService)
		{ 
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);
			return TRUE;
		}
		//if not exsit,reset point
		schService = NULL;
		
		schService = CreateService( 
			schSCManager,               // SCManager database 
			lpServiceName,              // name of service 
			lpServiceDispName,          // service name to display 
			SERVICE_ALL_ACCESS,         // desired access 
			SERVICE_WIN32_OWN_PROCESS,  // service type 
			SERVICE_AUTO_START,       // start type 
			SERVICE_ERROR_NORMAL,       // error control type 
			lpServicePath,              // path to service's binary 
			NULL,                       // no load ordering group 
			NULL,                       // no tag identifier 
			NULL,                       // no dependencies 
			NULL,                       // LocalSystem account 
			NULL);                      // no password 
		
		if (!schService) 
		{
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
		
		BeginService(lpServiceName);
		
		CloseServiceHandle(schService);
		CloseServiceHandle(schSCManager);
		
		return TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("InstallService"),err);
	}
	catch(...)
	{
		GetError(_T("InstallService"));
	}
	return FALSE;
}

BOOL _stdcall UnInstallService(LPTSTR lpServiceName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	SC_HANDLE   schService = NULL;
	SC_HANDLE   schSCManager = NULL;

	EndService(lpServiceName);

	try
	{
		schSCManager = OpenSCManager(
			NULL,                   // Computer (NULL == local)
			NULL,                   // Database (NULL == default)
			SC_MANAGER_ALL_ACCESS   // Access required
			);
		if (!schSCManager) 
		{
			return FALSE;
		}
		
		schService = OpenService( 
			schSCManager,       // SCManager database 
			lpServiceName,      // name of service 
			DELETE);            // only need DELETE access 
		
		if (!schService)
		{ 
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
		
		if (!DeleteService(schService) ) 
		{
			CloseServiceHandle(schSCManager);
			CloseServiceHandle(schService); 
			return FALSE;
		}
		
		CloseServiceHandle(schSCManager);
		CloseServiceHandle(schService); 
		
		return TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("InInstallService"),err);
	}
	catch(...)
	{
		GetError(_T("InInstallService"));
	}
	return FALSE;

}


//Com Plus Manage API

BOOL _stdcall RemoveComPlusApp(LPTSTR lpAppName)
{
	CoInitialize(NULL);
	BOOL bRet = FALSE;

	try
	{
		_bstr_t bAppName = _bstr_t(lpAppName);
		ICOMAdminCatalogPtr spCatalog("COMAdmin.COMAdminCatalog");
		ICatalogCollectionPtr spApplications;
		spApplications = spCatalog->GetCollection (L"Applications");
		spApplications->Populate ();
		
		LONG count = 0;
		spApplications->get_Count(&count);
		for(INT i=0;i<count;i++)
		{
			HRESULT hr;
			ICatalogObject* pObject = NULL;
			hr = spApplications->get_Item(i,(IDispatch**)&pObject);
			if(hr==S_OK)
			{
				VARIANT vName;
				pObject->get_Name(&vName);
				_bstr_t bName = _bstr_t(vName.bstrVal);
				if(bName==bAppName)
				{
					spApplications->Remove(i);
				}
				pObject->Release();
			}
		}
		
		HRESULT hr = spApplications->SaveChanges();
		
		bRet = SUCCEEDED(hr);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("RemoveComPlusApp"),err);
	}
	catch(...)
	{
		GetError(_T("RemoveComPlusApp"));
	}

	CoUninitialize();
	return bRet;
}

BOOL InternalModifyTransactionTimeout(LPTSTR lpAppName,LONG timeout)
{
	try
	{
		_bstr_t bAppName = _bstr_t(lpAppName);
		ICOMAdminCatalogPtr spCatalog("COMAdmin.COMAdminCatalog");
		ICatalogCollectionPtr spApplications;
		spApplications = spCatalog->GetCollection (L"Applications");
		spApplications->Populate ();

		LONG counts = 0;
		spApplications->get_Count(&counts);
		for(INT i=0;i<counts;i++)
		{
			HRESULT hr;
			ICatalogObject* pdispApp = NULL;
			ICatalogObjectPtr pApp = NULL;
			hr = spApplications->get_Item(i,(IDispatch**)&pdispApp);
			if(hr==S_OK)
			{
				pApp = pdispApp;

				VARIANT vName;
				pApp->get_Name(&vName);
				_bstr_t bName = _bstr_t(vName.bstrVal);
				if(bName==bAppName)
				{
					_variant_t vKey;
					pApp->get_Key(&vKey);
					ICatalogCollectionPtr pObjects = NULL;
					pObjects = spApplications->GetCollection(_bstr_t("Components"),vKey);
					pObjects->Populate();

					UINT count = pObjects->Count;
					for(UINT i=0;i<count;i++)
					{
						ICatalogObject* pdispObject = NULL;
						ICatalogObjectPtr pObject = NULL;
						HRESULT hr;
						hr = pObjects->get_Item(i,(IDispatch**)&pdispObject);
						if(hr==S_OK)
						{
							pObject = pdispObject;

							_variant_t bVar;
							bVar.vt = VT_BOOL;
							
							_variant_t lVar;
							lVar.vt = VT_I4;
							
							lVar = pObject->GetValue(_bstr_t("Transaction"));
							//transaction larger than support
							if(lVar.lVal>2)
							{
								bVar.boolVal = TRUE;
								pObject->put_Value(_bstr_t("ComponentTransactionTimeoutEnabled"),bVar);
								lVar.lVal = timeout;
								pObject->put_Value(_bstr_t("ComponentTransactionTimeout"),lVar);
								
							}
						}
					}//for end
					pObjects->SaveChanges();
				}//if end
			}//if end
		}//for end
		return TRUE;//
	}
	catch(_com_error& err)
	{
		GetComErr(_T("RemoveComPlusApp"),err);
		AfxMessageBox(err.ErrorMessage());
	}
	catch(...)
	{
		GetError(_T("RemoveComPlusApp"));
	}
	return FALSE;
}

BOOL _stdcall ModifyTransactionTimeout(LPTSTR lpAppName,LONG timeout)
{
	CoInitialize(NULL);
	InternalModifyTransactionTimeout(lpAppName,timeout);
	CoUninitialize();
	return FALSE;
}

BOOL _stdcall B64System(void)
{
	TCHAR path[MAX_PATH+1];
	ZeroMemory(path,sizeof(path));
	ExpandEnvironmentStrings(_T("%PROCESSOR_ARCHITEW6432%"),path,MAX_PATH);
	if( path!=NULL && _tcsstr(_T("IA64"),path)!=NULL)
		return TRUE;
	else	
		return FALSE;
}

// SetupKit.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "SetupKit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/
// CSetupKitApp

BEGIN_MESSAGE_MAP(CSetupKitApp, CWinApp)
	//{{AFX_MSG_MAP(CSetupKitApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CSetupKitApp construction

CSetupKitApp::CSetupKitApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/
// The one and only CSetupKitApp object

CSetupKitApp theApp;


/
// Error Handling

int _stdcall WriteText(LPTSTR lpSrc,LPTSTR lpMsg)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CStdioFile inputFile;
	TCHAR lpFile[MAX_PATH];
	ZeroMemory(lpFile,sizeof(lpFile));

	GetSystemDirectory(lpFile, MAX_PATH);
	_tcscat(lpFile,_T("\\U8SetupError.log"));

	TCHAR lpMutexName[15] = _T("U8SETUPERRLOG");
	HANDLE hMutex;
	try
	{
		hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,lpMutexName);
		if(!hMutex)
		{
			hMutex = CreateMutex(NULL,FALSE,lpMutexName);
		}
		
		if(!hMutex)
			return 0;
		WaitForSingleObject(hMutex,INFINITE);
		inputFile.Open(lpFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);		
		inputFile.SeekToEnd();
		
		COleDateTime time = COleDateTime::GetCurrentTime();
		CString sMsg = time.Format(_T("[%Y-%m-%d %H:%M:%S "));
		DWORD dwID = GetCurrentThreadId();
		CString strID;
		strID.Format(_T("Thread:%d]"),dwID);
		sMsg += strID;

		UINT nMax = _tcslen(lpSrc)+_tcslen(lpMsg)+256;
		TCHAR* lpSource = new TCHAR[nMax];
		ZeroMemory(lpSource,nMax);
		_tcscpy(lpSource,lpSrc);
		
		_tcscat(lpSource,_T(":"));
		_tcscat(lpSource,lpMsg);
		_tcscat(lpSource,_T("\n"));
		sMsg.Insert(sMsg.GetLength(),lpSource);
		inputFile.WriteString(sMsg);
		
		inputFile.Close();
		delete[] lpSource;
	}
	catch(...)
	{
	}
	ReleaseMutex(hMutex);
	return 0;
}

void GetError(LPTSTR lpSource)
{
	LPVOID lpMsgBuf;
	if (!FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
		(LPTSTR) &lpMsgBuf,
		0,
		NULL ))
	{
		// Handle the error.
		return;
	}
	
	WriteText(lpSource,(LPTSTR)lpMsgBuf);

	LocalFree(lpMsgBuf);
}

void GetComErr(LPTSTR lpSource,_com_error& err)
{
	_bstr_t bstrErr(err.ErrorMessage()); 
	bstrErr += "\n"+err.Description(); 
	WriteText(lpSource,(LPTSTR)bstrErr); 
}


; SetupKit.def : Declares the module parameters for the DLL.

LIBRARY      "SetupKit2"
DESCRIPTION  'SetupKit2 Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
BeginService							@1
EndService								@2
InstallService							@3
UnInstallService						@4
AdsiCreateWeb							@5
AdsiDeleteWeb							@6
AdsiSetHttpErrorPage					@7
AdsiCreateSubApp						@8
AdsiIsExist								@9
AdsiSetSession							@10
AdsiCreateWebSite						@11
AdsiDeleteWebSite						@12
AdsiCreateWebWithInstance				@13
AdsiDeleteWebWithInstance				@14
AdsiCreateWebWithPath					@15
WriteText								@16
AdsiStartIIS							@17
AdsiStopIIS								@18
AdsiEnableService						@19
EnableDirectoryACL						@20
RemoveComPlusApp						@21
ModifyTransactionTimeout				@22
AdsiIsExistIIS							@23
B64System								@24
AdsiSetConnectionTimeout				@25
AdsiSetKeepAlive						@26
SetScriptMaps                           @27
AdsiSetMIMEType                         @28
InternalSetMIMEType                     @29
InstallU8SLSVR                          @30
DisableAutotuning                       @31
AdsiGetWebRootWithBinding               @32
AdsiCreateWebWithSiteName               @33
AdsiCreateWebServer                     @34
AdsiCreateVirtualDirection              @35
AdsiCreateIdentifier                    @36
AdsiDeleteIdentifier                    @37



// stdafx.cpp : source file that includes just the standard includes
//	SetupKit.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"





// U8SLConfigKits.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "WebSetup.h"
#include "SetupKit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CString dbInfo;
/
// The one and only application object

CString modulePath;

bool ExecuteCmd(LPCTSTR cmd,LPCTSTR workPath)
{
	long exitCode = 0;
	CString cmdLine = _T("cmd.exe /C ") ;
	cmdLine = cmdLine + cmd;
	PROCESS_INFORMATION pi;
	STARTUPINFO si = {sizeof(si)};
	bool isexcutecmdsuccess=FALSE;
	int ret =CreateProcess(NULL,(LPTSTR)(LPCTSTR)cmdLine, NULL, NULL, FALSE,CREATE_NO_WINDOW,NULL,(LPTSTR)workPath,&si,&pi);
	if (!ret)
	{
		dbInfo.Format(_T("ExecuteCmd: CreateProcess Error %d ExecuteCmd Failed: %s"),::GetLastError(),cmdLine);
		WriteText( _T("ExecuteCmd "),(LPTSTR)(LPCTSTR)dbInfo);
		OutputDebugString(dbInfo);
		return FALSE;
	}
	else
	{

		DWORD dwWaitResult;
		dwWaitResult=WaitForSingleObject(pi.hProcess,INFINITE);
		if(dwWaitResult==WAIT_TIMEOUT)
		{
			WriteText( _T("ExecuteCmd Failed Wait Timeout"),_T("elapsed 3 minutes")); 
		}
		else if(dwWaitResult==WAIT_ABANDONED)
		{
			GetError(_T("Wait abrandoned"));
		}
		WriteText( _T("ExecuteCmd Success"),(LPTSTR)(LPCTSTR)cmdLine);
		WriteText(_T("GetExitCode"),_T("Get...."));
		GetExitCodeProcess(pi.hProcess,(unsigned long*)&exitCode);
		CloseHandle(pi.hThread);
	    CloseHandle(pi.hProcess);
		TCHAR lpmsg[128];
		_itot(exitCode,lpmsg,10);
		WriteText(_T("ExecuteCmd ExitCode"),lpmsg);
		if(exitCode==0)
		{
          isexcutecmdsuccess=TRUE;
		}
		else
		{
          isexcutecmdsuccess=FALSE;
		}
	}
    return  isexcutecmdsuccess;
}

bool GetU8InstallRoot(CString &path)
{
	HKEY	hk;
	TCHAR	szBuf[1024] = {0};
	DWORD	dwData = sizeof(szBuf);
	DWORD type;

	if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Ufsoft\\WF\\V8.700\\Install\\CurrentInstPath"),0,KEY_QUERY_VALUE,&hk) != ERROR_SUCCESS)
	{
		::RegCloseKey(hk);
		return false;
	}
	
	if (::RegQueryValueEx(hk,_T(""),NULL,&type,(LPBYTE)szBuf,&dwData) == ERROR_SUCCESS)
	{
		if (type == REG_SZ)
		{
			::RegCloseKey(hk);
			path = szBuf;
			path = path + _T("\\");
			return true;
		}
	}

	::RegCloseKey(hk);
	return false;

}

bool InstallFileVersionService(const CString&webPath ,const CString& u8Path)
{
	CFile pFile;
	CString configFile = u8Path + _T("U8SLFileVersionService.config");
	if (!pFile.Open(configFile,CFile::typeBinary | CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone))
	{
		TRACE(_T("Can't open file %s"), webPath);
		return FALSE;
	}
	CString clientBin = webPath;
	clientBin = clientBin + _T("\\ClientBin");

	pFile.Write(clientBin,clientBin.GetLength());
	pFile.Close();

	//sc create U8SLFileVersionService binpath= "E:\SourceCode\U8SLFileVersionService\Debug\U8SLFileVersionService.exe" type= own start= auto
	//	sc start U8SLFileVersionService
	CString createCmd, startCmd, exePath;
	exePath = u8Path + _T("U8SLFileVersionService.exe");
	//ExecuteCmd(CString("sc delete U8SLFileVersionService"),exePath);

	ExecuteCmd(_T("sc stop U8SLFileVersionService"), u8Path);
	
	ExecuteCmd(_T("sc delete U8SLFileVersionService"), u8Path);

	createCmd.Format(_T("sc create U8SLFileVersionService binpath= \"%s\" type= own start= auto"), exePath);
	ExecuteCmd(createCmd,u8Path);
	
	startCmd = _T("sc start U8SLFileVersionService");
	ExecuteCmd(startCmd, u8Path);
	return TRUE;
}

// bool InstallPolicyService(const CString& u8Path)
// {
// 	CString createCmd, startCmd, stopCmd, delCmd, exePath;
// 	exePath = u8Path + _T("U8SLPolicyService.exe");
// 	
// 	ExecuteCmd(_T("sc stop U8SLPolicyService"), u8Path);
// 
// 	ExecuteCmd(_T("sc delete U8SLPolicyService"), u8Path);
// 
// 	createCmd.Format(_T("sc create U8SLPolicyService binpath= \"%s\" type= own start= auto"),exePath);
// 	ExecuteCmd(createCmd, u8Path);
// 	
// 	startCmd = _T("sc start U8SLPolicyService");
// 	ExecuteCmd(startCmd, u8Path);
// 	return TRUE;
// }

bool ExecuteDependencyService(const CString&webPath ,const CString& u8Path)
{
	//we need make a change in the clinetbin ,so we can inovke the FileVersionService

	CString clientBin = webPath;
	clientBin = clientBin + _T("\\ClientBin");
	CFile pFile;
	CString tmpFile = clientBin + _T("\\ExecuteDependencyService.tmp");
	if (!pFile.Open(tmpFile,CFile::typeBinary | CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone))
	{
		TRACE(_T("Can't open file %s"), webPath);
		return FALSE;
	}
	pFile.Close();
	::DeleteFile(tmpFile);
	Sleep(3000);

	TCHAR pszVsVar32BatPath[MAX_PATH] = {0}; 
	if(!GetEnvironmentVariable(_T("VS90COMNTOOLS"),pszVsVar32BatPath,MAX_PATH))
	{
		OutputDebugString( _T("Get EnvironmentVariable VS90COMNTOOLS Failed"));
		return FALSE;
	}
	
	CString configFile = u8Path + _T("U8SLAmbDependencyService.config");
	if (!pFile.Open(configFile,CFile::typeBinary | CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone))
	{
		dbInfo.Format(_T("Can't open file %s"), webPath);
		OutputDebugString(dbInfo);
		return FALSE;
	}
	_tcscat(pszVsVar32BatPath,_T("vsvars32.bat"));

	pFile.Write(clientBin,clientBin.GetLength()*sizeof(TCHAR));
	pFile.Write(_T("\r\n"), sizeof(TCHAR)*2);
	pFile.Write(pszVsVar32BatPath, _tcslen(pszVsVar32BatPath)*sizeof(TCHAR));
	pFile.Close();
	CString cmd = u8Path + _T("U8SLAmbDependencyService.exe");
	ExecuteCmd(cmd,u8Path);
	return TRUE;
}


typedef BOOL (_stdcall *funAdsiCreateWeb)(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser);
typedef BOOL (_stdcall *funAdsiSetMIMEType)(LPCTSTR, LPCTSTR, LPCTSTR);
typedef BOOL (_stdcall *funAdsiIsExist)(LPCTSTR lpVirtualName);
typedef BOOL (_stdcall *funAdsiDeleteWeb)(LPCTSTR lpVDirectory);
typedef BOOL (_stdcall *funAdsiIsExistIIS)();
typedef BOOL (_stdcall *funAdsiGetWebRootWithBinding)(BSTR* pbstrRoot, int nPort);



BOOL CopyPolicyTo80Web(const CString&u8Path)
{
	BOOL bRet = FALSE;
// 	CString setupKit2DllPath;
// 	funAdsiGetWebRootWithBinding	 pAdsiGetWebRootWithBinding = NULL;
// 	
// 	HINSTANCE  hIns = NULL;
	BSTR bstrRoot =  NULL;
 	BOOL b80WebExist = FALSE;
	CString polilcyPath ;
	CString treeviewhtcPath;

 	CString targetPath ;
	CString targetPath2;


// 
// 	setupKit2DllPath = u8Path + _T("SetupKit2.dll");
// 
// 	hIns = LoadLibrary(setupKit2DllPath);
// 	if (hIns == NULL)
// 	{
// 		OutputDebugString( _T("LoadLibrayr SetupKit2.dll Failed.") );
// 		goto ERR;
// 	}
// 
// 	pAdsiGetWebRootWithBinding = (funAdsiGetWebRootWithBinding) GetProcAddress(hIns, "AdsiGetWebRootWithBinding");
// 	if (!pAdsiGetWebRootWithBinding)
// 	{
// 		goto ERR;
// 	}

	
	b80WebExist = AdsiGetWebRootWithBinding(&bstrRoot, 80);

	if (!b80WebExist)
	{
		OutputDebugString(_T("80 WebSite not exist.") );
		goto ERR;
	}

	 polilcyPath = u8Path + "clientaccesspolicy.xml";
	 treeviewhtcPath  = u8Path + "treeview.htc";

	 targetPath = bstrRoot;
	 targetPath = targetPath + "\\clientaccesspolicy.xml";
	 
	 targetPath2 = bstrRoot;
	 targetPath2 = targetPath2 + "\\treeview.htc";

	 bRet = CopyFile(polilcyPath, targetPath, FALSE);
	 bRet = bRet && CopyFile(treeviewhtcPath, targetPath2, FALSE);

ERR:
// 	 if (hIns != NULL)
// 	 {
// 		 FreeLibrary(hIns);
// 	 }
	return bRet;
}

//AdsiSetMIMEType("U8Portal",".hdr","InstallShiled List File");
BOOL CreateWeb(const CString& u8Path ,const CString& webPath,const CString& webName)
{
	BOOL bRet = FALSE;
	CString setupKitDllPath;
	setupKitDllPath = u8Path + _T("SetupKit.dll");

	HINSTANCE  hIns = LoadLibrary(setupKitDllPath);
	funAdsiCreateWeb	pAdsiCreateWeb;
	funAdsiSetMIMEType	pAdsiSetMIMEType;
	funAdsiIsExist	pAdsiIsExist;
	funAdsiDeleteWeb pAdsiDeleteWeb;
	funAdsiIsExistIIS pAdsiIsExistIIS;

	if (hIns == NULL)
	{
		OutputDebugString( _T("LoadLibrayr SetupKit.dll Failed."));
		return bRet;
	}

	pAdsiIsExistIIS = (funAdsiIsExistIIS) GetProcAddress(hIns, "AdsiIsExistIIS");
	BOOL bDefWebExist = pAdsiIsExistIIS();
	if (!bDefWebExist)
	{
		OutputDebugString(_T("Default Web Site not exist"));
	}
	
	pAdsiDeleteWeb = (funAdsiDeleteWeb) GetProcAddress(hIns, "AdsiDeleteWeb");

	pAdsiIsExist = (funAdsiIsExist) GetProcAddress(hIns, "AdsiIsExist");
	BOOL bU8SLExist = pAdsiIsExist(webName);
	if (bU8SLExist)
	{
		if (!pAdsiDeleteWeb(webName))
		{
			OutputDebugString(_T("Delete Web Failed."));
		}
		 
	}

	pAdsiCreateWeb = (funAdsiCreateWeb)GetProcAddress(hIns, "AdsiCreateWeb");
	bRet = pAdsiCreateWeb(webName, webPath,_T(""), _T(""), FALSE);
	if (!bRet)
	{
		OutputDebugString(_T("Create Web Failed."));
	}
	
	pAdsiSetMIMEType = (funAdsiSetMIMEType)GetProcAddress(hIns, "AdsiSetMIMEType");
	pAdsiSetMIMEType(webName, _T(".xaml"), _T("application/xaml+xml"));
	pAdsiSetMIMEType(webName, _T(".xap"), _T("application/x-silverlight-app"));

	
	FreeLibrary(hIns);
	
	return bRet;
}

#define  bufsize  1024

BOOL InstallWCFService(const CString& u8Path,const CString& webPath )
{

/*
 	ExecuteCmd(CString(_T("sc stop U8DispatchService")),u8Path);
 	ExecuteCmd(CString(_T("sc stop U8KeyManagePool")),u8Path);
 
 	ExecuteCmd(	_T("sc start U8DispatchService"), u8Path);
 	ExecuteCmd(	_T("sc start U8KeyManagePool"), u8Path);


 	ExecuteCmd(_T("sc stop U8HostService"), u8Path);
 	ExecuteCmd(_T("sc stop U8RouterHost"), u8Path);
	

 	ExecuteCmd(_T("sc delete U8RouterHost"), u8Path);
 	ExecuteCmd(	CString(_T("SC CREATE U8RouterHost binPath= \"")) + u8Path + CString(_T("U8RouterHost.exe\" ")) +  CString(_T("start= auto DisplayName= \"U8RouterHost\"")),u8Path);
 	ExecuteCmd( _T("SC description U8RouterHost \"作为Silverlight的服务控制管理器使用,部署在服务端,为U8 Web应用客户端提供远程代理服务\""), u8Path);
 	ExecuteCmd(_T("sc  start U8RouterHost"), u8Path);
 	
 	
 	ExecuteCmd(_T("sc delete U8HostService"), u8Path);
 	ExecuteCmd( CString(_T("SC CREATE U8HostService binPath= \"")) + u8Path + _T( "U8HostService.exe\"") + CString(_T(" start= auto DisplayName= \"U8HostService\"")),u8Path); 
 	ExecuteCmd( _T("SC description U8HostService \"作为Silverlight的服务控制管理器使用,部署在服务端,为U8 Web应用客户端提供远程代理服务\""),u8Path);
 	ExecuteCmd( _T("sc config \"U8HostService\" depend= U8RouterHost"), u8Path);  
 	ExecuteCmd(_T("sc  start U8HostService"),u8Path);	
*/
	ExecuteCmd(_T("SC stop U8WebPool"), u8Path);
	ExecuteCmd(_T("SC delete U8WebPool"), u8Path);
 	ExecuteCmd(CString(_T("SC CREATE U8WebPool binPath= \"")) + u8Path + CString(_T("U8WebPool.exe\" ")) +  CString(_T("start= auto DisplayName= \"U8WebPool\"")),u8Path);
	ExecuteCmd(_T("SC description U8WebPool \"作为Silverlight的服务控制管理器使用,部署在服务端,为U8 Web应用客户端提供远程代理服务\""), u8Path);
 	ExecuteCmd(_T("SC  start U8WebPool"), u8Path);



	return TRUE;
}


BOOL _stdcall InstallU8SLSVR()
{
	int nRetCode = 0;

	{

		TCHAR currentDirectory[MAX_PATH] = {0};
		GetCurrentDirectory(MAX_PATH, currentDirectory);
		modulePath = currentDirectory;
	

		CString strU8Path, strWebPath;
		
		if (!GetU8InstallRoot(strU8Path))
		{
			WriteText( _T("GetU8InstallRoot Failed"),_T(""));
			return FALSE;
		}
		
		strWebPath = strU8Path + _T("U8SL");
// 		
// 		if (!InstallFileVersionService(strWebPath, strU8Path))
// 		{
// 			WriteText(_T("InstallFileVersionService Failed"),_T(""));
// 		}
// 		else
// 		{
// 			WriteText( _T("InstallFileVersionService Sucess"),_T(""));
// 		}
	
// 		if (!InstallPolicyService(strU8Path))
// 		{
// 			cout << _T("InstallPolicyService Failed") <<endl;
// 		}
// 		else
// 		{
// 			cout << _T("InstallPolicyService Sucess") << endl;
// 		}

	
// 		if (!CreateWeb(strU8Path, strWebPath,CString("U8SL")))
// 		{
// 			OutputDebugString( _T("CreateWeb Failed") );
// 		}
// 		else
// 		{
// 			OutputDebugString(_T("CreateWeb Sucess") );
// 		}

		if (CopyPolicyTo80Web(strU8Path))
		{
			WriteText(_T("CopyPolicyTo80Web Sucess"),_T("") );
		}
		else
		{
			WriteText( _T("CopyPolicyTo80Web Failed"),_T("") );
		}

		//只有装U8DispatchService时才装U8webpool
		
		CString	 szU8DispatchServicePath = strU8Path + "U8DispatchService.exe";
		CFileFind finder;

		if (finder.FindFile(szU8DispatchServicePath))
		{
			finder.Close();
			if (!InstallWCFService(strU8Path, strWebPath))
			{
				WriteText(_T("InstallWCFService Failed"),_T("")) ;
			}
			else
			{
				WriteText (_T("InstallWCFService Sucess"),_T(""));
			}
		}

	

		
// 		if (!ExecuteDependencyService(strWebPath, strU8Path))
// 		{
// 			OutputDebugString(_T("ExecuteDependencyService Failed"));
// 		}
// 		else
// 		{
// 			OutputDebugString( _T("ExecuteDependencyService Sucess"));
// 		}
		
	}

	return TRUE;
}

void _stdcall DisableAutotuning()
{
	OSVERSIONINFOEX osvi;
	::ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
	::GetVersionEx((LPOSVERSIONINFO)&osvi);

	//visita 以上
	 if(osvi.dwMajorVersion >= 6)
	 {
		 ExecuteCmd(_T("netsh interface tcp set global autotuninglevel=disabled "), NULL);
	 }
}




#include "stdafx.h"
#include "WebSetup.h"
#include "SetupKit.h"
#include "atlconv.h"
#include  "activeds.h"
#include  "windows.h" 
#include  "Iads.h"  
#include  "comdef.h"  
#include  "tchar.h"  
#include   "stdio.h"  
#include   "Adshlp.h"  
#pragma   comment(lib,"ActiveDS")  
#pragma   comment(lib,"adsiid")  
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//WebSetup Function Definition(ADSI)



//ADSI Function

//uiInst      - web server instance
//lpPath      - relative path("/Root/MyDir")
//riid        - IID 
//ppContainer - out pointer
BOOL InternalGetObject(UINT uiInst,LPCTSTR lpPath,REFIID riid,void **ppv)
{
	USES_CONVERSION;

	WCHAR szPath[MAX_PATH+1];
	szPath[0] = '\0';
	wcscpy(szPath,L"IIS://localhost/w3svc/");
	WCHAR inst[3];
	inst[0] = '\0';
	_itow(uiInst,inst,10);
	wcsncat(szPath,inst,wcslen(inst));
	wcsncat(szPath,L"/Root/",6);
	LPWSTR lpwPath = T2W((LPTSTR)lpPath);
	wcsncat(szPath,lpwPath,wcslen(lpwPath));

	HRESULT hr = ADsGetObject(szPath,riid,ppv);

	return SUCCEEDED(hr);
}

BOOL InternalGetRoot(UINT uiInst,REFIID riid,void **ppv)
{
	WCHAR szPath[MAX_PATH+1];
	szPath[0] = '\0';
	wcscpy(szPath,L"IIS://localhost/w3svc/");
	WCHAR inst[3];
	inst[0] = '\0';
	_itow(uiInst,inst,10);
	wcsncat(szPath,inst,wcslen(inst));
	wcsncat(szPath,L"/Root",5);

	HRESULT hr = ADsGetObject(szPath,riid,ppv);

	return SUCCEEDED(hr);
}

BOOL IsExist(LPCTSTR lpVirtualPath,UINT inst)
{
	IADs* iAds = NULL;

	HRESULT hr = InternalGetObject(inst,lpVirtualPath,IID_IADs,(void**)&iAds);
	
	if(SUCCEEDED(hr)&&iAds)
	{
		iAds->Release();
		return TRUE;
	}
	return FALSE;
}

UINT FindInstance(LPCTSTR instance)
{
	IADsContainer* iContainer = NULL;
    IADs* iAds = NULL;
	
	UINT ins=0;

	try
	{
		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer);
		ASSERT(iContainer);

		TCHAR inst[3];
		inst[0] = '\0';
		UINT i=1;
		_itot(i,inst,10);
		
		//get IIS web server
		hr = iContainer->GetObject(_bstr_t("IIsWebServer"),_bstr_t(inst),(IDispatch**)&iAds);
		ASSERT(iAds);
		VARIANT varName;
		while(iAds)
		{
			iAds->Get(_bstr_t("ServerComment"),&varName);		
			if(_bstr_t(varName.bstrVal)!=_bstr_t(instance))
			{
				i++;
				_itot(i,inst,10);
				
				iAds->Release();
				
				//get IIS web server
				iContainer->GetObject(_bstr_t("IIsWebServer"),
					_bstr_t(inst),(IDispatch**)&iAds);
			}
			else
			{
				ins = i;
				iAds->Release();
				break;
			}
		}
		
		iContainer->Release();
		VariantClear(&varName);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("Internal FindInstance"),err);
	}
	catch(...)
	{
		GetError(_T("Internal FindInstance"));
	}

	//not found!
	if(!ins)
		return 0;
	//found it 
	return ins;
}

BOOL InternalSetScriptMaps(IADs *iAds)
{
	ASSERT(iAds);

	BOOL bRet = FALSE;

	VARIANT vProp;
	VariantInit(&vProp);
	vProp.vt = VT_ARRAY|VT_BSTR;

	SAFEARRAY FAR* psa = NULL;
	SAFEARRAY *pNewArray = NULL;
	LONG lElements=0,lLBound=0,lUBound=0;
	
	try
	{
		//get ScriptMaps from meta data
		HRESULT hr = iAds->Get(_bstr_t("ScriptMaps"),&vProp);
		if(FAILED(hr))
			goto clean;

		psa = V_ARRAY(&vProp);

		ASSERT(psa);
		
		hr = SafeArrayGetLBound(psa, 1, &lLBound);
		hr = SafeArrayGetUBound(psa, 1, &lUBound);
		lElements = lUBound-lLBound+1;
		
		SAFEARRAYBOUND rgsabound[1];
		rgsabound[0].lLbound = 0;
		rgsabound[0].cElements = lElements+4;
		pNewArray = SafeArrayCreate(VT_VARIANT,1,rgsabound);
		
		//copy exsit script maps into new array
		for(LONG i=0;i<lElements;i++)
		{
			_variant_t varValue;

			hr = SafeArrayGetElement(psa,&i,(void*)&varValue);
			hr = SafeArrayPutElement(pNewArray,&i,(void*)&varValue);
		}
		
		//add script maps
		
		TCHAR szContent[MAX_PATH+1];
		szContent[0] = '\0';
		GetWindowsDirectory(szContent,MAX_PATH);
		_tcsncat(szContent,_T("\\Microsoft.Net\\Framework\\v2.0.50727\\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"),73);
		
		LONG index = lElements;
		_variant_t var;
		var.vt = VT_BSTR;
		
		var.bstrVal = _bstr_t(".htm,")+szContent;
		hr = SafeArrayPutElement(pNewArray,&index,(void*)&var);
		
		index++;
		var.bstrVal = _bstr_t(".html,")+szContent;
		hr = SafeArrayPutElement(pNewArray,&index,(void*)&var);
		
		index++;
		var.bstrVal = _bstr_t(".js,")+szContent;
		hr = SafeArrayPutElement(pNewArray,&index,(void*)&var);
		
		index++;
		var.bstrVal = _bstr_t(".vbs,")+szContent;
		hr = SafeArrayPutElement(pNewArray,&index,(void*)&var);
		
		VARIANT vNewProp;
		VariantInit(&vNewProp);
		vNewProp.vt = VT_ARRAY|VT_BSTR;
		V_ARRAY(&vNewProp) = pNewArray;
		hr = iAds->Put(_bstr_t("ScriptMaps"),vNewProp);
		
		hr = iAds->SetInfo();
		
		bRet = SUCCEEDED(hr);
		if(bRet)
		{
			WriteText(_T("InternalSetScriptMaps "),_T(" SUCCEEDED"));
		}
		else
		{
            WriteText(_T("InternalSetScriptMaps "),_T(" FAILED "));
		}
	}
	catch(_com_error& err)
	{
		GetComErr(_T("InternalSetScriptMaps"),err);
	}
	catch(...)
	{
		GetError(_T("InternalSetScriptMaps"));
	}
clean:
	psa = NULL;
	VariantClear(&vProp);
	return bRet;
}

BOOL _stdcall SetScriptMaps(LPCTSTR lpVPath,LPCTSTR lpInstance)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	IADs* iAds = NULL;
	BOOL bRet = FALSE;

	try
	{
		UINT uInst = 1;
		if(lpInstance&&_tcslen(lpInstance))
			uInst = FindInstance(lpInstance);
		if(!uInst)
			goto clean;

		if(InternalGetObject(uInst,lpVPath,IID_IADs,(void**)&iAds))
		{
			ASSERT(iAds);
			if(InternalSetScriptMaps(iAds))
			{
				bRet = TRUE;
			}
		}
	}
	catch(_com_error& err)
	{
		GetComErr(_T("SetScriptMaps"),err);
	}
	catch(...)
	{
		GetError(_T("SetScriptMaps"));
	}
clean:
	if(iAds)
		iAds->Release();
	return bRet;
}
//创建网站根据提供的名称
BOOL InternalCreateWebWithSiteName(LPCTSTR SiteName,LPCTSTR lpVName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser,UINT instance)
{
	IADsContainer* iContainer = NULL;
    IADs* iAds = NULL;

	BOOL bRet = FALSE;
	WriteText(_T("SetupKit.dll "),_T("InternalCreateWeb(LPCTSTR SiteName,LPCTSTR lpVName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser,UINT instance)"));
	try
	{
		if(!InternalGetRoot(instance,IID_IADsContainer,(void**)&iContainer))
		{
			goto clean;
		}
		ASSERT(iContainer);
		HRESULT hr = iContainer->Create(_bstr_t("IIsWebVirtualDir"),_bstr_t(lpVName),(IDispatch**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
		{
			goto clean;
		}

		//set path
		iAds->Put(_bstr_t("Path"),_variant_t(lpPath));
		
		_variant_t vAuth;
		vAuth.vt = VT_I4;
		vAuth.intVal = 0x00000001;
		iAds->Put(_bstr_t("AuthFlags"),vAuth);
		
		//set anonymoususer
		if(bIsNeedUser)
		{
			iAds->Put(_bstr_t("AnonymousUserName"),_variant_t(lpUserName));
			iAds->Put(_bstr_t("AnonymousUserPass"),_variant_t(lpPWD));
			_variant_t var;
			var.vt = VT_BOOL;
			var.boolVal = FALSE;
			iAds->Put(_bstr_t("AnonymousPasswordSync"),var);
			WriteText(_T("AdsiCreateWeb"),_T("set anonymoususer if bIsNeedUser=true"));
		}
		else
		{
			_variant_t var;
			var.vt = VT_BOOL;
			var.boolVal = TRUE;
			iAds->Put(_bstr_t("AnonymousPasswordSync"),var);
			WriteText(_T("AdsiCreateWeb"),_T("set anonymoususer if bIsNeedUser=false"));
		}
		
		_variant_t vFlag;
		vFlag.vt = VT_I4;
		vFlag.intVal = 0x40000000;
		iAds->Put(_bstr_t("DirBrowseFlags"),vFlag);
		
		_variant_t vBool;
		vBool.vt = VT_BOOL;
		vBool.boolVal = TRUE;
		iAds->Put(_bstr_t("AspAllowOutOfProcComponents"),vBool);
		iAds->Put(_bstr_t("AccessRead"),vBool);
		iAds->Put(_bstr_t("AccessScript"),vBool);
		iAds->Put(_bstr_t("AspEnableParentPaths"),vBool);
		//iAds->Put(_bstr_t("EnableDirBrowsing"),vBool);
		iAds->Put(_bstr_t("DefaultDoc"),_variant_t("default.html,default.asp,default.aspx"));

		iAds->Put(_bstr_t("AppFriendlyName"),_variant_t(_bstr_t(lpVName)));
		
		//save info
		hr = iAds->SetInfo();
		if(FAILED(hr))
		{
            WriteText(_T("InternalCreateWeb "),_T("iAds->SetInfo() : save info unsuccess "));
			goto clean;
		}
		
		//get AppCreate's dispid
		DISPID dispid;
		OLECHAR FAR* szMember = L"AppCreate";
		iAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 1;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		_variant_t argVal;
		argVal.vt=VT_BOOL;
		argVal.boolVal = TRUE;
		dispParms.rgvarg = &argVal;
		//invoke AppCreate
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(FAILED(hr))
		{
			WriteText(_T("InternalCreateWeb  faild "),_T("Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispParms,NULL,NULL,NULL)"));
			goto clean;
		}
		bRet = InternalSetScriptMaps(iAds);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("InternalCreateWeb"),err);
	}
	catch(...)
	{
		GetError(_T("InternalCreateWeb"));
	}
clean:
	if(iAds)
		iAds->Release();
	if(iContainer)
		iContainer->Release();
	return bRet;
}

BOOL InternalCreateWeb(LPCTSTR lpVName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser,UINT instance)
{
	IADsContainer* iContainer = NULL;
    IADs* iAds = NULL;

	BOOL bRet = FALSE;
	WriteText(_T("SetupKit.dll "),_T("InternalCreateWeb(LPCTSTR lpVName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser,UINT instance)"));
	try
	{
		if(!InternalGetRoot(instance,IID_IADsContainer,(void**)&iContainer))
		{
			goto clean;
		}
		ASSERT(iContainer);
		HRESULT hr = iContainer->Create(_bstr_t("IIsWebVirtualDir"),_bstr_t(lpVName),(IDispatch**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
		{
			goto clean;
		}

		//set path
		iAds->Put(_bstr_t("Path"),_variant_t(lpPath));
		
		_variant_t vAuth;
		vAuth.vt = VT_I4;
		vAuth.intVal = 0x00000001;
		iAds->Put(_bstr_t("AuthFlags"),vAuth);
		
		//set anonymoususer
		if(bIsNeedUser)
		{
			iAds->Put(_bstr_t("AnonymousUserName"),_variant_t(lpUserName));
			iAds->Put(_bstr_t("AnonymousUserPass"),_variant_t(lpPWD));
			_variant_t var;
			var.vt = VT_BOOL;
			var.boolVal = FALSE;
			iAds->Put(_bstr_t("AnonymousPasswordSync"),var);
			WriteText(_T("AdsiCreateWeb"),_T("set anonymoususer if bIsNeedUser=true"));
		}
		else
		{
			_variant_t var;
			var.vt = VT_BOOL;
			var.boolVal = TRUE;
			iAds->Put(_bstr_t("AnonymousPasswordSync"),var);
			WriteText(_T("AdsiCreateWeb"),_T("set anonymoususer if bIsNeedUser=false"));
		}
		
		_variant_t vFlag;
		vFlag.vt = VT_I4;
		vFlag.intVal = 0x40000000;
		iAds->Put(_bstr_t("DirBrowseFlags"),vFlag);
		
		_variant_t vBool;
		vBool.vt = VT_BOOL;
		vBool.boolVal = TRUE;
		iAds->Put(_bstr_t("AspAllowOutOfProcComponents"),vBool);
		iAds->Put(_bstr_t("AccessRead"),vBool);
		iAds->Put(_bstr_t("AccessScript"),vBool);
		iAds->Put(_bstr_t("AspEnableParentPaths"),vBool);
		//iAds->Put(_bstr_t("EnableDirBrowsing"),vBool);
		iAds->Put(_bstr_t("DefaultDoc"),_variant_t("default.html,default.asp,default.aspx"));

		iAds->Put(_bstr_t("AppFriendlyName"),_variant_t(_bstr_t(lpVName)));
		
		//save info
		hr = iAds->SetInfo();
		if(FAILED(hr))
		{
            WriteText(_T("InternalCreateWeb "),_T("iAds->SetInfo() : save info unsuccess "));
			goto clean;
		}
		
		//get AppCreate's dispid
		DISPID dispid;
		OLECHAR FAR* szMember = L"AppCreate";
		iAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 1;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		_variant_t argVal;
		argVal.vt=VT_BOOL;
		argVal.boolVal = TRUE;
		dispParms.rgvarg = &argVal;
		//invoke AppCreate
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(FAILED(hr))
		{
			WriteText(_T("InternalCreateWeb  faild "),_T("Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispParms,NULL,NULL,NULL)"));
			goto clean;
		}
		bRet = InternalSetScriptMaps(iAds);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("InternalCreateWeb"),err);
	}
	catch(...)
	{
		GetError(_T("InternalCreateWeb"));
	}
clean:
	if(iAds)
		iAds->Release();
	if(iContainer)
		iContainer->Release();
	return bRet;
}

//创建网站根据不同的名称
BOOL _stdcall AdsiCreateWebWithSiteName(LPCTSTR lpSiteName,LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);
	
	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpVDirectoryName,_tcslen(lpVDirectoryName));
		WriteText(_T("AdsiCreateWeb"),szMsg);

		bRet = InternalCreateWebWithSiteName(lpSiteName,lpVDirectoryName,lpPath,lpUserName,lpPWD,bIsNeedUser,1);
	}
	catch(_com_error &err)
	{
		GetComErr(_T("AdsiCreateWeb"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiCreateWeb"));
	}
	CoUninitialize();
	return bRet;
}



///  
//   CreateVirtualDirection参数说明  
//   lpszVirtualDirName需要建立的虚拟目录的目录名字  
//   lpszDiskPath   需要建立虚拟目录的本地磁盘目录  
//  
BOOL _stdcall AdsiCreateVirtualDirection(LPCTSTR  lpszVirtualDirName,LPCTSTR   lpszDiskPath)  
{      
	   CoInitialize(NULL);
       IADsContainer*   iContainer;  
       IADs*   iAds;  
    
       if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer)==S_OK)  
	   {  
          //等到默认站点  
          iContainer->GetObject(_bstr_t("IIsWebServer"), _bstr_t("1"),(IDispatch**)&iAds);  
          if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK)  
		  {  
			   //得到默认站点的根目录  
			   iContainer->GetObject(_bstr_t("IIsWebVirtualDir"),_bstr_t("Root"),(IDispatch**)&iAds);  
			   //获得访问虚拟目录  
			   if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK)  
			   {  
				  //先删除了虚拟目录  
				  iContainer->Delete(_bstr_t("IIsWebVirtualDir"),   _bstr_t(lpszVirtualDirName));  
				  //建立虚拟目录  
				   if(iContainer->Create(_bstr_t("IIsWebVirtualDir"),   _bstr_t(lpszVirtualDirName),(IDispatch**)&iAds)==S_OK)  
				   {  
					  //设置虚拟目录的属性  
					  iAds->Put(_bstr_t("AccessRead"),_variant_t("True"));//注意跟VB中的设置属性比较  
					  iAds->Put(_bstr_t("AccessWrite"),_variant_t("True"));  
					  iAds->Put(_bstr_t("Path"),_variant_t(lpszDiskPath));  
					  iAds->SetInfo();  
					  iAds->Release();  
					  iAds->Release();  
					  iContainer->Release();  
					  iContainer->Release();  
					  return   TRUE;  
				   }  
				   else  
				   {  
					  iAds->Release();  
					  iAds->Release();  
					  iContainer->Release();  
					  iContainer->Release();  
					  return   FALSE;  
				   }  
			  }  
			  else  
			  {  
			   iAds->Release();  
			   iContainer->Release();  
			  }  
		 }  
         else  
		 {  
           iAds->Release();  
		 }  
         iContainer->Release();  
	} 
	CoUninitialize();
    return   FALSE;  
} 

//删除网站标识
BOOL _stdcall AdsiDeleteIdentifier(LPCTSTR m_localidentifier)
{
  WriteText(_T("AdsiDeleteIdentifier"),_T("start "));
  CoInitialize(NULL);
  if(m_localidentifier==NULL)
  {
     return   FALSE;  
  }
  IADsContainer   *pCont=NULL;  
  IADs*   pAds=NULL;  
  IADs*   pVrAds=NULL;  
  IADsServiceOperations   *pSrvOp=NULL;  
  IDispatch   *pDisp   =   NULL;  
  IDispatch   *pVrDisp   =   NULL;  
  _bstr_t   WNumer=_bstr_t(m_localidentifier);   
  HRESULT   hr;  
  if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&pCont)==S_OK)
  {     
	   //如果标识没有被使用,直接的创建
	   pCont->Delete(L"IIsWebServer", WNumer);  
	   pCont->Release(); 
  }
  CoUninitialize();
  WriteText(_T("AdsiDeleteIdentifier"),_T("  end"));
  return   true; 
} 


//创建网站标识
BOOL _stdcall AdsiCreateIdentifier(LPCTSTR m_localidentifier)
{
  WriteText(_T("AdsiCreateIdentifier"),_T("start "));
  CoInitialize(NULL);
  if(m_localidentifier==NULL)
  {
     return   FALSE;  
  }
  IADsContainer   *pCont=NULL;  
  IADs*   pAds=NULL;  
  IADs*   pVrAds=NULL;  
  IADsServiceOperations   *pSrvOp=NULL;  
  IDispatch   *pDisp   =   NULL;  
  IDispatch   *pVrDisp   =   NULL;  
  _bstr_t   WNumer=_bstr_t(m_localidentifier);   
  HRESULT   hr;  
  if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&pCont)==S_OK)
  {     
	   //如果标识没有被使用,直接的创建
	   pCont->Delete(L"IIsWebServer", WNumer);  
       if(pCont->Create(L"IIsWebServer",WNumer,&pDisp)==S_OK)  
	   {
		   
	   }
	   pCont->Release(); 
  }
  CoUninitialize();
  WriteText(_T("AdsiCreateIdentifier"),_T("  end"));
  return   true; 
} 

//创建网站
BOOL _stdcall  AdsiCreateWebServer(LPCTSTR m_sitename,LPCTSTR bindaddress,LPCTSTR domain,LPCTSTR pathname,LPCTSTR m_localidentifier) 
{
  WriteText(_T("AdsiCreateWebServer"),_T("  start"));
  CoInitialize(NULL);
  if(bindaddress==NULL||NULL==domain||NULL==pathname)
  {
		return   FALSE;  
  }
  IADsContainer   *pCont=NULL;  
  IADs*   pAds=NULL;  
  IADs*   pVrAds=NULL;  
  IADsServiceOperations   *pSrvOp=NULL;  
  IDispatch   *pDisp   =   NULL;  
  IDispatch   *pVrDisp   =   NULL;  
  _bstr_t   WNumer=_bstr_t(m_localidentifier);  
  _bstr_t   newBindings=_bstr_t(bindaddress)+":"+domain;  
  HRESULT   hr;  
  if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&pCont)==S_OK)
  {     
	   //如果标识没有被使用,直接的创建
	   pCont->Delete(L"IIsWebServer", WNumer);  
       if(pCont->Create(L"IIsWebServer",WNumer,&pDisp)==S_OK)  
	   {  
		  hr=pDisp->QueryInterface(IID_IADs,   (void**)&pAds);  
		  hr=pDisp->QueryInterface(IID_IADsServiceOperations,   (void**)&pSrvOp);  
		  pAds->Put(L"ServerSize",_variant_t(long(1)));  
		  pAds->Put(L"ServerComment",_variant_t(_bstr_t(m_sitename)));  
		  pAds->Put(L"ServerBindings",_variant_t(newBindings));  
		  pAds->SetInfo();  
   
		  hr=pCont->GetObject(L"IIsWebServer",(WNumer),&pDisp);  
		  if(pDisp->QueryInterface(IID_IADsContainer,(void**)&pCont)==S_OK)  
		  {  
			  //先删除网站
			  pCont->Delete(_bstr_t("IIsWebServer"),   _bstr_t(m_sitename));  
			  if(pCont->Create(L"IIsWebVirtualDir",L"Root",&pVrDisp)==S_OK)  
			  {  
				  hr=pVrDisp->QueryInterface(IID_IADs,   (void**)&pVrAds);  
				  pVrAds->Put(L"AccessRead",_variant_t(true));  
				  pVrAds->Put(L"AccessWrite",_variant_t(true));  
				  pVrAds->Put(L"AccessScript",_variant_t(true));  
				  pVrAds->Put(L"EnableDirBrowsing",_variant_t(true));  
				  pVrAds->Put(L"Path",_variant_t(pathname));  
				  pVrAds->Put(L"AppRoot",_variant_t(pathname));  
				  pVrAds->SetInfo();  
				  pVrAds->Release();  
				  pAds->Release();  
				  pCont->Release();
			  }  
			  hr=pSrvOp->Start();  
			  hr=pSrvOp->Release();  
			  
		  }  
	   }  
  }
  if(pVrDisp)
  {
      pVrDisp->Release();  
  }
  if(pDisp)
  {
      pDisp->Release();  
  }
  if(pSrvOp)
  {
	  pSrvOp->Release();
  }
  CoUninitialize();
  WriteText(_T("AdsiCreateWebServer"),_T("  end"));
  return   true;  
 }  

BOOL _stdcall AdsiCreateWeb(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);
	
	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpVDirectoryName,_tcslen(lpVDirectoryName));
		WriteText(_T("AdsiCreateWeb"),szMsg);

		bRet = InternalCreateWeb(lpVDirectoryName,lpPath,lpUserName,lpPWD,bIsNeedUser,1);
	}
	catch(_com_error &err)
	{
		GetComErr(_T("AdsiCreateWeb"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiCreateWeb"));
	}
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiCreateWebWithPath(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR instance)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	
	BOOL bRet = FALSE;

	CoInitialize(NULL);

	IADs *iAds = NULL;
	IADsContainer *iContainer = NULL;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpVDirectoryName,_tcslen(lpVDirectoryName));
		WriteText(_T("AdsiCreateWebWithPath"),szMsg);

		UINT inst = 1;
		if(instance&&_tcslen(instance))
			inst = FindInstance(instance);
		if(!inst)
			goto clean;

		if(InternalGetRoot(inst,IID_IADsContainer,(void**)&iContainer))
		{
			ASSERT(iContainer);

			HRESULT hr = iContainer->Create(_bstr_t("IIsWebVirtualDir"),_bstr_t(lpPath),(IDispatch**)&iAds);
			ASSERT(iAds);
			if(FAILED(hr))
			{
				goto clean;
			}
			_variant_t vFlag;
			vFlag.vt = VT_I4;
			vFlag.intVal = 0x40000000;
			iAds->Put(_bstr_t("DirBrowseFlags"),vFlag);

			_variant_t vBool;
			vBool.vt = VT_BOOL;
			vBool.boolVal = TRUE;
			iAds->Put(_bstr_t("AspAllowOutOfProcComponents"),vBool);
			iAds->Put(_bstr_t("AccessRead"),vBool);
			iAds->Put(_bstr_t("AccessScript"),vBool);
			iAds->Put(_bstr_t("AspEnableParentPaths"),vBool);
			//iAds->Put(_bstr_t("EnableDirBrowsing"),vBool);
			iAds->Put(_bstr_t("DefaultDoc"),_variant_t("default.html,default.asp,default.aspx"));
			iAds->Put(_bstr_t("AnonymousPasswordSync"),vBool);
			
			iAds->Put(_bstr_t("AppFriendlyName"),_variant_t(_bstr_t(lpVDirectoryName)));
			
			_variant_t vAuth;
			vAuth.vt = VT_I4;
			vAuth.intVal = 0x00000001;
			iAds->Put(_bstr_t("AuthFlags"),vAuth);

			iAds->SetInfo();

			DISPID dispid;
			OLECHAR FAR* szMember = L"AppCreate";
			iAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);

			COleDispatchDriver driver;
			driver.AttachDispatch(iAds,FALSE);
			BYTE pbParam[] = VTS_BOOL;
			_variant_t vParam;
			vParam.vt = VT_BOOL;
			vParam.boolVal = TRUE;
			driver.InvokeHelper(dispid,DISPATCH_METHOD,NULL,NULL,pbParam,vParam);

			bRet = InternalSetScriptMaps(iAds);
		}
		if(iAds)
		{
			iAds->Release();
		}
		if(iContainer)
		{
          iContainer->Release();
		}
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiCreateWebWithPath"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiCreateWebWithPath"));
	}
clean:
	if(iAds)
		iAds->Release();
	if(iContainer)
		iContainer->Release();
	CoUninitialize();
	return bRet;
}

BOOL DeleteWeb(LPCTSTR lpVDirectoryName,UINT inst)
{
	BOOL bRet = FALSE;
	IADsContainer* iContainer = NULL;
	
	try
	{
		if(!IsExist(lpVDirectoryName,inst))
			goto clean;
		
		if(!InternalGetRoot(inst,IID_IADsContainer,(void**)&iContainer))
			goto clean;
		ASSERT(iContainer);

		//delete virtual web directory
		HRESULT hr = iContainer->Delete(_bstr_t("IIsWebVirtualDir"),_bstr_t(lpVDirectoryName));
		if(SUCCEEDED(hr))
			bRet = TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("Internal DeleteWeb"),err);
	}
	catch(...)
	{
		GetError(_T("Internal DeleteWeb"));
	}
clean:
	if(iContainer)
		iContainer->Release();
	return bRet;
}

BOOL _stdcall AdsiDeleteWeb(LPCTSTR lpVDirectory)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpVDirectory,_tcslen(lpVDirectory));
		WriteText(_T("AdsiDeleteWeb"),szMsg);

		bRet = DeleteWeb(lpVDirectory,1);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiDeleteWeb"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiDeleteWeb"));
	}

	CoUninitialize();
	return bRet;
}

BOOL SetHttpErrorPage(LPCTSTR lpVirtualName,UINT nErrorCode,UINT nSubErrorCode,LPCTSTR lpFilePath)
{
	IADs* iAds = NULL;
	
	if(InternalGetObject(1,lpVirtualName,IID_IADs,(void**)&iAds))
	{
		ASSERT(iAds);
		
		TCHAR szError[MAX_PATH+1];
		szError[0] = '\0';
		_stprintf(szError,_T("%d,%d,FILE,%s"),nErrorCode,nSubErrorCode,lpFilePath);
		iAds->Put(_bstr_t("HttpErrors"),_variant_t(szError));
		HRESULT hr = iAds->SetInfo();
		iAds->Release();
		iAds = NULL;
		return SUCCEEDED(hr);
	}

	return FALSE;
}

BOOL _stdcall AdsiSetHttpErrorPage(LPCTSTR lpVirtualName,UINT nErrorCode,UINT nSubErrorCode,LPCTSTR lpFilePath)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	BOOL bRet = FALSE;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_stprintf(szMsg,_T("%s ErrorCode:%d SubErrCode:%d"),lpVirtualName,nErrorCode,nSubErrorCode);
		WriteText(_T("AdsiSetHttpErrorPage"),szMsg);

		bRet = SetHttpErrorPage(lpVirtualName,nErrorCode,nSubErrorCode,lpFilePath);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiSetHttpErrorPage"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiSetHttpErrorPage"));
	}
	CoUninitialize();
	return bRet;
}

BOOL CreateSubApp(LPCTSTR lpVirtualName,LPCTSTR lpVirtualSubName,LPCTSTR lpPath)
{
	IADs* iAds = NULL;
	IADsContainer* iSubContainer = NULL;
    IADs* iSubAds = NULL;

	BOOL bRet = FALSE;

	try
	{
		if(!InternalGetObject(1,lpVirtualName,IID_IADs,(void**)&iAds))
			goto clean;
		ASSERT(iAds);
		
		_variant_t pvUser;
		_variant_t pvPass;
		iAds->Get(_bstr_t("AnonymousUserName"),&pvUser);
		iAds->Get(_bstr_t("AnonymousUserPass"),&pvPass);
		
		HRESULT hr = iAds->QueryInterface(IID_IADsContainer,(void**)&iSubContainer);
		ASSERT(iSubContainer);
		if(FAILED(hr))
			goto clean;
		
		hr = iSubContainer->Create(_bstr_t("IIsWebDirectory"),_bstr_t(lpVirtualSubName),
			(IDispatch**)&iSubAds);
		ASSERT(iSubAds);
		if(FAILED(hr))
			goto clean;
		
		iSubAds->Put(_bstr_t("Path"),_variant_t(lpPath));
		iSubAds->Put(_bstr_t("AnonymousUserName"),pvUser);
		iSubAds->Put(_bstr_t("AnonymousUserPass"),pvPass);
		
		_variant_t var;
		var.vt = VT_BOOL;
		var.boolVal = FALSE;
		iSubAds->Put(_bstr_t("AnonymousPasswordSync"),var);
		var.boolVal = TRUE;
		iSubAds->Put(_bstr_t("AspEnableParentPaths"),var);
		
		hr = iSubAds->SetInfo();
		if(FAILED(hr))
			goto clean;
		
		DISPID dispid;
		OLECHAR FAR* szMember = L"AppCreate";
		iSubAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 1;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		COleVariant argVal;
		argVal.vt=VT_BOOL;
		argVal.boolVal = TRUE;
		dispParms.rgvarg = &argVal;
		
		//invoke AppCreate
		hr = iSubAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispParms,
			NULL,NULL,NULL);
		if(FAILED(hr))
			goto clean;
		
		//add script maps
		bRet = InternalSetScriptMaps(iSubAds);
		
	}
	catch(_com_error& err)
	{
		GetComErr(_T("CreateSubApp"),err);
	}
	catch(...)
	{
		GetError(_T("CreateSubApp"));
	}
clean:
	if(iAds)
		iAds->Release();
	if(iSubContainer)
		iSubContainer->Release();
	if(iSubAds)
		iSubAds->Release();
	return bRet;
}

BOOL _stdcall AdsiCreateSubApp(LPCTSTR lpVirtualName,LPCTSTR lpVirtualSubName,LPCTSTR lpPath)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	BOOL bRet = FALSE;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_stprintf(szMsg,_T("%s %s"),lpVirtualName,lpVirtualSubName);
		WriteText(_T("AdsiCreateSubApp"),szMsg);

		bRet = CreateSubApp(lpVirtualName,lpVirtualSubName,lpPath);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiCreateSubApp"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiCreateSubApp"));
	}
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiIsExist(LPCTSTR lpVirtualName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);
	
	BOOL bRet = FALSE;

	try
	{
		bRet = IsExist(lpVirtualName,1);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiIsExist"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiIsExist"));
	}
	TCHAR szMsglpVirtualName[255];
	szMsglpVirtualName[0] = '\0';
	_stprintf(szMsglpVirtualName,_T("%s"),lpVirtualName);
	if(bRet)
	{
		WriteText(_T("AdsiIsExist=EXIST"),szMsglpVirtualName);
	}
	else
	{
        WriteText(_T("AdsiIsExist NOCREATE SUCCESS "),szMsglpVirtualName);
	}
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiSetConnectionTimeout(LPCTSTR lpInstance,UINT time)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	USES_CONVERSION;
	
	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;
	IADs* iAds = NULL;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_stprintf(szMsg,_T("%s %d"),lpInstance,time);
		WriteText(_T("AdsiSetConnectionTimeout"),szMsg);

		_variant_t vProp;
		vProp.vt = VT_UINT;
		vProp.uintVal = time;

		//set root webserver connection timeout
		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADs,(void**)&iAds);
		if(FAILED(hr))
			goto error;
		ASSERT(iAds);

		iAds->Put(_bstr_t("ConnectionTimeout"),vProp);
		iAds->SetInfo();
		iAds->Release();
		iAds = NULL;
		
		UINT ins = 1;
		if(lpInstance&&_tcslen(lpInstance))
			ins = FindInstance(lpInstance);
		TCHAR inst[3];
		_itot(ins,inst,10);

		WCHAR szPath[MAX_PATH+1];
		szPath[0] = '\0';
		wcscpy(szPath,L"IIS://localhost/w3svc/");
		LPWSTR lpwInst = T2W(inst);
		wcsncat(szPath,lpwInst,wcslen(lpwInst));
		hr = ADsGetObject(szPath,IID_IADs,(void**)&iAds);
		if(FAILED(hr))
			goto error;
		ASSERT(iAds);

		iAds->Put(_bstr_t("ConnectionTimeout"),vProp);
		iAds->SetInfo();
		iAds->Release();
		iAds = NULL;

		//set webserver connection timeout,for IIS6.0
		hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer);
		if(FAILED(hr))
			goto error;
		ASSERT(iContainer);

		hr = iContainer->GetObject(_bstr_t("IIsWebServer"),_bstr_t(inst),(IDispatch**)&iAds);
		iContainer->Release();
		iContainer = NULL;
		if(FAILED(hr))
			goto exit;
		ASSERT(iAds);

		iAds->Put(_bstr_t("ConnectionTimeout"),vProp);
		iAds->SetInfo();
		iAds->Release();
		
exit:		
		CoUninitialize();
		return TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiSetConnectionTimeout"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiSetConnectionTimeout"));
	}
error:
	CoUninitialize();
	return FALSE;
	
}

BOOL _stdcall AdsiSetSession(LPCTSTR lpVirtualName,LONG time)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);
	
	BOOL bRet = FALSE;
	IADs* iAds = NULL;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_stprintf(szMsg,_T("%s %d"),lpVirtualName,time);
		WriteText(_T("AdsiSetSession"),szMsg);

		if(!InternalGetObject(1,lpVirtualName,IID_IADs,(void**)&iAds))
			goto error;
		ASSERT(iAds);

		_variant_t pvSession(time);
		iAds->Put(_bstr_t("AspSessionTimeout"),pvSession);

		HRESULT hr = iAds->SetInfo();
		bRet = SUCCEEDED(hr);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiSetSession"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiSetSession"));
	}
error:
	if(iAds)
		iAds->Release();
	CoUninitialize();
	return bRet;
}

UINT _stdcall AdsiCreateWebSite(LPCTSTR lpSiteName,LPCTSTR lpBind,LPCTSTR lpRoot)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;
    IADs* iAds = NULL;
	IADs* iServer = NULL;
	SAFEARRAY *pNewArray = NULL;
	//HRESULT hr;
	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpSiteName,_tcslen(lpSiteName));
		_tcsncat(szMsg,lpBind,_tcslen(lpBind));
		WriteText(_T("AdsiCreateWebSite"),szMsg);

		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer);
		ASSERT(iContainer);
		if(FAILED(hr))
			goto error;
		
		TCHAR inst[3];
		UINT count=1;
		_itot(count,inst,10);

		//get IIS web server
		hr = iContainer->GetObject(_bstr_t("IIsWebServer"),bstr_t(inst),(IDispatch**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
		{
			iContainer->Release();
			goto error;
		}
		
		//enum web server
		while(iAds)
		{
			iAds->Release();
			iAds = NULL;
			count++;
			_itot(count,inst,10);
			//get IIS web server
			iContainer->GetObject(_bstr_t("IIsWebServer"),_bstr_t(inst),
				(IDispatch**)&iAds);
		}
		
		hr = iContainer->Create(_bstr_t("IIsWebServer"),_bstr_t(inst),(IDispatch**)&iAds);
		ASSERT(iAds);
		iContainer->Release();
		iContainer = NULL;
		if(FAILED(hr))
			goto error;
		
		iServer = iAds;
		iAds->AddRef();
		
		_variant_t vName(lpSiteName);
		
		_variant_t vSize;
		vSize.vt = VT_I4;
		vSize.ulVal = 1;
		
		_bstr_t bstrBind(lpBind);
		_variant_t vBind;
		vBind.vt = VT_BSTR;
		vBind.bstrVal = bstrBind;

		_variant_t vBindList;
		vBindList.vt = VT_ARRAY | VT_VARIANT;


		SAFEARRAYBOUND rgsabound[1];
		rgsabound[0].lLbound = 0;
		rgsabound[0].cElements = 1;
		pNewArray = SafeArrayCreate(VT_VARIANT,1,rgsabound);
		LONG i =0;
		hr = SafeArrayPutElement(pNewArray, &i, (void*)&vBind);
		vBindList.parray = pNewArray;
		hr = iAds->Put(_bstr_t("ServerBindings"),vBindList);
		iAds->Put(_bstr_t("ServerComment"),vName);
		iAds->Put(_bstr_t("ServerSize"),vSize);
		
		_variant_t varEnable;
		varEnable.vt = VT_BOOL;
		varEnable.boolVal = TRUE;
		iAds->Put(_bstr_t("AspEnableParentPaths"),varEnable);
		
		hr = iAds->SetInfo();
		if(FAILED(hr))
		{
			iAds->Release();
			iServer->Release();
			goto error;
		}
		
		hr = iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer);
		ASSERT(iContainer);
		iAds->Release();
		iAds = NULL;
		if(FAILED(hr))
		{
			iServer->Release();
			goto error;
		}
		
		hr = iContainer->Create(_bstr_t("IIsWebVirtualDir"),_bstr_t("Root"),(IDispatch**)&iAds);
		ASSERT(iAds);
		iContainer->Release();
		iContainer = NULL;
		if(FAILED(hr))
		{
			iServer->Release();
			goto error;
		}
		
		iAds->Put(_bstr_t("Path"),_variant_t(lpRoot));
		
		_variant_t var;
		var.vt = VT_BOOL;
		var.boolVal = TRUE;
		iAds->Put(_bstr_t("AnonymousPasswordSync"),var);
		iAds->Put(_bstr_t("AspAllowOutOfProcComponents"),var);
		iAds->Put(_bstr_t("AccessRead"),var);
		iAds->Put(_bstr_t("AccessScript"),var);
		//iAds->Put(_bstr_t("EnableDirBrowsing"),var);
		iAds->Put(_bstr_t("AspEnableParentPaths"),varEnable);

		hr = iAds->SetInfo();
		if(FAILED(hr))
		{
			iServer->Release();
			iAds->Release();
			goto error;
		}

		DISPID dispid;
		OLECHAR FAR* szMember = L"AppCreate";
		iAds->GetIDsOfNames(IID_NULL,&szMember,1, 
			LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 1;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		COleVariant argVal;
		argVal.vt=VT_BOOL;
		argVal.boolVal = TRUE;
		dispParms.rgvarg = &argVal;
		//invoke AppCreate
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
		DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);

		iAds->Release();
		iAds = NULL;
		if(FAILED(hr))
		{
			iServer->Release();
			goto error;
		}
		
		//start service
		DISPID startDispid;
		OLECHAR FAR* szStartMember = L"Start";
		hr = iServer->GetIDsOfNames(IID_NULL,&szStartMember,1, LOCALE_SYSTEM_DEFAULT,&startDispid);
		
		DISPPARAMS startDispParms;
		startDispParms.cArgs = 0;
		startDispParms.cNamedArgs = 0;
		startDispParms.rgdispidNamedArgs = NULL;
		startDispParms.rgvarg = NULL;
		
		//invoke start method
		hr = iServer->Invoke(startDispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&startDispParms,NULL,NULL,NULL);
		iServer->Release();
		iServer = NULL;
		if(FAILED(hr))
			goto error;
		CoUninitialize();	
		return count;
		
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiCreateWebSite"),err);
	}
	catch(...)
	{
	  GetError(_T("AdsiCreateWebSite"));
	}
error:
	CoUninitialize();
	return 0;
}

BOOL _stdcall AdsiStartIIS(LPCTSTR instance)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;
	IADs* iAds = NULL;
	
	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,instance,_tcslen(instance));
		WriteText(_T("AdsiStartIIS"),szMsg);

		UINT ins = FindInstance(instance);
		
		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,
			(void**)&iContainer);
		ASSERT(iContainer);
		if(FAILED(hr))
			goto error;

		TCHAR inst[20];
		_itot(ins,inst,10);

		hr = iContainer->GetObject(_bstr_t("IIsWebServer"),_bstr_t(inst),
			(IDispatch**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
			goto error;
		
		DISPID dispid;
		OLECHAR FAR* szMember = L"Start";
		hr = iAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 0;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		dispParms.rgvarg = NULL;
		
		//invoke start method
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(SUCCEEDED(hr))
			bRet = TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiStartIIS"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiStartIIS"));
	}
error:
	if(iAds)
		iAds->Release();
	if(iContainer)
		iContainer->Release();
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiStopIIS(LPCTSTR instance)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;
	IADs* iAds = NULL;
	
	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,instance,_tcslen(instance));
		WriteText(_T("AdsiStopIIS"),szMsg);

		UINT ins = FindInstance(instance);
		
		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,
			(void**)&iContainer);
		ASSERT(iContainer);
		if(FAILED(hr))
			goto error;

		TCHAR inst[20];
		_itot(ins,inst,10);

		hr = iContainer->GetObject(_bstr_t("IIsWebServer"),
			_bstr_t(inst),(IDispatch**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
			goto error;
		
		DISPID dispid;
		OLECHAR FAR* szMember = L"Stop";
		hr = iAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 0;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		dispParms.rgvarg = NULL;
		
		//invoke start method
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(SUCCEEDED(hr))
			bRet = TRUE;
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiStartIIS"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiStartIIS"));
	}
error:
	if(iAds)
		iAds->Release();
	if(iContainer)
		iContainer->Release();
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiDeleteWebSite(LPCTSTR lpSiteName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;
    IADs* iAds = NULL;
	IADs* iServer = NULL;
	HRESULT hr;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpSiteName,_tcslen(lpSiteName));
		WriteText(_T("AdsiDeleteWebSite"),szMsg);

		if(ADsGetObject(L"IIS://localhost/w3svc",
			IID_IADsContainer,(void**)&iContainer)==S_OK)
		{
			TCHAR inst[20];
			UINT i=1,ins=0;
			_itot(i,inst,10);

			//get IIS web server
			hr = iContainer->GetObject(_bstr_t("IIsWebServer"),
				_bstr_t(inst),(IDispatch**)&iAds);
			if(FAILED(hr))
			{
				iContainer->Release();
				goto error;
			}
			ASSERT(iAds);

			VARIANT varName;
			while(iAds)
			{
				iAds->Get(_bstr_t("ServerComment"),&varName);

				_bstr_t bstrName(varName);
				if(bstrName!=_bstr_t(lpSiteName))
				{
					i++;
					_itot(i,inst,10);
					
					iAds->Release();
					
					//get IIS web server
					iContainer->GetObject(_bstr_t("IIsWebServer"),
					_bstr_t(inst),(IDispatch**)&iAds);
				}
				else
				{
					ins = i;
					iServer = iAds;
					iAds->AddRef();
					iAds->Release();
					break;
				}
			}

			if(!ins)
			{
				iContainer->Release();
				goto error;
			}

			//stop service
			DISPID dispid;
			OLECHAR FAR* szMember = L"Stop";
			HRESULT hr = iServer->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
			if(hr==S_OK)
			{
				DISPPARAMS dispParms;
				dispParms.cArgs = 0;
				dispParms.cNamedArgs = 0;
				dispParms.rgdispidNamedArgs = NULL;
				dispParms.rgvarg = NULL;
				
				//invoke start method
				iServer->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
					DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
			}
			iServer->Release();

			_itot(ins,inst,10);
			iContainer->Delete(_bstr_t("IIsWebServer"),_bstr_t(inst));

			iContainer->Release();
			VariantClear(&varName);
			CoUninitialize();

			return TRUE;
		}
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiDeleteWebSite"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiDeleteWebSite"));
	}
error:
	CoUninitialize();
	return FALSE;
}

BOOL _stdcall AdsiCreateWebWithInstance(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser,LPCTSTR instance)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	BOOL bRet = FALSE;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,instance,_tcslen(instance));
		_tcsncat(szMsg,_T(" "),1);
		_tcsncat(szMsg,lpVDirectoryName,_tcslen(lpVDirectoryName));
		WriteText(_T("AdsiCreateWebWithInstance"),szMsg);

		UINT ins = 1;
		if(instance&&_tcslen(instance))
			ins = FindInstance(instance);
		bRet = (InternalCreateWeb(lpVDirectoryName,lpPath,lpUserName,lpPWD,bIsNeedUser,ins)
			&&SetScriptMaps(lpVDirectoryName,instance));
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiCreateWebWithInstance"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiCreateWebWithInstance"));
	}
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiDeleteWebWithInstance(LPCTSTR lpVDirectory,LPCTSTR instance)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	BOOL bRet = FALSE;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,instance,_tcslen(instance));
		_tcsncat(szMsg,_T(" "),1);
		_tcsncat(szMsg,lpVDirectory,_tcslen(lpVDirectory));
		WriteText(_T("AdsiDeleteWebWithInstance"),szMsg);

		UINT ins = FindInstance(instance);
		bRet = DeleteWeb(lpVDirectory,ins);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiDeleteWebWithInstance"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiDeleteWebWithInstance"));
	}
	CoUninitialize();
	return bRet;
}

BOOL _stdcall AdsiEnableService(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);

	IADs* iAds = NULL;

	try
	{
		WriteText(_T("AdsiEnableService"),_T(""));

		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADs,(void**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
			goto error;

		DISPID dispid;
		OLECHAR FAR* szMember = L"EnableWebServiceExtension";
		hr = iAds->GetIDsOfNames(IID_NULL,&szMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
		
		DISPPARAMS dispParms;
		dispParms.cArgs = 1;
		dispParms.cNamedArgs = 0;
		dispParms.rgdispidNamedArgs = NULL;
		_variant_t argVal;
		argVal.vt = VT_BSTR;
		argVal.bstrVal = _bstr_t(L"ASP");
		dispParms.rgvarg = &argVal;
		
		//enable asp extension service
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(FAILED(hr))
			goto error;

		argVal.bstrVal = _bstr_t(_T("ASP.NET v1.1.4322"));

		//enable asp.net extension service
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(FAILED(hr))
			goto error;

		OLECHAR FAR* member = L"EnableExtensionFile";
		hr = iAds->GetIDsOfNames(IID_NULL,&member,1, LOCALE_SYSTEM_DEFAULT,&dispid);

		//enable all isapi&cgi access
		argVal.bstrVal = _bstr_t(_T("*.exe"));
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		if(FAILED(hr))
			goto error;
		
		argVal.bstrVal = _bstr_t(_T("*.dll"));
		hr = iAds->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,
			DISPATCH_METHOD,&dispParms,NULL,NULL,NULL);
		
		bRet = SUCCEEDED(hr);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiEnableService"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiEnableService"));
	}
error:
	if(iAds)
		iAds->Release();
	CoUninitialize();
	return FALSE;
}

BOOL _stdcall AdsiIsExistIIS()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;

	HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer);
	if(iContainer)
		iContainer->Release();

	CoUninitialize();

	return SUCCEEDED(hr);
}

BOOL _stdcall AdsiSetKeepAlive(LPCTSTR lpInstance,BOOL bValue)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL bRet = FALSE;

	CoInitialize(NULL);

	IADs* iAds = NULL;

	try
	{
		TCHAR szMsg[255];
		szMsg[0] = '\0';
		_tcsncat(szMsg,lpInstance,_tcslen(lpInstance));
		WriteText(_T("AdsiSetKeepAlive"),szMsg);

		WCHAR szInst[MAX_PATH+1];
		szInst[0] = '\0';
		wcscpy(szInst,L"IIS://localhost/w3svc/");
		UINT inst = 1;
		WCHAR instance[3];
		instance[0] = '\0';
		if(lpInstance&&_tcslen(lpInstance))
			inst = FindInstance(lpInstance);
		_itow(inst,instance,10);
		wcsncat(szInst,instance,wcslen(instance));
		HRESULT hr = ADsGetObject(szInst,IID_IADs,(void**)&iAds);
		ASSERT(iAds);
		if(FAILED(hr))
			goto error;

		_variant_t vProp;
		vProp.vt = VT_BOOL;
		vProp.boolVal = bValue;
		iAds->Put(_bstr_t("AllowKeepAlive"),vProp);
		hr = iAds->SetInfo();
		bRet = SUCCEEDED(hr);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiKeepAlive"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiKeepAlive"));
	}
error:
	if(iAds)
		iAds->Release();
	CoUninitialize();
	return bRet;
}


BOOL _stdcall AdsiSetMIMEType(LPCTSTR lpVDirectoryName,LPCTSTR lpExtension,LPCTSTR lpType)
{
	OutputDebugString( _T("AdsiSetMIMEType"));
	CoInitialize(NULL);
	BOOL bRet = FALSE;
	IADs* iAds = NULL;
	try
	{
		if(!InternalGetObject(1,lpVDirectoryName,IID_IADs,(void**)&iAds))
		{
			OutputDebugString( _T("InternalGetObject FALSE"));
			goto error;
		}
		else
		{
           OutputDebugString( _T("InternalGetObject SUCCESS"));
		}
		ASSERT(iAds);

		bRet = InternalSetMIMEType(iAds,lpExtension,lpType);
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiSetMIMEType"),err);
	}
	catch(...)
	{
		GetError(_T("AdsiSetMIMEType"));
	}
error:
	if(iAds)
		iAds->Release();
	CoUninitialize();
	return bRet;
}

BOOL _stdcall InternalSetMIMEType(IADs *iAds,LPCTSTR lpExt,LPCTSTR lpType)
{
	OutputDebugString( _T("InternalSetMIMEType START"));
	ASSERT(iAds);
	BOOL bRet = FALSE;
	VARIANT vProp;
	VariantInit(&vProp);
	vProp.vt = VT_ARRAY|VT_BSTR;

	SAFEARRAY FAR* psa = NULL;
	SAFEARRAY *pNewArray = NULL;
	LONG lElements=0,lLBound=0,lUBound=0;
	
	try
	{
		//get ScriptMaps from meta data
		HRESULT hr = iAds->Get(_bstr_t("MimeMap"),&vProp);
		if(FAILED(hr))
			goto clean;

		psa = V_ARRAY(&vProp);

		ASSERT(psa);
		
		hr = SafeArrayGetLBound(psa, 1, &lLBound);
		hr = SafeArrayGetUBound(psa, 1, &lUBound);
		lElements = lUBound-lLBound+1;
		
		SAFEARRAYBOUND rgsabound[1];
		rgsabound[0].lLbound = 0;
		rgsabound[0].cElements = lElements+1;
		pNewArray = SafeArrayCreate(VT_VARIANT,1,rgsabound);
		
		COleDispatchDriver driver;
		//copy exsit MIME maps into new array
		for(LONG i=0;i<lElements;i++)
		{
			_variant_t varValue;
			CString strExt;

			hr = SafeArrayGetElement(psa,&i,(void*)&varValue);
			driver.AttachDispatch(varValue.pdispVal,FALSE);
			driver.InvokeHelper(0x5,DISPATCH_PROPERTYGET,VT_BSTR,(void*)&strExt,NULL);
			driver.DetachDispatch();
			if(strExt==lpExt)
				goto clean;
			hr = SafeArrayPutElement(pNewArray,&i,(void*)&varValue);
		}
		
		//add MIME maps
		LONG index = lElements;
		_variant_t var;
		var.vt = VT_DISPATCH;
		
		COleException ex;
		bRet = driver.CreateDispatch(_T("MimeMap"),&ex);
		driver.SetProperty(0x5,VT_BSTR,CString(lpExt));
		driver.SetProperty(0x4,VT_BSTR,CString(lpType));
		var.pdispVal = driver.m_lpDispatch;
		hr = SafeArrayPutElement(pNewArray,&index,(void*)&var);
		
		VARIANT vNewProp;
		VariantInit(&vNewProp);
		vNewProp.vt = VT_ARRAY|VT_VARIANT;
		V_ARRAY(&vNewProp) = pNewArray;
		hr = iAds->Put(_bstr_t("MimeMap"),vNewProp);
		
		hr = iAds->SetInfo();
		
		bRet = SUCCEEDED(hr);
		if(bRet)
		{
			OutputDebugString( _T("InternalSetMIMEType set success"));
		}
		else
		{
	         OutputDebugString( _T("InternalSetMIMEType set false"));
		}
	}
	catch(_com_error& err)
	{
		GetComErr(_T("InternalSetMIMEType"),err);
	}
	catch(...)
	{
		GetError(_T("InternalSetMIMEType"));
	}
clean:
	psa = NULL;
	VariantClear(&vProp);
	OutputDebugString( _T("InternalSetMIMEType END"));
	return bRet;
}

BOOL  _stdcall AdsiGetWebRootWithBinding(BSTR* pbstrRoot, int nPort)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CoInitialize(NULL);

	IADsContainer* iContainer = NULL;


	IEnumVARIANT *pEnum;
	LPUNKNOWN     pUnk;
	VARIANT       var;
	IDispatch    *pDisp;
	BSTR          bstrWebSiteName;
	ULONG		lFetch;
	IADs         *pADs;
	TCHAR		pszErrorMes[1024] = {0} ;
	BOOL		bFindWeb = FALSE;
	
	try
	{

		HRESULT hr = ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer);
		ASSERT(iContainer);
		if(FAILED(hr))
			goto error;
		TRACE(_T("ADsGetObject IID_IADSContainer SUCESS."));
		iContainer->get__NewEnum(&pUnk);
		iContainer->Release();
		
		pUnk->QueryInterface(IID_IEnumVARIANT, (void**) &pEnum);
		pUnk->Release();
		
		// Now Enumerate 
		hr = pEnum->Next(1, &var, &lFetch);
		
		while(hr == S_OK)
		{
			if (lFetch == 1)
			{
				pDisp = V_DISPATCH(&var);
				if (pDisp == NULL)
				{
					continue;
				}

				hr = pDisp->QueryInterface(IID_IADs, (void**)&pADs); 	
				//pDisp->Release();
				
				if (FAILED(hr))
				{
					goto enumnext;
				}
				
				_variant_t vBindList;
 				hr= pADs->Get(_bstr_t("ServerBindings"), &vBindList);
				if (vBindList.vt == VT_EMPTY)
				{
					goto enumnext;
				}

				TRACE(_T("Get a ServerBindings"));

				SAFEARRAY* pArray = vBindList.parray;
				
				LONG lIndex = 0;
				LONG lLeftBound = 0;
				LONG lRightBound = 0;
				
				hr = SafeArrayGetLBound(pArray, 1, &lLeftBound);
				
				hr = SafeArrayGetUBound(pArray, 1, &lRightBound);
				
				LONG elementSize = lRightBound - lLeftBound + 1;

				// Enum Port list
				for (lIndex = 0; lIndex < elementSize ; lIndex++)
				{
					_variant_t vPort;
					SafeArrayGetElement(pArray, &lIndex, &vPort);

					WCHAR wszPort[MAX_PATH] = {0};
					wcscpy(wszPort, vPort.bstrVal);
					TRACE(_T("Port:%s"),wszPort);
					WCHAR* nEnd = wcsstr(wszPort + 1, L":" );
					memset(nEnd, 0, 2);
					int port = _wtoi(wszPort + 1);	

					if (port == nPort)
					{
						pADs->get_Name((BSTR*)&bstrWebSiteName);
						bFindWeb = TRUE;
						break;
					}
				}

				//SafeArrayDestroy(pArray);

				pADs->Release();
			}

			if (bFindWeb)
			{
				break;
			}

			enumnext:	
				hr = pEnum->Next(1, &var, &lFetch);
		};

		pEnum->Release();
		
		if (!bFindWeb)
		{
		
			goto error;
		}

		TRACE(_T("FindWeb SUCESS"));

		WCHAR svrName[MAX_PATH] = {0};
		wcscpy(svrName, L"IIS://localhost/w3svc/");
		wcscat(svrName, bstrWebSiteName);
		wcscat(svrName,L"/ROOT");
		hr = ADsGetObject(_bstr_t(svrName), IID_IADs, (void**)&pADs );
		
		_variant_t vRoot;
		pADs->Get(_bstr_t("Path"), &vRoot);

		if (*pbstrRoot == NULL)
		{
			*pbstrRoot = ::SysAllocString(vRoot.bstrVal);
		}
		else
		{
			::SysFreeString(*pbstrRoot);
			::SysReAllocString(pbstrRoot, vRoot.bstrVal);
		}
		
		pADs->Release();
	
		if(FAILED(hr))
			goto error;
		CoUninitialize();	
		return bFindWeb;
		
	}
	catch(_com_error& err)
	{
		GetComErr(_T("AdsiGetWebRootWithBinding"),err);
		TRACE(_T("com_err:%s"), err.ErrorMessage());
	}
	catch(...)
	{
	 TRACE(_T("Exception "));
	  GetError(_T("AdsiGetWebRootWithBinding"));
	}
error:
	CoUninitialize();
	return bFindWeb;
}


/
//ACL Function Declare

#include "Accctrl.h"
#include "Aclapi.h."
#include "MACRO.h"

extern "C"
{
	FUNCAPI BOOL _stdcall EnableDirectoryACL(LPTSTR lpDirectory);
}


#ifndef FUNCAPI
#ifdef EXPORTAPI
#define FUNCAPI __declspec(dllexport)
#else
#define FUNCAPI __declspec(dllimport)
#endif
#endif


//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by SETUPKIT.RC
//

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE	5000
#define _APS_NEXT_CONTROL_VALUE		5000
#define _APS_NEXT_SYMED_VALUE		5000
#define _APS_NEXT_COMMAND_VALUE		32771
#endif
#endif




//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by SETUPKIT.RC
//

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE	5000
#define _APS_NEXT_CONTROL_VALUE		5000
#define _APS_NEXT_SYMED_VALUE		5000
#define _APS_NEXT_COMMAND_VALUE		32771
#endif
#endif


// SetupKit.h : main header file for the SETUPKIT DLL
//

#if !defined(AFX_SETUPKIT_H__BB19DD21_E612_4309_933F_F7ACCE75EC34__INCLUDED_)
#define AFX_SETUPKIT_H__BB19DD21_E612_4309_933F_F7ACCE75EC34__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
	#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"		// main symbols
#include "comdef.h"
#include "macro.h"

/
// CSetupKitApp
// See SetupKit.cpp for the implementation of this class
//

class CSetupKitApp : public CWinApp
{
public:
	CSetupKitApp();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CSetupKitApp)
	//}}AFX_VIRTUAL

	//{{AFX_MSG(CSetupKitApp)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

void GetError(LPTSTR lpSource);
void GetComErr(LPTSTR lpSource,_com_error& err);

extern "C" FUNCAPI int _stdcall WriteText(LPTSTR lpSource,LPTSTR lpMsg);
/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SETUPKIT_H__BB19DD21_E612_4309_933F_F7ACCE75EC34__INCLUDED_)


// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__48C31FEC_4E77_4811_A2EE_989ABEE567ED__INCLUDED_)
#define AFX_STDAFX_H__48C31FEC_4E77_4811_A2EE_989ABEE567ED__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN		// Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#endif // _AFX_NO_OLE_SUPPORT


#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h>			// MFC ODBC database classes
#endif // _AFX_NO_DB_SUPPORT

#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>			// MFC DAO database classes
#endif // _AFX_NO_DAO_SUPPORT

#include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>			// MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__48C31FEC_4E77_4811_A2EE_989ABEE567ED__INCLUDED_)


///
//WebSetup Function Declare

//ADSI include
#include "stdlib.h"
#include "activeds.h"   //Adsi header
#include "comutil.h"
#include "macro.h"

#define INITGUID

extern "C"
{
	//ADSI Function
	///
	///1-FALSE 0-TRUE
	///
	FUNCAPI BOOL _stdcall AdsiCreateWeb(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser);
	FUNCAPI BOOL _stdcall AdsiCreateWebWithSiteName(LPCTSTR lpSiteName,LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser);
	FUNCAPI BOOL _stdcall AdsiCreateVirtualDirection(LPCTSTR  lpszVirtualDirName,LPCTSTR   lpszDiskPath);  
	FUNCAPI BOOL _stdcall AdsiCreateWebServer(LPCTSTR m_sitename,LPCTSTR bindaddress,LPCTSTR domain,LPCTSTR pathname,LPCTSTR m_localidentifier);
	//删除网站标识
    FUNCAPI BOOL _stdcall AdsiDeleteIdentifier(LPCTSTR m_localidentifier);
	//创建网站标识
    FUNCAPI BOOL _stdcall AdsiCreateIdentifier(LPCTSTR m_localidentifier);
	FUNCAPI BOOL _stdcall AdsiDeleteWeb(LPCTSTR lpVDirectory);
	FUNCAPI BOOL _stdcall AdsiSetHttpErrorPage(LPCTSTR lpVirtualName,UINT nErrorCode,UINT nSubErrorCode,LPCTSTR lpFilePath);
	FUNCAPI BOOL _stdcall AdsiCreateSubApp(LPCTSTR lpVirtualName,LPCTSTR lpVirtualSubName,LPCTSTR lpPath);
	FUNCAPI BOOL _stdcall AdsiIsExist(LPCTSTR lpVirtualName);
	FUNCAPI BOOL _stdcall AdsiSetSession(LPCTSTR lpVirtualName,LONG time);
	FUNCAPI BOOL _stdcall AdsiDeleteWebSite(LPCTSTR lpSiteName);
	FUNCAPI BOOL _stdcall AdsiCreateWebWithInstance(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR lpUserName,LPCTSTR lpPWD,BOOL bIsNeedUser,LPCTSTR instance);
	FUNCAPI BOOL _stdcall AdsiDeleteWebWithInstance(LPCTSTR lpVDirectoryName,LPCTSTR instance);
	FUNCAPI BOOL _stdcall AdsiCreateWebWithPath(LPCTSTR lpVDirectoryName,LPCTSTR lpPath,LPCTSTR instance);
	FUNCAPI BOOL _stdcall AdsiStartIIS(LPCTSTR instance);
	FUNCAPI BOOL _stdcall AdsiStopIIS(LPCTSTR instance);
	FUNCAPI BOOL _stdcall AdsiEnableService(void);
	FUNCAPI BOOL _stdcall AdsiIsExistIIS(void);
	FUNCAPI BOOL _stdcall AdsiSetConnectionTimeout(LPCTSTR lpInstance,UINT time);
	FUNCAPI BOOL _stdcall AdsiSetKeepAlive(LPCTSTR lpInstance,BOOL bValue);
	FUNCAPI BOOL _stdcall AdsiGetWebRootWithBinding(BSTR* lpRoot, int nPort);
	FUNCAPI BOOL _stdcall AdsiSetMIMEType(LPCTSTR lpVDirectoryName,LPCTSTR lpExtension,LPCTSTR lpType);
	FUNCAPI BOOL _stdcall InternalSetMIMEType(IADs *iAds,LPCTSTR lpExt,LPCTSTR lpType);
	///
	//0-FALSE >0-number of instance
	///
	FUNCAPI UINT _stdcall AdsiCreateWebSite(LPCTSTR lpSiteName,LPCTSTR lpBind,LPCTSTR lpRoot);
	FUNCAPI BOOL _stdcall InstallU8SLSVR();
	FUNCAPI void _stdcall DisableAutotuning();
}


//
// SETUPKIT.RC2 - resources Microsoft Visual C++ does not edit directly
//

#ifdef APSTUDIO_INVOKED
	#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED


/
// Add manually edited resources here...

/



测试程序




// stdafx.cpp : source file that includes just the standard includes
//	TestSetupKIit.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"






// stdafx.cpp : source file that includes just the standard includes
//	TestSetupKIit.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"





// TestSetupKIitDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestSetupKIit.h"
#include "TestSetupKIitDlg.h"
#define DLLINTERFACE __declspec(dllimport)
#include "..\WebSetup.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CTestSetupKIitDlg dialog

CTestSetupKIitDlg::CTestSetupKIitDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestSetupKIitDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestSetupKIitDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestSetupKIitDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestSetupKIitDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestSetupKIitDlg, CDialog)
	//{{AFX_MSG_MAP(CTestSetupKIitDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_setweb, Onsetweb)
	ON_BN_CLICKED(IDC_CreateIdentifier, OnCreateIdentifier)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CTestSetupKIitDlg message handlers

BOOL CTestSetupKIitDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestSetupKIitDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestSetupKIitDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestSetupKIitDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}



void CTestSetupKIitDlg::Onsetweb() 
{
	//AdsiCreateWeb(_T("STEMS"), _T("C:\\STEMS\\StemsPmms"), _T(""), _T(""), FALSE);
	//AdsiCreateWebWithSiteName(_T("STEMS"),_T("STEMS"), _T("C:\\STEMS\\StemsPmms"), _T(""), _T(""), FALSE);

	BOOL m_iscreatesuccess=FALSE;
	//m_iscreatesuccess=AdsiCreateWebServer(_T("StemsPortal"),_T("10.1.240.108:8080"),_T("www.stems.com"),_T("C:\\STEMS\\StemsPmms"),_T("10002"));
	m_iscreatesuccess=AdsiCreateWebServer(_T("u8virtualtest"),_T("10.1.42.28:9091"),_T(""),_T("C:\\WINDOWS\\system32\\u8virtualtest"),_T("1005"));
    if(TRUE==m_iscreatesuccess)  
	{
		printf("create   site   ok\n");  
	}
    else 
	{
      printf("create   site   failed\n");  
	}
      

	/*
	// TODO: Add your control notification handler code here
	HINSTANCE  hIns = LoadLibrary(_T("E:\\STEMS_SETUP\\STEMS_SETUP\\InstallProject\\SetupKit\\Debug\\SetupKit.dll"));
	FARPROC pFun;
	if (hIns != NULL)
	{
		pFun = GetProcAddress(hIns, "AdsiCreateWebWithSiteName");
		((AdsiCreateWebWithSiteName)(pFun))(_T("STEMS"),_T("STEMS"), _T("C:\\STEMS\\StemsPmms"), _T(""), _T(""), FALSE);
		FreeLibrary(hIns);
	}
	*/
}

void CTestSetupKIitDlg::OnCreateIdentifier() 
{
	// TODO: Add your control notification handler code here
	BOOL m_iscreatesuccess=FALSE;
	m_iscreatesuccess=AdsiCreateIdentifier(_T("1005"));
    if(TRUE==m_iscreatesuccess)  
	{
		printf("create   Identifier   ok\n");  
	}
    else 
	{
      printf("create   Identifier   failed\n");  
	}
      
}


//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by TestSetupKIit.rc
//
#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
#define IDS_ABOUTBOX                    101
#define IDD_TESTSETUPKIIT_DIALOG        102
#define IDR_MAINFRAME                   128
#define IDC_setweb                      1000
#define IDC_CreateIdentifier            1001

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        129
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1002
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__E7E5E2C2_1C2D_4BD1_85AB_2C1BD3AD5A68__INCLUDED_)
#define AFX_STDAFX_H__E7E5E2C2_1C2D_4BD1_85AB_2C1BD3AD5A68__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN		// Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes
#include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>			// MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__E7E5E2C2_1C2D_4BD1_85AB_2C1BD3AD5A68__INCLUDED_)


// TestSetupKIit.h : main header file for the TESTSETUPKIIT application
//

#if !defined(AFX_TESTSETUPKIIT_H__3F99EB60_57BC_46B0_BE71_54004371FE8F__INCLUDED_)
#define AFX_TESTSETUPKIIT_H__3F99EB60_57BC_46B0_BE71_54004371FE8F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
	#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"		// main symbols

/
// CTestSetupKIitApp:
// See TestSetupKIit.cpp for the implementation of this class
//

class CTestSetupKIitApp : public CWinApp
{
public:
	CTestSetupKIitApp();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CTestSetupKIitApp)
	public:
	virtual BOOL InitInstance();
	//}}AFX_VIRTUAL

// Implementation

	//{{AFX_MSG(CTestSetupKIitApp)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};


/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TESTSETUPKIIT_H__3F99EB60_57BC_46B0_BE71_54004371FE8F__INCLUDED_)



// TestSetupKIitDlg.h : header file
//

#if !defined(AFX_TESTSETUPKIITDLG_H__8862725E_2049_447E_8194_2FDAFE23E94A__INCLUDED_)
#define AFX_TESTSETUPKIITDLG_H__8862725E_2049_447E_8194_2FDAFE23E94A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/
// CTestSetupKIitDlg dialog

class CTestSetupKIitDlg : public CDialog
{
// Construction
public:
	CTestSetupKIitDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CTestSetupKIitDlg)
	enum { IDD = IDD_TESTSETUPKIIT_DIALOG };
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CTestSetupKIitDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CTestSetupKIitDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void Onsetweb();
	afx_msg void OnCreateIdentifier();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TESTSETUPKIITDLG_H__8862725E_2049_447E_8194_2FDAFE23E94A__INCLUDED_)


//
// TESTSETUPKIIT.RC2 - resources Microsoft Visual C++ does not edit directly
//

#ifdef APSTUDIO_INVOKED
	#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED


/
// Add manually edited resources here...

/

测试窗体





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能说明: ZYCH网站管理系统 V04基本模块有: 新闻模块、单页模块、产品模块、下载模块、会员模块、视频模块、留言模块、 系统设置:对网站全局进行设置。一键更改网站状态、网站头部风格、修改网站标题、设置网站基本资料和网站系统属性等。 管 理 员:管理员分为超级管理员或普通管理员,超级管理员具有网站最高权限,普通管理员部分功能被限制。 模板显示设置:可设置各栏目显示条数、分页记录数等。 栏目导航:对网站导航菜单以及菜单排序等进行管理。 HTML静态:一键开启静态功能,实现页面生成HTML,访问速度更快。 安全设置:SQL注入管理,后台可设置SQL防注入参数等,SQL注入记录,可封锁攻击者IP等。 后台登陆记录:可查看管理员登陆的相关记录、IP、登陆时间等。 页面管理:创建和管理企业资料如:企业简介、企业荣誉、相关资质、服务特点、营销网络等。并具有单独设置关键词等功能。 新闻增加:新闻可设置标题颜色、是否外部链接、新闻略缩图、是否推荐、新闻点击等。 新闻管理:可分类查看新闻、修改新闻、批量推荐、删除新闻等。新闻分类。 相册管理:可分类查看照片、修改照片、批量推荐、删除照片等。相册分类。 服务项目:管理、添加、删除 团队管理:管理、分类、添加、删除! 服务流程:管理、添加、删除 产品管理:产品共有二级分类。产品略缩图、产品价格等。支持在线购买。产品推荐等。 下载功能:下载分类管理、程序语言、运行平台、推荐等级、程序大小、下载统计等功能。 会员管理:前台会员注册,后台修改会员资料,设置是否注册审核等。 会员订单:后台处理产品订单、在线付款。 广告管理:增加图片、文字、FLASH广告,定义尺寸、类型、生成JS调用。 幻灯管理:新闻幻灯、幻灯修改等。首页与频道页分开展示 招聘管理:在线发布招聘信息、修改、删除、管理职位。查看前台用户投至简历。 应聘管理:会员投递简历可直接到邮箱网站系统和后台。 友情链接:增加文字或图片链接、按文字或图片分类管理。 留言管理:留言增加是否审核功能,增加回复功能。前台发表和显示留言列表。 数据管理:数据库压缩、备份、还原 搜索引擎SEO:本程序已经进行简单SEO优化,大部门页面均可单独设置关键词等。默认模板代码优化。
### 回答1: IIS(Internet Information Services)是一个用于在Windows操作系统上托管Web应用程序的服务。虚拟目录是指在IIS中用来代表Web站点中的一个目录,但其实际上可能位于其他位置,比如不同的磁盘驱动器或网络共享。 反向代理是一种服务器管理技术,它将客户端的请求发送到不同的服务器,然后将服务器的响应返回给客户端。在IIS中实现反向代理,可以通过将请求重定向到不同的虚拟目录来实现。 要配置IIS虚拟目录反向代理,可以按照以下步骤进行: 1. 打开IIS管理器,在“站点”节点下选择要配置反向代理的站点。 2. 如果尚未创建虚拟目录,请右键单击站点,选择“添加虚拟目录”来创建。 3. 在虚拟目录的属性中,选择“基本设置”选项卡,然后点击“连接”按钮。 4. 在“物理路径”框中,输入需要代理的目标服务器的URL地址,例如http://www.targetserver.com。 5. 在“身份验证”下拉列表中,选择要用于向目标服务器发送验证的身份验证方法。 6. 在“代理”选项卡中,选择“启用代理”复选框。 7. 在“重写响应”选项卡中,可以选择是否重写目标服务器返回的响应,例如重写URL或响应头。 8. 点击“确定”保存配置。 这样,当客户端发出请求,并匹配到虚拟目录的URL路径时,IIS会将请求转发到目标服务器,并将目标服务器的响应返回给客户端。 通过配置IIS虚拟目录反向代理,可以实现将不同的请求转发到不同的服务器,可以用于负载均衡、缓存、安全和增强性能等方面的需求。希望这个回答对您有所帮助。 ### 回答2: IIS(Internet Information Services)虚拟目录反向代理配置是一种常见的网络配置方案。反向代理是一种转发网络请求的技术,它将客户端请求转发到内部服务器,并将响应返回给客户端,实现了客户端与服务器之间的隔离。 要配置IIS虚拟目录反向代理,需要进行以下步骤: 1. 打开IIS管理器,选择要配置反向代理的网站或应用程序。 2. 在“功能视图”下,找到“URL重写”或“HTTP重定向”功能。 3. 点击“添加规则”或“新建规则”,根据实际需求选择不同的规则类型,例如“反向代理”或“反向代理转发”。 4. 在规则设置中,填写目标服务器的详细信息,包括IP地址、端口号和目标路径等。 5. 配置其他选项,如路径重写、HTTP头设置等,根据实际需求进行调整。 6. 保存配置,并启用规则。 通过上述步骤,IIS就可以将外部客户端的请求转发到指定的内部服务器,实现反向代理的功能。这样可以隐藏内部服务器的实际IP地址和端口号,提供更好的安全性和灵活性。 需要注意的是,配置反向代理时要确保IIS服务器对目标服务器有访问权限,并且要注意网络安全性,避免不必要的风险。另外,根据具体需求可以配置多个虚拟目录反向代理,以实现更复杂的网络配置和应用场景。 总之,IIS虚拟目录反向代理配置可以提供更好的网络性能和安全性,适用于许多场景,如负载均衡、高可用性和内容分发等。 ### 回答3: IIS(Internet Information Services)是微软的一种Web服务器软件,可以通过虚拟目录反向代理配置实现将来自外部请求的流量转发到其他服务器上。 在IIS中设置虚拟目录,首先需要在IIS管理器中创建一个新的网站或虚拟应用程序。在创建过程中,需要指定站点的名称、物理路径和绑定的IP地址或域名等信息。创建完成后,可以在该网站或虚拟应用程序的属性设置中进行高级配置。 在IIS管理器中选中创建的网站或虚拟应用程序,然后点击右侧的"URL重写"或"HTTP重定向"等选项进行配置。在URL重写模块中,可以添加输入和输出规则,用于控制请求的转发规则。例如,可以设置当请求匹配特定的URL路径时,将请求发送到另外一个服务器的指定URL路径下。 在反向代理配置中,需要设置目标服务器的地址和端口号。可以在URL重写规则中的"动作"下选择"重写URL",然后填写目标服务器的地址和端口号。此外,还可以设置其他的转发规则,如是否保留原始URL等。 配置完成后,保存并应用更改。此时,IIS将会将来自外部的请求转发到指定的目标服务器上,从而实现虚拟目录的反向代理。 总结起来,IIS虚拟目录反向代理配置就是通过创建网站或虚拟应用程序,在URL重写模块中设置转发规则,将外部请求转发到其他服务器上。这样可以实现让IIS服务器充当中间人,将流量转发到目标服务器,提高系统的负载均衡和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值