mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2517 lines
54 KiB
2517 lines
54 KiB
/*++
|
|
|
|
Copyright (c) 1994-2000 Microsoft Corporation
|
|
|
|
Module Name :
|
|
mdkeys.h
|
|
|
|
Abstract:
|
|
Metabase key wrapper classes
|
|
Wam admin interface wrapper class
|
|
App admin interface wrapper class
|
|
|
|
Author:
|
|
Ronald Meijer (ronaldm)
|
|
Sergei Antonov (sergeia)
|
|
|
|
Project:
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _MDKEYS_H_
|
|
#define _MDKEYS_H_
|
|
|
|
|
|
|
|
//
|
|
// Include Files
|
|
//
|
|
#include <iadmw.h>
|
|
#include <iwamreg.h>
|
|
#include <iiscnfgp.h>
|
|
#include <winsvc.h>
|
|
#include <iisrsta.h>
|
|
|
|
//
|
|
// Forward definitions
|
|
//
|
|
class CBlob;
|
|
|
|
|
|
|
|
//
|
|
// Use this instance number to denote the master
|
|
//
|
|
#define MASTER_INSTANCE (0)
|
|
#define IS_MASTER_INSTANCE(i) (i == MASTER_INSTANCE)
|
|
|
|
|
|
|
|
//
|
|
// Metabase node constants, used for static initialization of const
|
|
// strings further down. Defined here with #defines for easier
|
|
// concatenation later.
|
|
//
|
|
#define SZ_MBN_MACHINE _T("LM")
|
|
#define SZ_MBN_FILTERS _T("Filters")
|
|
#define SZ_MBN_MIMEMAP _T("MimeMap")
|
|
#define SZ_MBN_TEMPLATES _T("Templates")
|
|
#define SZ_MBN_INFO _T("Info")
|
|
#define SZ_MBN_ROOT _T("Root")
|
|
#define SZ_MBN_COMPRESSION _T("Compression")
|
|
#define SZ_MBN_PARAMETERS _T("Parameters")
|
|
#define SZ_MBN_SEP_CHAR _T('/')
|
|
#define SZ_MBN_SEP_STR _T("/")
|
|
#define SZ_MBN_WEB _T("W3SVC")
|
|
#define SZ_MBN_FTP _T("MSFTPSVC")
|
|
#define SZ_MBN_APP_POOLS _T("AppPools")
|
|
|
|
class CIISInterface;
|
|
class COMDLL CComAuthInfo
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Server/authentication information. Contains optional
|
|
impersonation parameters. Typically used in the construction in
|
|
CIISInterface.
|
|
|
|
Public Interface:
|
|
|
|
CComAuthInfo : Constructor. Impersonation optional
|
|
operator= : Assignment operators
|
|
CreateServerInfoStruct : Helper function for use in COM
|
|
FreeServerInfoStruct : As above.
|
|
|
|
Notes:
|
|
|
|
Because there's an operator for a pointer to itself and because
|
|
CIISInterface copies the information at construction time, a
|
|
CComAuthInfo can safely be constructed on the stack as a parameter
|
|
to CIISInterface derived classes.
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
//
|
|
// Standard Constructor. NULL for servername indicates
|
|
// local computer.
|
|
//
|
|
CComAuthInfo(
|
|
IN LPCOLESTR lpszServerName = NULL,
|
|
IN LPCOLESTR lpszUserName = NULL,
|
|
IN LPCOLESTR lpszPassword = NULL
|
|
);
|
|
|
|
//
|
|
// Copy Constructors
|
|
//
|
|
CComAuthInfo(
|
|
IN CComAuthInfo & auth
|
|
);
|
|
|
|
CComAuthInfo(
|
|
IN CComAuthInfo * pAuthInfo OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Assignment operators
|
|
//
|
|
public:
|
|
CComAuthInfo & operator =(CComAuthInfo & auth);
|
|
CComAuthInfo & operator =(CComAuthInfo * pAuthInfo);
|
|
CComAuthInfo & operator =(LPCTSTR lpszServerName);
|
|
|
|
//
|
|
// Access
|
|
//
|
|
public:
|
|
COSERVERINFO * CreateServerInfoStruct() const;
|
|
COSERVERINFO * CreateServerInfoStruct(DWORD dwAuthnLevel) const;
|
|
void FreeServerInfoStruct(COSERVERINFO * pServerInfo) const;
|
|
|
|
LPOLESTR QueryServerName() const { return m_bstrServerName; }
|
|
LPOLESTR QueryUserName() const { return m_bstrUserName; }
|
|
LPOLESTR QueryPassword() const { return m_bstrPassword; }
|
|
BOOL IsLocal() const { return m_fLocal; }
|
|
BOOL UsesImpersonation() const { return m_bstrUserName.Length() > 0; }
|
|
void SetImpersonation(LPCOLESTR lpszUser, LPCOLESTR lpszPassword);
|
|
void RemoveImpersonation();
|
|
void StorePassword(LPCOLESTR lpszPassword);
|
|
|
|
public:
|
|
HRESULT ApplyProxyBlanket(IUnknown * pInterface);
|
|
|
|
//
|
|
// Conversion Operators
|
|
//
|
|
public:
|
|
operator LPOLESTR() { return QueryServerName(); }
|
|
operator CComAuthInfo *() { return this; }
|
|
|
|
//
|
|
// Static Helpers
|
|
//
|
|
public:
|
|
//
|
|
// Given domain\username, split into user name and domain
|
|
//
|
|
static BOOL SplitUserNameAndDomain(
|
|
IN OUT CString & strUserName,
|
|
IN CString & strDomainName
|
|
);
|
|
|
|
//
|
|
// Verify username and password are correct
|
|
//
|
|
static DWORD VerifyUserPassword(
|
|
IN LPCTSTR lpstrUserName,
|
|
IN LPCTSTR lpstrPassword
|
|
);
|
|
|
|
protected:
|
|
//
|
|
// Store the computer name (NULL for local computer)
|
|
//
|
|
void SetComputerName(
|
|
IN LPCOLESTR lpszServerName OPTIONAL
|
|
);
|
|
|
|
private:
|
|
CComBSTR m_bstrServerName;
|
|
CComBSTR m_bstrUserName;
|
|
CComBSTR m_bstrPassword;
|
|
BOOL m_fLocal;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CMetabasePath
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Metabase path class. This is a helper class to build complete
|
|
metabase paths out of various components.
|
|
|
|
Example: CMetaKey(CComAuthInfo("ronaldm3"), CMetabasePath(SZ_WEBSVC, dwInstance, _T("root")));
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Metabase components in order
|
|
//
|
|
enum
|
|
{
|
|
iBlank, // Sep 0
|
|
iMachine, // LM
|
|
iService, // e.g. lm/w3svc
|
|
iInstance, // e.g. lm/w3svc/1
|
|
iRootDirectory, // e.g. lm/w3svc/1/root
|
|
iSubDirectory, // e.g. lm/w3vsc/1/root/foobar
|
|
};
|
|
|
|
//
|
|
// Metabase helper functions.
|
|
//
|
|
public:
|
|
//
|
|
// Clean metabase path
|
|
//
|
|
static LPCTSTR CleanMetaPath(
|
|
IN OUT CString & strMetaRoot
|
|
);
|
|
|
|
//
|
|
// Find out the instance number from the given metabase path
|
|
//
|
|
static DWORD GetInstanceNumber(LPCTSTR lpszMDPath);
|
|
|
|
//
|
|
// Get the last nodename in the given metabase path
|
|
//
|
|
static LPCTSTR GetLastNodeName(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNodeName
|
|
);
|
|
|
|
//
|
|
// Truncate the path at a given sub path
|
|
//
|
|
static LPCTSTR TruncatePath(
|
|
IN int nLevel,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder = NULL
|
|
);
|
|
|
|
static LPCTSTR GetMachinePath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder = NULL
|
|
);
|
|
|
|
static LPCTSTR GetServicePath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder = NULL
|
|
);
|
|
|
|
static LPCTSTR GetInstancePath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder = NULL
|
|
);
|
|
|
|
static LPCTSTR GetRootPath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder = NULL
|
|
);
|
|
|
|
//
|
|
// Determine the path to the info node that's relevant
|
|
// to this metabase path.
|
|
//
|
|
static LPCTSTR GetServiceInfoPath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strInfoPath,
|
|
IN LPCTSTR lpszDefService = SZ_MBN_WEB
|
|
);
|
|
|
|
//
|
|
// Change path to parent node
|
|
//
|
|
static LPCTSTR ConvertToParentPath(
|
|
OUT IN CString & strMetaPath
|
|
);
|
|
|
|
//
|
|
// Determine if the path describes a home directory path
|
|
//
|
|
static BOOL IsHomeDirectoryPath(
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
//
|
|
// Determine if the path describes the 'master' instance (site)
|
|
//
|
|
static BOOL IsMasterInstance(
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
//
|
|
// Split the metapath at the instance border
|
|
//
|
|
static void SplitMetaPathAtInstance(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strParent,
|
|
OUT CString & strAlias
|
|
);
|
|
|
|
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
CMetabasePath(
|
|
IN BOOL fAddBasePath,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN LPCTSTR lpszMDPath2 = NULL,
|
|
IN LPCTSTR lpszMDPath3 = NULL,
|
|
IN LPCTSTR lpszMDPath4 = NULL
|
|
);
|
|
|
|
//
|
|
// Construct with path components
|
|
//
|
|
CMetabasePath(
|
|
IN LPCTSTR lpszSvc = NULL,
|
|
IN DWORD dwInstance = MASTER_INSTANCE,
|
|
IN LPCTSTR lpszParentPath = NULL,
|
|
IN LPCTSTR lpszAlias = NULL
|
|
);
|
|
|
|
//
|
|
// Access
|
|
//
|
|
public:
|
|
BOOL IsHomeDirectoryPath() const { return IsHomeDirectoryPath(m_strMetaPath); }
|
|
LPCTSTR QueryMetaPath() const { return m_strMetaPath; }
|
|
|
|
//
|
|
// Conversion Operators
|
|
//
|
|
public:
|
|
operator LPCTSTR() const { return QueryMetaPath(); }
|
|
|
|
//
|
|
// Helpers
|
|
//
|
|
protected:
|
|
void BuildMetaPath(
|
|
IN LPCTSTR lpszSvc,
|
|
IN LPCTSTR szInstance,
|
|
IN LPCTSTR lpszParentPath,
|
|
IN LPCTSTR lpszAlias
|
|
);
|
|
|
|
void BuildMetaPath(
|
|
IN LPCTSTR lpszSvc,
|
|
IN DWORD dwInstance,
|
|
IN LPCTSTR lpszParentPath,
|
|
IN LPCTSTR lpszAlias
|
|
);
|
|
|
|
void AppendPath(LPCTSTR lpszPath);
|
|
void AppendPath(DWORD dwInstance);
|
|
|
|
protected:
|
|
//
|
|
// Metabase path components
|
|
//
|
|
static const LPCTSTR _cszMachine;
|
|
static const LPCTSTR _cszRoot;
|
|
static const LPCTSTR _cszSep;
|
|
static const TCHAR _chSep;
|
|
|
|
private:
|
|
CString m_strMetaPath;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CIISInterface
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Base interface class for IIS interfaces. Most client COM-wrappers
|
|
should derive from this class so that they can easily pick up
|
|
share authentication and proxy blanket information methods.
|
|
|
|
Virtual Interface:
|
|
|
|
Succeeded : Return TRUE if item constructed successfully
|
|
QueryResult : Return construction error code
|
|
|
|
Public Interface:
|
|
|
|
operator BOOL : Cast to TRUE/FALSE depending on success
|
|
operator HRESULT : Cast to the HRESULT status
|
|
|
|
QueryServerName : Get the server name
|
|
IsLocal : Determine if the interface is on the local machine
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
CIISInterface(
|
|
IN CComAuthInfo * pAuthInfo,
|
|
IN HRESULT hrInterface = S_OK
|
|
);
|
|
|
|
//
|
|
// Interface:
|
|
//
|
|
public:
|
|
CComAuthInfo * QueryAuthInfo() { return &m_auth; }
|
|
LPCOLESTR QueryServerName() const { return m_auth.QueryServerName(); }
|
|
BOOL IsLocal() const { return m_auth.IsLocal(); }
|
|
|
|
//
|
|
// Virtual Interface:
|
|
//
|
|
public:
|
|
virtual BOOL Succeeded() const { return SUCCEEDED(m_hrInterface); }
|
|
virtual HRESULT QueryResult() const { return m_hrInterface; }
|
|
virtual HRESULT ChangeProxyBlanket(
|
|
IN LPCOLESTR lpszUserName,
|
|
IN LPCOLESTR lpszPassword
|
|
);
|
|
|
|
//
|
|
// Conversion Operators
|
|
//
|
|
public:
|
|
operator BOOL() const { return Succeeded(); }
|
|
operator HRESULT() const { return m_hrInterface; }
|
|
|
|
protected:
|
|
virtual HRESULT ApplyProxyBlanket() = 0;
|
|
HRESULT Create(
|
|
IN int cInterfaces,
|
|
IN const IID rgIID[],
|
|
IN const GUID rgCLSID[],
|
|
OUT int * pnInterface, OPTIONAL
|
|
OUT IUnknown ** ppInterface
|
|
);
|
|
|
|
protected:
|
|
CComAuthInfo m_auth;
|
|
HRESULT m_hrInterface;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CMetaInterface : public CIISInterface
|
|
/*++
|
|
|
|
Class description:
|
|
|
|
Metabase interface class.
|
|
|
|
Virtual Interface:
|
|
|
|
Succeeded : Return TRUE if item constructed successfully
|
|
QueryResult : Return construction error code
|
|
|
|
Public Interface:
|
|
|
|
Regenerate : Recreate the interface
|
|
|
|
--*/
|
|
{
|
|
public:
|
|
//
|
|
// Destructor destroys the interface
|
|
//
|
|
virtual ~CMetaInterface();
|
|
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
protected:
|
|
//
|
|
// Fully defined constructor that creates the interface.
|
|
// Use NULL to indicate the local computer name
|
|
//
|
|
CMetaInterface(
|
|
IN CComAuthInfo * pServer
|
|
);
|
|
|
|
//
|
|
// Construct from existing interface
|
|
//
|
|
CMetaInterface(
|
|
IN CMetaInterface * pInterface
|
|
);
|
|
|
|
public:
|
|
//
|
|
// Rebuild the interface
|
|
//
|
|
HRESULT Regenerate();
|
|
|
|
protected:
|
|
virtual HRESULT ApplyProxyBlanket();
|
|
|
|
//
|
|
// Create a metadata object in this server. This function initializes the
|
|
// metadata object with DCOM.
|
|
//
|
|
HRESULT Create();
|
|
|
|
//
|
|
// Make sure the interface has been created
|
|
//
|
|
BOOL HasInterface() const { return m_pInterface != NULL; }
|
|
|
|
//
|
|
// IADMW Interface -- all methods defines as inline at the end of this file.
|
|
//
|
|
protected:
|
|
HRESULT OpenKey(
|
|
IN METADATA_HANDLE hkBase,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwFlags,
|
|
OUT METADATA_HANDLE * phMDNewHandle
|
|
);
|
|
|
|
HRESULT CloseKey(
|
|
IN METADATA_HANDLE hKey
|
|
);
|
|
|
|
HRESULT SetLastChangeTime(
|
|
IN METADATA_HANDLE hMDHandle,
|
|
IN LPCTSTR pszMDPath,
|
|
IN FILETIME * pftMDLastChangeTime,
|
|
IN BOOL bLocalTime
|
|
);
|
|
|
|
HRESULT GetLastChangeTime(
|
|
IN METADATA_HANDLE hMDHandle,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT FILETIME * pftMDLastChangeTime,
|
|
IN BOOL bLocalTime
|
|
);
|
|
|
|
HRESULT AddKey(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
HRESULT DeleteKey(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
HRESULT DeleteChildKeys(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
HRESULT EnumKeys(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT LPTSTR lpszMDName,
|
|
IN DWORD dwIndex
|
|
);
|
|
|
|
HRESULT CopyKey(
|
|
IN METADATA_HANDLE hSourceKey,
|
|
IN LPCTSTR lpszMDSourcePath,
|
|
IN METADATA_HANDLE hDestKey,
|
|
IN LPCTSTR lpszMDDestPath,
|
|
IN BOOL fOverwrite,
|
|
IN BOOL fCopy
|
|
);
|
|
|
|
HRESULT RenameKey(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN LPCTSTR lpszNewName
|
|
);
|
|
|
|
HRESULT GetData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT METADATA_RECORD * pmdRecord,
|
|
OUT DWORD * pdwRequiredDataLen
|
|
);
|
|
|
|
HRESULT SetData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN METADATA_RECORD * pmdRecord
|
|
);
|
|
|
|
HRESULT DeleteData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDIdentifier,
|
|
IN DWORD dwMDDataType
|
|
);
|
|
|
|
HRESULT EnumData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT METADATA_RECORD * pmdRecord,
|
|
IN DWORD dwIndex,
|
|
OUT DWORD * pdwRequiredDataLen
|
|
);
|
|
|
|
HRESULT GetAllData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDAttributes,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType,
|
|
OUT DWORD * pdwMDNumDataEntries,
|
|
OUT DWORD * pdwMDDataSetNumber,
|
|
IN DWORD dwMDBufferSize,
|
|
OUT LPBYTE pbMDBuffer,
|
|
OUT DWORD * pdwRequiredBufferSize
|
|
);
|
|
|
|
HRESULT DeleteAllData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType
|
|
);
|
|
|
|
HRESULT CopyData(
|
|
IN METADATA_HANDLE hMDSourceKey,
|
|
IN LPCTSTR lpszMDSourcePath,
|
|
IN METADATA_HANDLE hMDDestKey,
|
|
IN LPCTSTR lpszMDDestPath,
|
|
IN DWORD dwMDAttributes,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType,
|
|
IN BOOL fCopy
|
|
);
|
|
|
|
HRESULT GetDataPaths(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDIdentifier,
|
|
IN DWORD dwMDDataType,
|
|
IN DWORD dwMDBufferSize,
|
|
OUT LPTSTR lpszBuffer,
|
|
OUT DWORD * pdwMDRequiredBufferSize
|
|
);
|
|
|
|
HRESULT Backup(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags
|
|
);
|
|
|
|
HRESULT BackupWithPassword(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags,
|
|
IN LPCTSTR lpszPassword
|
|
);
|
|
|
|
HRESULT Restore(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags
|
|
);
|
|
|
|
HRESULT RestoreWithPassword(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags,
|
|
IN LPCTSTR lpszPassword
|
|
);
|
|
|
|
HRESULT EnumBackups(
|
|
OUT LPTSTR lpszBackupLocation,
|
|
OUT DWORD * pdwMDVersion,
|
|
OUT FILETIME * pftMDBackupTime,
|
|
IN DWORD dwIndex
|
|
);
|
|
|
|
HRESULT DeleteBackup(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion
|
|
);
|
|
|
|
protected:
|
|
IMSAdminBase * m_pInterface;
|
|
|
|
private:
|
|
int m_iTimeOutValue;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CMetaKey : public CMetaInterface
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Metabase key wrapper class
|
|
|
|
Public Interface:
|
|
|
|
CMetaKey : Constructor
|
|
~CMetaKey : Destructor
|
|
|
|
Succeeded : TRUE if key opened successfully.
|
|
QueryResult : Get the HRESULT status
|
|
|
|
QueryValue : Various overloaded methods to get values
|
|
SetValue : Various overloaded methods to set values
|
|
DeleteValue : Delete a value
|
|
Open : Open key
|
|
ReOpen : Re key that was opened before
|
|
Close : Close key
|
|
ConvertToParentPath : Change path to parent path
|
|
|
|
operator METADATA_HANDLE : Cast to a metadata handle
|
|
operator LPCTSTR : Cast to the metabase path
|
|
operator BOOL : Cast to TRUE if the key is open, FALSE if not
|
|
|
|
GetHandle : Obtain metadata handle
|
|
IsOpen : TRUE if a key is open
|
|
QueryMetaPath : Get the relative metabase path
|
|
QueryFlags : Get the open permissions
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
//
|
|
// Null constructor that only creates the interface.
|
|
// A key constructed this way may read from META_ROOT_HANDLE.
|
|
// This is not true of other constructors.
|
|
//
|
|
CMetaKey(
|
|
IN CComAuthInfo * pServer
|
|
);
|
|
|
|
//
|
|
// As above, using an existing interface
|
|
//
|
|
CMetaKey(
|
|
IN CMetaInterface * pInterface
|
|
);
|
|
|
|
//
|
|
// Fully defined constructor that opens a key
|
|
//
|
|
CMetaKey(
|
|
IN CComAuthInfo * pServer,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwFlags = METADATA_PERMISSION_READ,
|
|
IN METADATA_HANDLE hkBase = METADATA_MASTER_ROOT_HANDLE
|
|
);
|
|
|
|
//
|
|
// As above, using an existing interface
|
|
//
|
|
CMetaKey(
|
|
IN CMetaInterface * pInterface,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwFlags = METADATA_PERMISSION_READ,
|
|
IN METADATA_HANDLE hkBase = METADATA_MASTER_ROOT_HANDLE
|
|
);
|
|
|
|
//
|
|
// Copy constructor, might or might not own the key
|
|
//
|
|
CMetaKey(
|
|
IN BOOL fOwnKey,
|
|
IN CMetaKey * pKey
|
|
);
|
|
|
|
//
|
|
// Destructor -- closes key.
|
|
//
|
|
virtual ~CMetaKey();
|
|
|
|
//
|
|
// Interface
|
|
//
|
|
public:
|
|
//
|
|
// Fetch a DWORD
|
|
//
|
|
HRESULT QueryValue(
|
|
IN DWORD dwID,
|
|
OUT DWORD & dwValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Fetch a boolean
|
|
//
|
|
HRESULT QueryValue(
|
|
IN DWORD dwID,
|
|
OUT BOOL & fValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Fetch a string
|
|
//
|
|
HRESULT QueryValue(
|
|
IN DWORD dwID,
|
|
OUT CString & strValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Fetch a BSTR
|
|
//
|
|
HRESULT QueryValue(
|
|
IN DWORD dwID,
|
|
OUT CComBSTR & strValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Fetch a string list
|
|
//
|
|
HRESULT QueryValue(
|
|
IN DWORD dwID,
|
|
OUT CStringListEx & strlValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Fetch binary blob
|
|
//
|
|
HRESULT QueryValue(
|
|
IN DWORD dwID,
|
|
OUT CBlob & blValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Store a DWORD
|
|
//
|
|
HRESULT SetValue(
|
|
IN DWORD dwID,
|
|
IN DWORD dwValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Store a BOOL
|
|
//
|
|
HRESULT SetValue(
|
|
IN DWORD dwID,
|
|
IN BOOL fValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Store a string
|
|
//
|
|
HRESULT SetValue(
|
|
IN DWORD dwID,
|
|
IN CString & strValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Store a BSTR
|
|
//
|
|
HRESULT SetValue(
|
|
IN DWORD dwID,
|
|
IN CComBSTR & strValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
|
|
//
|
|
// Store a stringlist
|
|
//
|
|
HRESULT SetValue(
|
|
IN DWORD dwID,
|
|
IN CStringListEx & strlValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Store a binary blob
|
|
//
|
|
HRESULT SetValue(
|
|
IN DWORD dwID,
|
|
IN CBlob & blValue,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Delete Value:
|
|
//
|
|
HRESULT DeleteValue(
|
|
IN DWORD dwID,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Check for path existance
|
|
//
|
|
HRESULT DoesPathExist(
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
//
|
|
// Create current path (which we attempted to open, and got
|
|
// a path not found error on).
|
|
//
|
|
HRESULT CreatePathFromFailedOpen();
|
|
|
|
//
|
|
// Check for descendant overrides
|
|
//
|
|
HRESULT CheckDescendants(
|
|
IN DWORD dwID,
|
|
IN CComAuthInfo * pServer,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Open key
|
|
//
|
|
HRESULT Open(
|
|
IN DWORD dwFlags,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
IN METADATA_HANDLE hkBase = METADATA_MASTER_ROOT_HANDLE
|
|
);
|
|
|
|
//
|
|
// Re-open previously opened key
|
|
//
|
|
HRESULT ReOpen(
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
//
|
|
// As above using the same permissions as before
|
|
//
|
|
HRESULT ReOpen();
|
|
|
|
//
|
|
// Open the parent object
|
|
//
|
|
HRESULT ConvertToParentPath(
|
|
IN BOOL fImmediate
|
|
);
|
|
|
|
//
|
|
// Close key, set it to NULL, but doesn't destroy the interface
|
|
//
|
|
HRESULT Close();
|
|
|
|
//
|
|
// Add key
|
|
//
|
|
HRESULT AddKey(
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
//
|
|
// Delete key off currently open key
|
|
//
|
|
HRESULT DeleteKey(
|
|
IN LPCTSTR lpszMDPath
|
|
);
|
|
|
|
//
|
|
// Rename key off currently open key
|
|
//
|
|
HRESULT RenameKey(
|
|
IN LPCTSTR lpszMDPath,
|
|
IN LPCTSTR lpszNewName
|
|
);
|
|
|
|
//
|
|
// Get list of descendant nodes that override
|
|
// a specific value
|
|
//
|
|
HRESULT GetDataPaths(
|
|
OUT CStringListEx & strlNodes,
|
|
IN DWORD dwMDIdentifier,
|
|
IN DWORD dwMDDataType,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
|
|
//
|
|
// Access
|
|
//
|
|
public:
|
|
METADATA_HANDLE GetHandle() const { return m_hKey; }
|
|
METADATA_HANDLE GetBase() const { return m_hBase; }
|
|
LPCTSTR QueryMetaPath() const { return m_strMetaPath; }
|
|
DWORD QueryFlags() const { return m_dwFlags; }
|
|
BOOL IsOpen() const { return m_hKey != NULL; }
|
|
BOOL IsHomeDirectoryPath() const ;
|
|
|
|
//
|
|
// Conversion operators
|
|
//
|
|
public:
|
|
operator METADATA_HANDLE() const { return GetHandle(); }
|
|
operator LPCTSTR() const { return QueryMetaPath(); }
|
|
operator BOOL() const { return IsOpen(); }
|
|
|
|
//
|
|
// Virtual Interface:
|
|
//
|
|
public:
|
|
virtual BOOL Succeeded() const;
|
|
virtual HRESULT QueryResult() const;
|
|
|
|
//
|
|
// Protected members
|
|
//
|
|
protected:
|
|
//
|
|
// Get data
|
|
//
|
|
HRESULT GetPropertyValue(
|
|
IN DWORD dwID,
|
|
OUT IN DWORD & dwSize,
|
|
OUT IN void *& pvData,
|
|
OUT IN DWORD * pdwDataType = NULL,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
OUT DWORD * pdwAttributes = NULL
|
|
);
|
|
|
|
//
|
|
// Store data
|
|
//
|
|
HRESULT SetPropertyValue(
|
|
IN DWORD dwID,
|
|
IN DWORD dwSize,
|
|
IN void * pvData,
|
|
IN BOOL * pfInheritanceOverride = NULL,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Get All Data off the open key
|
|
//
|
|
HRESULT GetAllData(
|
|
IN DWORD dwMDAttributes,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType,
|
|
OUT DWORD * pdwMDNumEntries,
|
|
OUT DWORD * pdwMDDataLen,
|
|
OUT PBYTE * ppbMDData,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Property Table Methods
|
|
//
|
|
protected:
|
|
//
|
|
// Metabase table entry definition
|
|
//
|
|
typedef struct tagMDFIELDDEF
|
|
{
|
|
DWORD dwMDIdentifier;
|
|
DWORD dwMDAttributes;
|
|
DWORD dwMDUserType;
|
|
DWORD dwMDDataType;
|
|
UINT uStringID;
|
|
} MDFIELDDEF;
|
|
|
|
static const MDFIELDDEF s_rgMetaTable[];
|
|
|
|
//
|
|
// CODEWORK: Ideally, these should be protected, but are used
|
|
// by idlg.
|
|
//
|
|
public:
|
|
static BOOL GetMDFieldDef(
|
|
IN DWORD dwID,
|
|
OUT DWORD & dwMDIdentifier,
|
|
OUT DWORD & dwMDAttributes,
|
|
OUT DWORD & dwMDUserType,
|
|
OUT DWORD & dwMDDataType
|
|
);
|
|
|
|
//
|
|
// Map metabase ID value to table index
|
|
//
|
|
static int MapMDIDToTableIndex(
|
|
IN DWORD dwID
|
|
);
|
|
|
|
//
|
|
// Allow limited access to the table
|
|
//
|
|
public:
|
|
static BOOL IsPropertyInheritable(
|
|
IN DWORD dwID
|
|
);
|
|
|
|
static BOOL GetPropertyDescription(
|
|
IN DWORD dwID,
|
|
OUT CString & strName
|
|
);
|
|
|
|
protected:
|
|
BOOL m_fAllowRootOperations;
|
|
BOOL m_fOwnKey;
|
|
DWORD m_cbInitialBufferSize;
|
|
DWORD m_dwFlags;
|
|
HRESULT m_hrKey;
|
|
CString m_strMetaPath;
|
|
METADATA_HANDLE m_hKey;
|
|
METADATA_HANDLE m_hBase;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CWamInterface : public CIISInterface
|
|
/*++
|
|
|
|
Class description:
|
|
|
|
WAM interface class
|
|
|
|
Virtual Interface:
|
|
|
|
Succeeded : Return TRUE if item constructed successfully
|
|
QueryResult : Return construction error code
|
|
|
|
Public Interface:
|
|
|
|
SupportsPooledProc : Check to see if pooled out of proc is supported.
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// App Protection States:
|
|
//
|
|
public:
|
|
enum
|
|
{
|
|
//
|
|
// Note: order must match MD_APP_ISOLATED values
|
|
//
|
|
APP_INPROC,
|
|
APP_OUTOFPROC,
|
|
APP_POOLEDPROC,
|
|
};
|
|
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
//
|
|
// Destructor destroys the interface
|
|
//
|
|
virtual ~CWamInterface();
|
|
|
|
protected:
|
|
//
|
|
// Fully defined constructor that creates the interface.
|
|
// Use NULL to create the interface on the local computer
|
|
//
|
|
CWamInterface(
|
|
IN CComAuthInfo * pServer
|
|
);
|
|
|
|
//
|
|
// Construct from existing interface.
|
|
//
|
|
CWamInterface(
|
|
IN CWamInterface * pInterface
|
|
);
|
|
|
|
//
|
|
// Access
|
|
//
|
|
public:
|
|
BOOL SupportsPooledProc() const { return m_fSupportsPooledProc; }
|
|
|
|
protected:
|
|
virtual HRESULT ApplyProxyBlanket();
|
|
|
|
//
|
|
// Create a wam object in this server. This function initializes the
|
|
// object with DCOM.
|
|
//
|
|
HRESULT Create();
|
|
|
|
//
|
|
// Make sure the interface has been created
|
|
//
|
|
BOOL HasInterface() const { return m_pInterface != NULL; }
|
|
|
|
//
|
|
// IWAM Interface
|
|
//
|
|
protected:
|
|
HRESULT AppCreate(
|
|
IN LPCTSTR szMDPath,
|
|
IN DWORD dwAppProtection
|
|
);
|
|
|
|
HRESULT AppDelete(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
);
|
|
|
|
HRESULT AppUnLoad(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
);
|
|
|
|
HRESULT AppGetStatus(
|
|
IN LPCTSTR szMDPath,
|
|
OUT DWORD * pdwAppStatus
|
|
);
|
|
|
|
HRESULT AppDeleteRecoverable(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
);
|
|
|
|
HRESULT AppRecover(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
);
|
|
|
|
//
|
|
// IIISApplicationAdmin interface
|
|
//
|
|
HRESULT CreateApplication(
|
|
LPCWSTR szMDPath,
|
|
DWORD dwAppMode,
|
|
LPCWSTR szAppPoolId,
|
|
BOOL fCreatePool
|
|
);
|
|
|
|
HRESULT DeleteApplication(
|
|
LPCWSTR szMDPath,
|
|
BOOL fRecursive
|
|
);
|
|
|
|
HRESULT CreateApplicationPool(
|
|
LPCWSTR szMDPath
|
|
);
|
|
|
|
HRESULT DeleteApplicationPool(
|
|
LPCWSTR szMDPath
|
|
);
|
|
|
|
HRESULT RecycleApplicationPool(
|
|
LPCWSTR szMDPath
|
|
);
|
|
|
|
HRESULT EnumerateApplicationsInPool(
|
|
LPCWSTR szMDPath,
|
|
BSTR *pbstr
|
|
);
|
|
|
|
HRESULT GetProcessMode(
|
|
DWORD * pdwMode
|
|
);
|
|
|
|
protected:
|
|
IWamAdmin * m_pInterface;
|
|
|
|
private:
|
|
BOOL m_fSupportsPooledProc;
|
|
};
|
|
|
|
class COMDLL CMetaBack : public CMetaInterface, public CWamInterface
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Metabase backup/restore class
|
|
|
|
Virtual Interface:
|
|
|
|
Succeeded : Return TRUE if item constructed successfully
|
|
QueryResult : Return construction error code
|
|
|
|
Public Interface:
|
|
|
|
Reset : Enum first existing backup
|
|
Next : Enum next existing backup
|
|
Backup : Create new backup
|
|
Delete : Delete existing backup
|
|
Restore : Restore from existing backup
|
|
|
|
--*/
|
|
{
|
|
public:
|
|
//
|
|
// Construct and create the interfaces. Use NULL to create
|
|
// on the local computer.
|
|
//
|
|
CMetaBack(
|
|
IN CComAuthInfo * pServer
|
|
);
|
|
|
|
//
|
|
// Virtual Interface
|
|
//
|
|
public:
|
|
virtual BOOL Succeeded() const;
|
|
virtual HRESULT QueryResult() const;
|
|
|
|
//
|
|
// Interface
|
|
//
|
|
public:
|
|
//
|
|
// Reset counter
|
|
//
|
|
void Reset() { m_dwIndex = 0L; }
|
|
|
|
HRESULT Next(
|
|
OUT DWORD * pdwVersion,
|
|
OUT LPTSTR lpszLocation,
|
|
OUT FILETIME * pftBackupTime
|
|
);
|
|
|
|
HRESULT Backup(
|
|
IN LPCTSTR lpszLocation
|
|
);
|
|
|
|
HRESULT BackupWithPassword(
|
|
IN LPCTSTR lpszLocation,
|
|
IN LPCTSTR lpszPassword
|
|
);
|
|
|
|
HRESULT Delete(
|
|
IN LPCTSTR lpszLocation,
|
|
IN DWORD dwVersion
|
|
);
|
|
|
|
HRESULT Restore(
|
|
IN LPCTSTR lpszLocation,
|
|
IN DWORD dwVersion
|
|
);
|
|
|
|
HRESULT RestoreWithPassword(
|
|
IN LPCTSTR lpszLocation,
|
|
IN DWORD dwVersion,
|
|
IN LPCTSTR lpszPassword
|
|
);
|
|
|
|
protected:
|
|
virtual HRESULT ApplyProxyBlanket();
|
|
|
|
protected:
|
|
static const LPCTSTR s_szMasterAppRoot;
|
|
|
|
private:
|
|
DWORD m_dwIndex;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CMetaEnumerator : public CMetaKey
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Metabase key enumerator
|
|
|
|
Public Interface:
|
|
|
|
CMetaEnumerator : Constructor
|
|
|
|
Reset : Reset the enumerator
|
|
Next : Get next key
|
|
|
|
--*/
|
|
{
|
|
public:
|
|
//
|
|
// Constructor creates a new interface and opens a key
|
|
//
|
|
CMetaEnumerator(
|
|
IN CComAuthInfo * pServer,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
IN METADATA_HANDLE hkBase = METADATA_MASTER_ROOT_HANDLE
|
|
);
|
|
|
|
//
|
|
// Constructor which uses an existing interface and opens
|
|
// a new key
|
|
//
|
|
CMetaEnumerator(
|
|
IN CMetaInterface * pInterface,
|
|
IN LPCTSTR lpszMDPath = NULL,
|
|
IN METADATA_HANDLE hkBase = METADATA_MASTER_ROOT_HANDLE
|
|
);
|
|
|
|
//
|
|
// Constructor which uses an open key
|
|
//
|
|
CMetaEnumerator(
|
|
IN BOOL fOwnKey,
|
|
IN CMetaKey * pKey
|
|
);
|
|
|
|
//
|
|
// Interface:
|
|
//
|
|
public:
|
|
//
|
|
// Reset counter
|
|
//
|
|
void Reset() { m_dwIndex = 0L; }
|
|
|
|
//
|
|
// Get next key as string.
|
|
//
|
|
HRESULT Next(
|
|
OUT CString & strKey,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
//
|
|
// Get next key as a DWORD (numeric keys only)
|
|
//
|
|
HRESULT Next(
|
|
OUT DWORD & dwKey,
|
|
OUT CString & strKey,
|
|
IN LPCTSTR lpszMDPath = NULL
|
|
);
|
|
|
|
private:
|
|
DWORD m_dwIndex;
|
|
};
|
|
|
|
|
|
|
|
class COMDLL CIISApplication : public CWamInterface, public CMetaKey
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
IIS Application class
|
|
|
|
Virtual Interface:
|
|
|
|
Succeeded : Return TRUE if item constructed successfully
|
|
QueryResult : Return construction error code
|
|
|
|
Public Interface:
|
|
|
|
RefreshState : Refresh application state
|
|
QueryAppState : Return current application state
|
|
IsEnabledApplication: Return TRUE if appplication is enabled.
|
|
Create : Create app
|
|
Delete : Delete app
|
|
Unload : Unload app
|
|
DeleteRecoverable : Delete w. recovery allowed
|
|
Recover : Recover
|
|
WriteFriendlyName : Write friendly name to metabase
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
CIISApplication(
|
|
IN CComAuthInfo * pServer,
|
|
IN LPCTSTR lpszMetapath
|
|
);
|
|
|
|
//
|
|
// Virtual Interface:
|
|
//
|
|
public:
|
|
virtual BOOL Succeeded() const;
|
|
virtual HRESULT QueryResult() const;
|
|
|
|
//
|
|
// Interface
|
|
//
|
|
public:
|
|
DWORD QueryAppState() const { return m_dwAppState; }
|
|
LPCTSTR QueryWamPath() const { return m_strWamPath; }
|
|
BOOL IsEnabledApplication() const;
|
|
HRESULT RefreshAppState();
|
|
HRESULT Create(LPCTSTR lpszName, DWORD dwAppProtection);
|
|
HRESULT CreatePooled(LPCTSTR lpszName, DWORD dwAppMode,
|
|
LPCTSTR pool_id, BOOL fCreatePool = FALSE);
|
|
HRESULT Delete(BOOL fRecursive = FALSE);
|
|
HRESULT Unload(BOOL fRecursive = FALSE);
|
|
HRESULT DeleteRecoverable(BOOL fRecursive = FALSE);
|
|
HRESULT Recover(BOOL fRecursive = FALSE);
|
|
HRESULT WriteFriendlyName(LPCTSTR lpszName);
|
|
HRESULT WritePoolId(LPCTSTR id);
|
|
|
|
public:
|
|
BOOL IsInproc() const { return m_dwProcessProtection == APP_INPROC; }
|
|
BOOL IsOutOfProc() const { return m_dwProcessProtection == APP_OUTOFPROC; }
|
|
BOOL IsPooledProc() const { return m_dwProcessProtection == APP_POOLEDPROC; }
|
|
|
|
public:
|
|
DWORD m_dwProcessProtection;
|
|
CString m_strAppPoolId;
|
|
CString m_strFriendlyName;
|
|
CString m_strAppRoot;
|
|
|
|
protected:
|
|
void CommonConstruct();
|
|
|
|
private:
|
|
DWORD m_dwAppState;
|
|
CString m_strWamPath;
|
|
HRESULT m_hrApp;
|
|
};
|
|
|
|
class COMDLL CIISAppPool : public CWamInterface, public CMetaKey
|
|
{
|
|
public:
|
|
CIISAppPool(
|
|
IN CComAuthInfo * pServer,
|
|
IN LPCTSTR lpszMetapath = NULL
|
|
);
|
|
//
|
|
// Virtual Interface:
|
|
//
|
|
public:
|
|
virtual BOOL Succeeded() const;
|
|
virtual HRESULT QueryResult() const;
|
|
|
|
//
|
|
// Interface
|
|
//
|
|
public:
|
|
HRESULT RefreshState();
|
|
DWORD QueryPoolState() const { return m_dwPoolState; }
|
|
LPCTSTR QueryWamPath() const { return m_strWamPath; }
|
|
HRESULT Create(LPCTSTR lpszName = NULL);
|
|
HRESULT Delete(LPCTSTR id);
|
|
HRESULT WriteFriendlyName(LPCTSTR lpszName);
|
|
HRESULT EnumerateApplications(CStringListEx& list);
|
|
|
|
public:
|
|
CString m_strAppPoolId;
|
|
CString m_strFriendlyName;
|
|
|
|
private:
|
|
DWORD m_dwPoolState;
|
|
CString m_strWamPath;
|
|
HRESULT m_hrPool;
|
|
};
|
|
|
|
class COMDLL CIISSvcControl : public CIISInterface
|
|
/*++
|
|
|
|
Class description:
|
|
|
|
IIS Service control
|
|
|
|
Virtual Interface:
|
|
|
|
Succeeded : Return TRUE if item constructed successfully
|
|
QueryResult : Return construction error code
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Constructor/Destructor
|
|
//
|
|
public:
|
|
//
|
|
// Fully defined constructor that creates the interface.
|
|
// Use NULL to create the interface on the local computer
|
|
//
|
|
CIISSvcControl(
|
|
IN CComAuthInfo * pServer
|
|
);
|
|
|
|
//
|
|
// Construct from existing interface.
|
|
//
|
|
CIISSvcControl(
|
|
IN CIISSvcControl * pInterface
|
|
);
|
|
|
|
//
|
|
// Destructor destroys the interface
|
|
//
|
|
virtual ~CIISSvcControl();
|
|
|
|
protected:
|
|
//
|
|
// Create an object in this server. This function initializes the
|
|
// object with DCOM.
|
|
//
|
|
HRESULT Create();
|
|
|
|
//
|
|
// Make sure the interface has been created
|
|
//
|
|
BOOL HasInterface() const { return m_pInterface != NULL; }
|
|
|
|
//
|
|
// Interface
|
|
//
|
|
public:
|
|
//
|
|
// Stop services
|
|
//
|
|
HRESULT Stop(
|
|
IN DWORD dwTimeoutMsecs,
|
|
IN BOOL fForce
|
|
);
|
|
|
|
//
|
|
// Start services
|
|
//
|
|
HRESULT Start(
|
|
IN DWORD dwTimeoutMsecs
|
|
);
|
|
|
|
//
|
|
// Reboot
|
|
//
|
|
HRESULT Reboot(
|
|
IN DWORD dwTimeouMsecs,
|
|
IN BOOL fForceAppsClosed
|
|
);
|
|
|
|
//
|
|
// Status
|
|
//
|
|
HRESULT Status(
|
|
IN DWORD dwBufferSize,
|
|
OUT LPBYTE pbBuffer,
|
|
OUT DWORD * MDRequiredBufferSize,
|
|
OUT DWORD * pdwNumServices
|
|
);
|
|
|
|
//
|
|
// Kill
|
|
//
|
|
HRESULT Kill();
|
|
|
|
protected:
|
|
virtual HRESULT ApplyProxyBlanket();
|
|
|
|
protected:
|
|
IIisServiceControl * m_pInterface;
|
|
};
|
|
|
|
|
|
//
|
|
// Inline Expansion
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
inline void CComAuthInfo::StorePassword(LPCOLESTR lpszPassword)
|
|
{
|
|
m_bstrPassword = lpszPassword;
|
|
}
|
|
|
|
inline /* virtual */ HRESULT CIISInterface::ChangeProxyBlanket(
|
|
IN LPCOLESTR lpszUserName,
|
|
IN LPCOLESTR lpszPassword
|
|
)
|
|
{
|
|
m_auth.SetImpersonation(lpszUserName, lpszPassword);
|
|
return ApplyProxyBlanket();
|
|
}
|
|
|
|
inline /*static */ LPCTSTR CMetabasePath::GetMachinePath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder
|
|
)
|
|
{
|
|
return TruncatePath(iMachine, lpszMDPath, strNewPath, pstrRemainder);
|
|
}
|
|
|
|
inline /* static */ LPCTSTR CMetabasePath::GetServicePath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder
|
|
)
|
|
{
|
|
return TruncatePath(iService, lpszMDPath, strNewPath, pstrRemainder);
|
|
}
|
|
|
|
inline /* static */ LPCTSTR CMetabasePath::GetInstancePath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder
|
|
)
|
|
{
|
|
return TruncatePath(iInstance, lpszMDPath, strNewPath, pstrRemainder);
|
|
}
|
|
|
|
inline /* static */ LPCTSTR CMetabasePath::GetRootPath(
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT CString & strNewPath,
|
|
OUT CString * pstrRemainder
|
|
)
|
|
{
|
|
return TruncatePath(iRootDirectory, lpszMDPath, strNewPath, pstrRemainder);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::Create()
|
|
{
|
|
return CIISInterface::Create(
|
|
1,
|
|
&IID_IMSAdminBase,
|
|
&CLSID_MSAdminBase,
|
|
NULL,
|
|
(IUnknown **)&m_pInterface
|
|
);
|
|
}
|
|
|
|
inline /* virtual */ HRESULT CMetaInterface::ApplyProxyBlanket()
|
|
{
|
|
return m_auth.ApplyProxyBlanket(m_pInterface);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::OpenKey(
|
|
IN METADATA_HANDLE hkBase,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwFlags,
|
|
OUT METADATA_HANDLE * phMDNewHandle
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->OpenKey(
|
|
hkBase,
|
|
lpszMDPath,
|
|
dwFlags,
|
|
m_iTimeOutValue,
|
|
phMDNewHandle
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::CloseKey(
|
|
IN METADATA_HANDLE hKey
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->CloseKey(hKey);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::SetLastChangeTime(
|
|
IN METADATA_HANDLE hMDHandle,
|
|
IN LPCTSTR pszMDPath,
|
|
IN FILETIME * pftMDLastChangeTime,
|
|
IN BOOL bLocalTime
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->SetLastChangeTime(
|
|
hMDHandle,
|
|
pszMDPath,
|
|
pftMDLastChangeTime,
|
|
bLocalTime
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::GetLastChangeTime(
|
|
IN METADATA_HANDLE hMDHandle,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT FILETIME * pftMDLastChangeTime,
|
|
IN BOOL bLocalTime
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->GetLastChangeTime(
|
|
hMDHandle,
|
|
lpszMDPath,
|
|
pftMDLastChangeTime,
|
|
bLocalTime
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::AddKey(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->AddKey(hKey, lpszMDPath);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::DeleteKey(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->DeleteKey(hKey, lpszMDPath);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::DeleteChildKeys(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->DeleteChildKeys(hKey, lpszMDPath);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::EnumKeys(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT LPTSTR lpszMDName,
|
|
IN DWORD dwIndex
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->EnumKeys(hKey, lpszMDPath, lpszMDName, dwIndex);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::CopyKey(
|
|
IN METADATA_HANDLE hSourceKey,
|
|
IN LPCTSTR lpszMDSourcePath,
|
|
IN METADATA_HANDLE hDestKey,
|
|
IN LPCTSTR lpszMDDestPath,
|
|
IN BOOL fOverwrite,
|
|
IN BOOL fCopy
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->CopyKey(
|
|
hSourceKey,
|
|
lpszMDSourcePath,
|
|
hDestKey,
|
|
lpszMDDestPath,
|
|
fOverwrite,
|
|
fCopy
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::RenameKey(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN LPCTSTR lpszNewName
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->RenameKey(hKey, lpszMDPath, lpszNewName);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::GetData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT METADATA_RECORD * pmdRecord,
|
|
OUT DWORD * pdwRequiredDataLen
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->GetData(
|
|
hKey,
|
|
lpszMDPath,
|
|
pmdRecord,
|
|
pdwRequiredDataLen
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::SetData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN METADATA_RECORD * pmdRecord
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->SetData(
|
|
hKey,
|
|
lpszMDPath,
|
|
pmdRecord
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::DeleteData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDIdentifier,
|
|
IN DWORD dwMDDataType
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->DeleteData(
|
|
hKey,
|
|
lpszMDPath,
|
|
dwMDIdentifier,
|
|
dwMDDataType
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::EnumData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT METADATA_RECORD * pmdRecord,
|
|
IN DWORD dwIndex,
|
|
OUT DWORD * pdwRequiredDataLen
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->EnumData(
|
|
hKey,
|
|
lpszMDPath,
|
|
pmdRecord,
|
|
dwIndex,
|
|
pdwRequiredDataLen
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::GetAllData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDAttributes,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType,
|
|
OUT DWORD * pdwMDNumDataEntries,
|
|
OUT DWORD * pdwMDDataSetNumber,
|
|
IN DWORD dwMDBufferSize,
|
|
OUT LPBYTE pbMDBuffer,
|
|
OUT DWORD * pdwRequiredBufferSize
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->GetAllData(
|
|
hKey,
|
|
lpszMDPath,
|
|
dwMDAttributes,
|
|
dwMDUserType,
|
|
dwMDDataType,
|
|
pdwMDNumDataEntries,
|
|
pdwMDDataSetNumber,
|
|
dwMDBufferSize,
|
|
pbMDBuffer,
|
|
pdwRequiredBufferSize
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::DeleteAllData(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->DeleteAllData(
|
|
hKey,
|
|
lpszMDPath,
|
|
dwMDUserType,
|
|
dwMDDataType
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::CopyData(
|
|
IN METADATA_HANDLE hMDSourceKey,
|
|
IN LPCTSTR lpszMDSourcePath,
|
|
IN METADATA_HANDLE hMDDestKey,
|
|
IN LPCTSTR lpszMDDestPath,
|
|
IN DWORD dwMDAttributes,
|
|
IN DWORD dwMDUserType,
|
|
IN DWORD dwMDDataType,
|
|
IN BOOL fCopy
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->CopyData(
|
|
hMDSourceKey,
|
|
lpszMDSourcePath,
|
|
hMDDestKey,
|
|
lpszMDDestPath,
|
|
dwMDAttributes,
|
|
dwMDUserType,
|
|
dwMDDataType,
|
|
fCopy
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::GetDataPaths(
|
|
IN METADATA_HANDLE hKey,
|
|
IN LPCTSTR lpszMDPath,
|
|
IN DWORD dwMDIdentifier,
|
|
IN DWORD dwMDDataType,
|
|
IN DWORD dwMDBufferSize,
|
|
OUT LPTSTR lpszBuffer,
|
|
OUT DWORD * pdwMDRequiredBufferSize
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->GetDataPaths(
|
|
hKey,
|
|
lpszMDPath,
|
|
dwMDIdentifier,
|
|
dwMDDataType,
|
|
dwMDBufferSize,
|
|
lpszBuffer,
|
|
pdwMDRequiredBufferSize
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::Backup(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Backup(lpszBackupLocation, dwMDVersion, dwMDFlags);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::BackupWithPassword(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags,
|
|
IN LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
ASSERT(m_pInterface != NULL);
|
|
HRESULT hr = S_OK;
|
|
IMSAdminBase2 * pInterface2 = NULL;
|
|
if (SUCCEEDED(hr = m_pInterface->QueryInterface(IID_IMSAdminBase2, (void **)&pInterface2)))
|
|
{
|
|
hr = pInterface2->BackupWithPasswd(lpszBackupLocation, dwMDVersion, dwMDFlags, lpszPassword);
|
|
pInterface2->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::Restore(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Restore(lpszBackupLocation, dwMDVersion, dwMDFlags);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::RestoreWithPassword(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion,
|
|
IN DWORD dwMDFlags,
|
|
IN LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
ASSERT(m_pInterface != NULL);
|
|
HRESULT hr = S_OK;
|
|
IMSAdminBase2 * pInterface2 = NULL;
|
|
if (SUCCEEDED(hr = m_pInterface->QueryInterface(IID_IMSAdminBase2, (void **)&pInterface2)))
|
|
{
|
|
hr = pInterface2->RestoreWithPasswd(lpszBackupLocation, dwMDVersion, dwMDFlags, lpszPassword);
|
|
pInterface2->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::EnumBackups(
|
|
OUT LPTSTR lpszBackupLocation,
|
|
OUT DWORD * pdwMDVersion,
|
|
OUT FILETIME * pftMDBackupTime,
|
|
IN DWORD dwIndex
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->EnumBackups(
|
|
lpszBackupLocation,
|
|
pdwMDVersion,
|
|
pftMDBackupTime,
|
|
dwIndex
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaInterface::DeleteBackup(
|
|
IN LPCTSTR lpszBackupLocation,
|
|
IN DWORD dwMDVersion
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->DeleteBackup(lpszBackupLocation, dwMDVersion);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::AddKey(
|
|
IN LPCTSTR lpszMDPath
|
|
)
|
|
{
|
|
return CMetaInterface::AddKey(m_hKey, lpszMDPath);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::DeleteKey(
|
|
IN LPCTSTR lpszMDPath
|
|
)
|
|
{
|
|
return CMetaInterface::DeleteKey(m_hKey, lpszMDPath);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::RenameKey(
|
|
IN LPCTSTR lpszMDPath,
|
|
IN LPCTSTR lpszNewName
|
|
)
|
|
{
|
|
return CMetaInterface::RenameKey(m_hKey, lpszMDPath, lpszNewName);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::ReOpen()
|
|
{
|
|
return Open(m_dwFlags, m_strMetaPath, m_hBase);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::ReOpen(DWORD dwFlags)
|
|
{
|
|
return Open(dwFlags, m_strMetaPath, m_hBase);
|
|
}
|
|
|
|
inline BOOL CMetaKey::IsHomeDirectoryPath() const
|
|
{
|
|
return CMetabasePath::IsHomeDirectoryPath(m_strMetaPath);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::QueryValue(
|
|
IN DWORD dwID,
|
|
OUT BOOL & fValue,
|
|
IN BOOL * pfInheritanceOverride,
|
|
IN LPCTSTR lpszMDPath,
|
|
OUT DWORD * pdwAttributes
|
|
)
|
|
{
|
|
ASSERT(sizeof(DWORD) == sizeof(BOOL));
|
|
return CMetaKey::QueryValue(
|
|
dwID,
|
|
(DWORD &)fValue,
|
|
pfInheritanceOverride,
|
|
lpszMDPath,
|
|
pdwAttributes
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::SetValue(
|
|
IN DWORD dwID,
|
|
IN DWORD dwValue,
|
|
IN BOOL * pfInheritanceOverride, OPTIONAL
|
|
IN LPCTSTR lpszMDPath OPTIONAL
|
|
)
|
|
{
|
|
return SetPropertyValue(
|
|
dwID,
|
|
sizeof(dwValue),
|
|
&dwValue,
|
|
pfInheritanceOverride,
|
|
lpszMDPath
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::SetValue(
|
|
IN DWORD dwID,
|
|
IN BOOL fValue,
|
|
IN BOOL * pfInheritanceOverride,
|
|
IN LPCTSTR lpszMDPath
|
|
)
|
|
{
|
|
ASSERT(sizeof(DWORD) == sizeof(BOOL));
|
|
return CMetaKey::SetValue(
|
|
dwID,
|
|
(DWORD)fValue,
|
|
pfInheritanceOverride,
|
|
lpszMDPath
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaKey::SetValue(
|
|
IN DWORD dwID,
|
|
IN CString & strValue,
|
|
IN BOOL * pfInheritanceOverride, OPTIONAL
|
|
IN LPCTSTR lpszMDPath OPTIONAL
|
|
)
|
|
{
|
|
return SetPropertyValue(
|
|
dwID,
|
|
(strValue.GetLength() + 1) * sizeof(TCHAR),
|
|
(void *)(LPCTSTR)strValue,
|
|
pfInheritanceOverride,
|
|
lpszMDPath
|
|
);
|
|
}
|
|
|
|
inline HRESULT CWamInterface::AppDelete(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->AppDelete(szMDPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CWamInterface::AppUnLoad(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->AppUnLoad(szMDPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CWamInterface::AppGetStatus(
|
|
IN LPCTSTR szMDPath,
|
|
OUT DWORD * pdwAppStatus
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->AppGetStatus(szMDPath, pdwAppStatus);
|
|
}
|
|
|
|
inline HRESULT CWamInterface::AppDeleteRecoverable(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->AppDeleteRecoverable(szMDPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CWamInterface::AppRecover(
|
|
IN LPCTSTR szMDPath,
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->AppRecover(szMDPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CWamInterface::CreateApplication(
|
|
LPCWSTR szMDPath,
|
|
DWORD dwAppMode,
|
|
LPCWSTR szAppPoolId,
|
|
BOOL fCreatePool
|
|
)
|
|
{
|
|
CComQIPtr<IIISApplicationAdmin, &IID_IIISApplicationAdmin> pAppAdmin = m_pInterface;
|
|
if (pAppAdmin != NULL)
|
|
{
|
|
return pAppAdmin->CreateApplication(
|
|
szMDPath, dwAppMode, szAppPoolId, fCreatePool);
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
inline HRESULT CWamInterface::DeleteApplication(
|
|
LPCWSTR szMDPath,
|
|
BOOL fRecursive
|
|
)
|
|
{
|
|
CComQIPtr<IIISApplicationAdmin, &IID_IIISApplicationAdmin> pAppAdmin = m_pInterface;
|
|
if (pAppAdmin != NULL)
|
|
{
|
|
return pAppAdmin->DeleteApplication(szMDPath, fRecursive);
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
inline HRESULT CWamInterface::CreateApplicationPool(
|
|
LPCWSTR szMDPath
|
|
)
|
|
{
|
|
CComQIPtr<IIISApplicationAdmin, &IID_IIISApplicationAdmin> pAppAdmin = m_pInterface;
|
|
if (pAppAdmin != NULL)
|
|
{
|
|
return pAppAdmin->CreateApplicationPool(szMDPath);
|
|
}
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
inline HRESULT CWamInterface::DeleteApplicationPool(
|
|
LPCWSTR szMDPath
|
|
)
|
|
{
|
|
CComQIPtr<IIISApplicationAdmin, &IID_IIISApplicationAdmin> pAppAdmin = m_pInterface;
|
|
if (pAppAdmin != NULL)
|
|
{
|
|
return pAppAdmin->DeleteApplicationPool(szMDPath);
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
inline HRESULT CWamInterface::RecycleApplicationPool(
|
|
LPCWSTR szMDPath
|
|
)
|
|
{
|
|
CComQIPtr<IIISApplicationAdmin, &IID_IIISApplicationAdmin> pAppAdmin = m_pInterface;
|
|
if (pAppAdmin != NULL)
|
|
{
|
|
return pAppAdmin->RecycleApplicationPool(szMDPath);
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
inline HRESULT CWamInterface::EnumerateApplicationsInPool(
|
|
LPCTSTR szMDPath,
|
|
BSTR * pbstr)
|
|
{
|
|
IIISApplicationAdmin * pAppAdmin = NULL;
|
|
HRESULT hr = m_pInterface->QueryInterface(IID_IIISApplicationAdmin, (void **)&pAppAdmin);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pAppAdmin->EnumerateApplicationsInPool(
|
|
szMDPath, pbstr);
|
|
pAppAdmin->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
inline HRESULT CWamInterface::GetProcessMode(
|
|
DWORD * pdwMode
|
|
)
|
|
{
|
|
CComQIPtr<IIISApplicationAdmin, &IID_IIISApplicationAdmin> pAppAdmin = m_pInterface;
|
|
if (pAppAdmin != NULL)
|
|
{
|
|
return pAppAdmin->GetProcessMode(pdwMode);
|
|
}
|
|
else
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
inline /* virtual */ HRESULT CWamInterface::ApplyProxyBlanket()
|
|
{
|
|
return m_auth.ApplyProxyBlanket(m_pInterface);
|
|
}
|
|
|
|
////////////////////////////
|
|
|
|
inline /* virtual */ HRESULT CMetaBack::ApplyProxyBlanket()
|
|
{
|
|
HRESULT hr = CMetaInterface::ApplyProxyBlanket();
|
|
return SUCCEEDED(hr) ? CWamInterface::ApplyProxyBlanket() : hr;
|
|
}
|
|
|
|
inline HRESULT CMetaBack::Next(
|
|
OUT DWORD * pdwVersion,
|
|
OUT LPTSTR lpszLocation,
|
|
OUT FILETIME * pftBackupTime
|
|
)
|
|
{
|
|
return EnumBackups(
|
|
lpszLocation,
|
|
pdwVersion,
|
|
pftBackupTime,
|
|
m_dwIndex++
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaBack::Backup(
|
|
IN LPCTSTR lpszLocation
|
|
)
|
|
{
|
|
return CMetaInterface::Backup(
|
|
lpszLocation,
|
|
MD_BACKUP_NEXT_VERSION,
|
|
MD_BACKUP_SAVE_FIRST
|
|
);
|
|
}
|
|
|
|
inline HRESULT CMetaBack::Delete(
|
|
IN LPCTSTR lpszLocation,
|
|
IN DWORD dwVersion
|
|
)
|
|
{
|
|
return DeleteBackup(lpszLocation, dwVersion);
|
|
}
|
|
|
|
inline BOOL CIISApplication::IsEnabledApplication() const
|
|
{
|
|
return m_dwAppState == APPSTATUS_STOPPED
|
|
|| m_dwAppState == APPSTATUS_RUNNING;
|
|
}
|
|
|
|
inline HRESULT CIISApplication::Delete(
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT(!m_strWamPath.IsEmpty());
|
|
return AppDelete(m_strWamPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CIISApplication::Unload(
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT(!m_strWamPath.IsEmpty());
|
|
return AppUnLoad(m_strWamPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CIISApplication::DeleteRecoverable(
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT(!m_strWamPath.IsEmpty());
|
|
return AppDeleteRecoverable(m_strWamPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CIISApplication::Recover(
|
|
IN BOOL fRecursive
|
|
)
|
|
{
|
|
ASSERT(!m_strWamPath.IsEmpty());
|
|
return AppRecover(m_strWamPath, fRecursive);
|
|
}
|
|
|
|
inline HRESULT CIISSvcControl::Create()
|
|
{
|
|
return CIISInterface::Create(
|
|
1,
|
|
&IID_IIisServiceControl,
|
|
&CLSID_IisServiceControl,
|
|
NULL,
|
|
(IUnknown **)&m_pInterface
|
|
);
|
|
}
|
|
|
|
inline HRESULT CIISSvcControl::Stop(
|
|
IN DWORD dwTimeoutMsecs,
|
|
IN BOOL fForce
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Stop(dwTimeoutMsecs, (DWORD)fForce);
|
|
}
|
|
|
|
inline HRESULT CIISSvcControl::Start(
|
|
IN DWORD dwTimeoutMsecs
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Start(dwTimeoutMsecs);
|
|
}
|
|
|
|
inline HRESULT CIISSvcControl::Reboot(
|
|
IN DWORD dwTimeouMsecs,
|
|
IN BOOL fForceAppsClosed
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Reboot(dwTimeouMsecs, (DWORD)fForceAppsClosed);
|
|
}
|
|
|
|
inline HRESULT CIISSvcControl::Status(
|
|
IN DWORD dwBufferSize,
|
|
OUT LPBYTE pbBuffer,
|
|
OUT DWORD * MDRequiredBufferSize,
|
|
OUT DWORD * pdwNumServices
|
|
)
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Status(
|
|
dwBufferSize,
|
|
pbBuffer,
|
|
MDRequiredBufferSize,
|
|
pdwNumServices
|
|
);
|
|
}
|
|
|
|
inline HRESULT CIISSvcControl::Kill()
|
|
{
|
|
ASSERT_PTR(m_pInterface);
|
|
return m_pInterface->Kill();
|
|
}
|
|
|
|
inline /* virtual */ HRESULT CIISSvcControl::ApplyProxyBlanket()
|
|
{
|
|
return m_auth.ApplyProxyBlanket(m_pInterface);
|
|
}
|
|
|
|
#endif // _MDKEYS_H_
|