windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/wmiprov_dynamic/appladmin.cpp
2020-09-26 16:20:57 +08:00

437 lines
8.4 KiB
C++

/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
appladmin.cpp
Abstract:
This file contains implementation of:
CAppPoolMethod, CWebAppMethod
Author:
???
Revision History:
Mohit Srivastava 21-Jan-01
--*/
#include "iisprov.h"
#include "appladmin.h"
#include "MultiSzHelper.h"
#include "iiswmimsg.h"
//
// CApplAdmin
//
CAppPoolMethod::CAppPoolMethod()
{
HRESULT hr = CoCreateInstance(
CLSID_WamAdmin,
NULL,
CLSCTX_ALL,
IID_IIISApplicationAdmin,
(void**)&m_spAppAdmin);
THROW_ON_ERROR(hr);
}
CAppPoolMethod::~CAppPoolMethod()
{
}
void CAppPoolMethod::GetCurrentMode(
VARIANT* io_pvtServerMode)
/*++
Synopsis:
This method, unlike the others, is actually on the IIsWebService node.
Arguments: [io_pvtServerMode] -
--*/
{
DBG_ASSERT(io_pvtServerMode != NULL);
DWORD dwServerMode = 0;
VariantInit(io_pvtServerMode);
HRESULT hr = m_spAppAdmin->GetProcessMode(&dwServerMode);
THROW_ON_ERROR(hr);
io_pvtServerMode->vt = VT_I4;
io_pvtServerMode->lVal = dwServerMode;
}
void CAppPoolMethod::Start(
LPCWSTR i_wszMbPath)
{
DBG_ASSERT(i_wszMbPath != NULL);
SetState(i_wszMbPath, MD_APPPOOL_COMMAND_START);
}
void CAppPoolMethod::Stop(
LPCWSTR i_wszMbPath)
{
DBG_ASSERT(i_wszMbPath != NULL);
SetState(i_wszMbPath, MD_APPPOOL_COMMAND_STOP);
}
void CAppPoolMethod::RecycleAppPool(
LPCWSTR i_wszMbPath)
{
DBG_ASSERT(i_wszMbPath != NULL);
LPCWSTR wszAppPool = NULL;
GetPtrToAppPool(i_wszMbPath, &wszAppPool);
HRESULT hr = m_spAppAdmin->RecycleApplicationPool(wszAppPool);
THROW_ON_ERROR(hr);
}
void CAppPoolMethod::EnumAppsInPool(
LPCWSTR i_wszMbPath,
VARIANT* io_pvtApps)
/*++
Synopsis:
Arguments: [i_wszMbPath] -
[io_pvtApps] - Will be an array of strings
--*/
{
DBG_ASSERT(i_wszMbPath != NULL);
DBG_ASSERT(io_pvtApps != NULL);
CComBSTR sbstrApps = NULL;
VariantInit(io_pvtApps);
LPCWSTR wszAppPool = NULL;
GetPtrToAppPool(i_wszMbPath, &wszAppPool);
HRESULT hr = m_spAppAdmin->EnumerateApplicationsInPool(
wszAppPool,
&sbstrApps);
THROW_ON_ERROR(hr);
CMultiSz MultiSz;
hr = MultiSz.ToWmiForm(
sbstrApps,
io_pvtApps);
THROW_ON_ERROR(hr);
}
void CAppPoolMethod::DeleteAppPool(
LPCWSTR i_wszMbPath)
{
DBG_ASSERT(i_wszMbPath);
LPCWSTR wszAppPool = NULL;
GetPtrToAppPool(i_wszMbPath, &wszAppPool);
HRESULT hr = m_spAppAdmin->DeleteApplicationPool(wszAppPool);
THROW_ON_ERROR(hr);
}
//
// CAppPoolMethod - private methods
//
void CAppPoolMethod::GetPtrToAppPool(
LPCWSTR i_wszMbPath,
LPCWSTR* o_pwszAppPool)
/*++
Synopsis:
Arguments: [i_wszMbPath] -
[o_wszAppPool] - This is a ptr to i_wszMbPath. Does not need to be
freed by caller.
--*/
{
DBG_ASSERT(i_wszMbPath);
DBG_ASSERT(o_pwszAppPool);
DBG_ASSERT(*o_pwszAppPool == NULL);
DBG_ASSERT(i_wszMbPath[0] == L'/');
DBG_ASSERT(i_wszMbPath[1] != L'\0');
LPWSTR wszAppPool = (LPWSTR)wcsrchr(i_wszMbPath, L'/');
*wszAppPool = L'\0';
if(_wcsicmp(i_wszMbPath, L"/LM/w3svc/AppPools") != 0)
{
*wszAppPool = L'/';
CIIsProvException e;
e.SetMC(WBEM_E_FAILED, IISWMI_INVALID_APPPOOL_CONTAINER, i_wszMbPath);
throw e;
}
*wszAppPool = L'/';
//
// Set out params on success
//
*o_pwszAppPool = wszAppPool + 1;
}
void CAppPoolMethod::SetState(
LPCWSTR i_wszMbPath,
DWORD dwState)
{
METADATA_HANDLE hObjHandle = NULL;
DWORD dwBufferSize = sizeof(DWORD);
METADATA_RECORD mdrMDData;
LPBYTE pBuffer = (LPBYTE)&dwState;
CMetabase metabase;
CComPtr<IMSAdminBase2> spIABase = (IMSAdminBase2*)metabase;
HRESULT hr = spIABase->OpenKey(
METADATA_MASTER_ROOT_HANDLE,
i_wszMbPath,
METADATA_PERMISSION_WRITE,
DEFAULT_TIMEOUT_VALUE, // 30 seconds
&hObjHandle
);
THROW_ON_ERROR(hr);
MD_SET_DATA_RECORD(&mdrMDData,
MD_APPPOOL_COMMAND,
METADATA_VOLATILE,
IIS_MD_UT_SERVER,
DWORD_METADATA,
dwBufferSize,
pBuffer);
hr = spIABase->SetData(
hObjHandle,
L"",
&mdrMDData
);
spIABase->CloseKey(hObjHandle);
THROW_ON_ERROR(hr);
}
//
// CWebAppMethod
//
CWebAppMethod::CWebAppMethod()
{
HRESULT hr = CoCreateInstance(
CLSID_WamAdmin,
NULL,
CLSCTX_ALL,
IID_IIISApplicationAdmin,
(void**)&m_pAppAdmin
);
hr = CoCreateInstance(
CLSID_WamAdmin,
NULL,
CLSCTX_ALL,
IID_IWamAdmin2,
(void**)&m_pWamAdmin2
);
THROW_ON_ERROR(hr);
}
CWebAppMethod::~CWebAppMethod()
{
if(m_pAppAdmin)
m_pAppAdmin->Release();
if(m_pWamAdmin2)
m_pWamAdmin2->Release();
}
HRESULT CWebAppMethod::AppCreate(
LPCWSTR szMetaBasePath,
bool bInProcFlag,
LPCWSTR szAppPoolName,
bool bCreatePool
)
{
HRESULT hr;
LPWSTR szActualName;
BOOL bActualCreation = FALSE;
if (szAppPoolName) {
szActualName = (LPWSTR)szAppPoolName;
}
else {
szActualName = NULL;
}
if (bCreatePool != true) {
bActualCreation = FALSE;
}
else {
bActualCreation = TRUE;
}
hr = m_pAppAdmin->CreateApplication(
szMetaBasePath,
bInProcFlag ? 0 : 2, // 0 for InProc, 2 for Pooled Proc
szActualName,
bActualCreation // Don't create - DefaultAppPool should already be there
);
return hr;
}
HRESULT CWebAppMethod::AppCreate2(
LPCWSTR szMetaBasePath,
long lAppMode,
LPCWSTR szAppPoolName,
bool bCreatePool
)
{
HRESULT hr;
LPWSTR szActualName;
BOOL bActualCreation = FALSE;
if (szAppPoolName) {
szActualName = (LPWSTR)szAppPoolName;
}
else {
szActualName = NULL;
}
if (bCreatePool != true) {
bActualCreation = FALSE;
}
else {
bActualCreation = TRUE;
}
hr = m_pAppAdmin->CreateApplication(
szMetaBasePath,
lAppMode,
szActualName,
bActualCreation // Don't create - DefaultAppPool should already be there
);
return hr;
}
HRESULT CWebAppMethod::AppDelete(
LPCWSTR szMetaBasePath,
bool bRecursive
)
{
HRESULT hr;
hr = m_pAppAdmin->DeleteApplication(
szMetaBasePath,
bRecursive ? TRUE : FALSE // Don't mix bool w/ BOOL
);
return hr;
}
HRESULT CWebAppMethod::AppUnLoad(
LPCWSTR szMetaBasePath,
bool bRecursive
)
{
HRESULT hr;
hr = m_pWamAdmin2->AppUnLoad(
szMetaBasePath,
bRecursive ? TRUE : FALSE // Don't mix bool w/ BOOL
);
return hr;
}
HRESULT CWebAppMethod::AppDisable(
LPCWSTR szMetaBasePath,
bool bRecursive
)
{
HRESULT hr;
hr = m_pWamAdmin2->AppDeleteRecoverable(
szMetaBasePath,
bRecursive ? TRUE : FALSE // Don't mix bool w/ BOOL
);
return hr;
}
HRESULT CWebAppMethod::AppEnable(
LPCWSTR szMetaBasePath,
bool bRecursive
)
{
HRESULT hr;
hr = m_pWamAdmin2->AppRecover(
szMetaBasePath,
bRecursive ? TRUE : FALSE // Don't mix bool w/ BOOL
);
return hr;
}
HRESULT CWebAppMethod::AppGetStatus(
LPCWSTR szMetaBasePath,
DWORD* pdwStatus
)
{
HRESULT hr;
hr = m_pWamAdmin2->AppGetStatus(
szMetaBasePath,
pdwStatus);
return hr;
}
HRESULT CWebAppMethod::AspAppRestart(
LPCWSTR a_szMetaBasePath
)
{
HRESULT hr = S_OK;
DWORD dwState = 0;
METADATA_HANDLE t_hKey = NULL;
CMetabase t_mb;
// open key
t_hKey = t_mb.OpenKey(a_szMetaBasePath, true);
// check app
hr = t_mb.WebAppCheck(t_hKey);
THROW_ON_ERROR(hr);
// get state
hr = t_mb.WebAppGetStatus(t_hKey, &dwState);
THROW_ON_ERROR(hr);
// change state value
dwState = dwState ? 0 : 1;
hr = t_mb.WebAppSetStatus(t_hKey, dwState);
THROW_ON_ERROR(hr);
// re-set back state value
dwState = dwState ? 0 : 1;
hr = t_mb.WebAppSetStatus(t_hKey, dwState);
THROW_ON_ERROR(hr);
t_mb.CloseKey(t_hKey);
return hr;
}