Source code of Windows XP (NT5)
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

/*++
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_