632 lines
12 KiB
C++
632 lines
12 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1997
|
|
//
|
|
// File: ccomp.cxx
|
|
//
|
|
// Contents: Contains methods for CIISComputer object
|
|
//
|
|
// History: 20-1-98 SophiaC Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "iisext.hxx"
|
|
#pragma hdrstop
|
|
|
|
|
|
// Class CIISComputer
|
|
|
|
DEFINE_IPrivateDispatch_Implementation(CIISComputer)
|
|
DEFINE_DELEGATING_IDispatch_Implementation(CIISComputer)
|
|
DEFINE_CONTAINED_IADs_Implementation(CIISComputer)
|
|
DEFINE_IADsExtension_Implementation(CIISComputer)
|
|
|
|
CIISComputer::CIISComputer():
|
|
_pUnkOuter(NULL),
|
|
_pADs(NULL),
|
|
_pszServerName(NULL),
|
|
_pszMetaBasePath(NULL),
|
|
_pAdminBase(NULL),
|
|
_pDispMgr(NULL),
|
|
_fDispInitialized(FALSE)
|
|
{
|
|
ENLIST_TRACKING(CIISComputer);
|
|
}
|
|
|
|
HRESULT
|
|
CIISComputer::CreateComputer(
|
|
IUnknown *pUnkOuter,
|
|
REFIID riid,
|
|
void **ppvObj
|
|
)
|
|
{
|
|
CCredentials Credentials;
|
|
CIISComputer FAR * pComputer = NULL;
|
|
HRESULT hr = S_OK;
|
|
BSTR bstrAdsPath = NULL;
|
|
OBJECTINFO ObjectInfo;
|
|
POBJECTINFO pObjectInfo = &ObjectInfo;
|
|
CLexer * pLexer = NULL;
|
|
LPWSTR pszIISPathName = NULL;
|
|
|
|
hr = AllocateComputerObject(pUnkOuter, Credentials, &pComputer);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// get ServerName and pszPath
|
|
//
|
|
|
|
hr = pComputer->_pADs->get_ADsPath(&bstrAdsPath);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pLexer = new CLexer();
|
|
hr = pLexer->Initialize(bstrAdsPath);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Parse the pathname
|
|
//
|
|
|
|
memset(pObjectInfo, 0, sizeof(OBJECTINFO));
|
|
hr = ADsObject(pLexer, pObjectInfo);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pszIISPathName = AllocADsStr(bstrAdsPath);
|
|
if (!pszIISPathName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
*pszIISPathName = L'\0';
|
|
hr = BuildIISPathFromADsPath(
|
|
pObjectInfo,
|
|
pszIISPathName
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pComputer->InitializeComputerObject(
|
|
pObjectInfo->TreeName,
|
|
pszIISPathName );
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// pass non-delegating IUnknown back to the aggregator
|
|
//
|
|
|
|
*ppvObj = (INonDelegatingUnknown FAR *) pComputer;
|
|
|
|
if (bstrAdsPath)
|
|
{
|
|
ADsFreeString(bstrAdsPath);
|
|
}
|
|
|
|
if (pLexer) {
|
|
delete pLexer;
|
|
}
|
|
|
|
if (pszIISPathName ) {
|
|
FreeADsStr( pszIISPathName );
|
|
}
|
|
|
|
FreeObjectInfo( &ObjectInfo );
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
if (bstrAdsPath) {
|
|
ADsFreeString(bstrAdsPath);
|
|
}
|
|
|
|
if (pLexer) {
|
|
delete pLexer;
|
|
}
|
|
|
|
if (pszIISPathName ) {
|
|
FreeADsStr( pszIISPathName );
|
|
}
|
|
|
|
FreeObjectInfo( &ObjectInfo );
|
|
|
|
*ppvObj = NULL;
|
|
|
|
delete pComputer;
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
CIISComputer::~CIISComputer( )
|
|
{
|
|
if (_pszServerName) {
|
|
FreeADsStr(_pszServerName);
|
|
}
|
|
|
|
if (_pszMetaBasePath) {
|
|
FreeADsStr(_pszMetaBasePath);
|
|
}
|
|
|
|
delete _pDispMgr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::QueryInterface(
|
|
REFIID iid,
|
|
LPVOID FAR* ppv
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = _pUnkOuter->QueryInterface(iid,ppv);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CIISComputer::AllocateComputerObject(
|
|
IUnknown *pUnkOuter,
|
|
CCredentials& Credentials,
|
|
CIISComputer ** ppComputer
|
|
)
|
|
{
|
|
CIISComputer FAR * pComputer = NULL;
|
|
IADs FAR * pADs = NULL;
|
|
CAggregateeDispMgr FAR * pDispMgr = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
pComputer = new CIISComputer();
|
|
if (pComputer == NULL) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pDispMgr = new CAggregateeDispMgr;
|
|
if (pDispMgr == NULL) {
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pDispMgr->LoadTypeInfoEntry(
|
|
LIBID_IISExt,
|
|
IID_IISComputer2,
|
|
(IISComputer2 *)pComputer,
|
|
DISPID_REGULAR
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// Store the IADs Pointer, but again do NOT ref-count
|
|
// this pointer - we keep the pointer around, but do
|
|
// a release immediately.
|
|
//
|
|
|
|
hr = pUnkOuter->QueryInterface(IID_IADs, (void **)&pADs);
|
|
pADs->Release();
|
|
pComputer->_pADs = pADs;
|
|
|
|
//
|
|
// Store the pointer to the pUnkOuter object
|
|
// AND DO NOT add ref this pointer
|
|
//
|
|
pComputer->_pUnkOuter = pUnkOuter;
|
|
|
|
pComputer->_Credentials = Credentials;
|
|
pComputer->_pDispMgr = pDispMgr;
|
|
*ppComputer = pComputer;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
delete pDispMgr;
|
|
delete pComputer;
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CIISComputer::InitializeComputerObject(
|
|
LPWSTR pszServerName,
|
|
LPWSTR pszPath
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (pszServerName) {
|
|
_pszServerName = AllocADsStr(pszServerName);
|
|
|
|
if (!_pszServerName) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
}
|
|
|
|
if (pszPath) {
|
|
_pszMetaBasePath = AllocADsStr(pszPath);
|
|
|
|
if (!_pszMetaBasePath) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
}
|
|
|
|
hr = InitServerInfo(pszServerName, &_pAdminBase);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
error:
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CIISComputer::Backup
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: HRESULT.
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/14/97 SophiaC Created
|
|
//
|
|
// Notes:
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::Backup(
|
|
BSTR bstrLocation,
|
|
LONG lVersion,
|
|
LONG lFlags
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
hr = _pAdminBase->Backup((LPWSTR)bstrLocation,
|
|
lVersion,
|
|
lFlags);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::BackupWithPassword(
|
|
BSTR bstrLocation,
|
|
LONG lVersion,
|
|
LONG lFlags,
|
|
BSTR bstrPassword
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IMSAdminBase2 * pInterface2 = NULL;
|
|
if (SUCCEEDED(hr = _pAdminBase->QueryInterface(IID_IMSAdminBase2, (void **)&pInterface2)))
|
|
{
|
|
hr = pInterface2->BackupWithPasswd(bstrLocation, lVersion, lFlags, bstrPassword);
|
|
pInterface2->Release();
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::SaveData()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = _pAdminBase->SaveData();
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::Export(
|
|
BSTR bstrPassword,
|
|
BSTR bstrFilename,
|
|
BSTR bstrSourcePath,
|
|
LONG lFlags
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IMSAdminBase2 * pInterface2 = NULL;
|
|
if (SUCCEEDED(hr = _pAdminBase->QueryInterface(IID_IMSAdminBase2, (void **)&pInterface2)))
|
|
{
|
|
hr = pInterface2->Export(bstrPassword, bstrFilename, bstrSourcePath, lFlags);
|
|
pInterface2->Release();
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::Import(
|
|
BSTR bstrPassword,
|
|
BSTR bstrFilename,
|
|
BSTR bstrSourcePath,
|
|
BSTR bstrDestPath,
|
|
LONG lFlags
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IMSAdminBase2 * pInterface2 = NULL;
|
|
if (SUCCEEDED(hr = _pAdminBase->QueryInterface(IID_IMSAdminBase2, (void **)&pInterface2)))
|
|
{
|
|
hr = pInterface2->Import(bstrPassword, bstrFilename, bstrSourcePath, bstrDestPath, lFlags);
|
|
pInterface2->Release();
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CIISComputer::Restore
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: HRESULT.
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/14/96 SophiaC Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::Restore(
|
|
BSTR bstrLocation,
|
|
LONG lVersion,
|
|
LONG lFlags
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = _pAdminBase->Restore((LPWSTR)bstrLocation,
|
|
lVersion,
|
|
lFlags);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::RestoreWithPassword(
|
|
BSTR bstrLocation,
|
|
LONG lVersion,
|
|
LONG lFlags,
|
|
BSTR bstrPassword
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
IMSAdminBase2 * pInterface2 = NULL;
|
|
|
|
if (SUCCEEDED(hr = _pAdminBase->QueryInterface(IID_IMSAdminBase2, (void **)&pInterface2)))
|
|
{
|
|
hr = pInterface2->RestoreWithPasswd(bstrLocation, lVersion, lFlags, bstrPassword);
|
|
pInterface2->Release();
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CIISComputer::EnumBackups
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: HRESULT.
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07-14-96 SophiaC Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::EnumBackups(
|
|
BSTR bstrLocation,
|
|
LONG lIndex,
|
|
VARIANT *pvVersion,
|
|
VARIANT *pvLocation,
|
|
VARIANT *pvDate
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
FILETIME ftBackupTime;
|
|
WORD wFatDate;
|
|
WORD wFatTime;
|
|
WCHAR Location[MD_BACKUP_MAX_LEN];
|
|
DWORD dwVersion;
|
|
|
|
VariantInit( pvVersion );
|
|
VariantInit( pvLocation );
|
|
VariantInit( pvDate );
|
|
|
|
Location[0] = L'\0';
|
|
|
|
if (bstrLocation) {
|
|
wcscpy((LPWSTR)Location, (LPWSTR)bstrLocation);
|
|
}
|
|
|
|
hr = _pAdminBase->EnumBackups((LPWSTR)Location,
|
|
(PDWORD)&dwVersion,
|
|
&ftBackupTime,
|
|
lIndex);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
|
|
pvVersion->vt = VT_I4;
|
|
pvLocation->vt = VT_BSTR;
|
|
pvDate->vt = VT_DATE;
|
|
|
|
if (!FileTimeToDosDateTime( &ftBackupTime, &wFatDate, &wFatTime)){
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
if (!DosDateTimeToVariantTime(wFatDate, wFatTime, &pvDate->date)){
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
pvVersion->lVal = (long)dwVersion;
|
|
|
|
hr = ADsAllocString(
|
|
(LPWSTR)Location,
|
|
&pvLocation->bstrVal
|
|
);
|
|
}
|
|
|
|
error :
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CIISComputer::DeleteBackup
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: HRESULT.
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/14/96 SophiaC Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::DeleteBackup(
|
|
BSTR bstrLocation,
|
|
LONG lVersion
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
hr = _pAdminBase->DeleteBackup((LPWSTR)bstrLocation,
|
|
lVersion
|
|
);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::ADSIInitializeDispatchManager(
|
|
long dwExtensionId
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (_fDispInitialized) {
|
|
|
|
RRETURN(E_FAIL);
|
|
}
|
|
|
|
hr = _pDispMgr->InitializeDispMgr(dwExtensionId);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
_fDispInitialized = TRUE;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::ADSIInitializeObject(
|
|
THIS_ BSTR lpszUserName,
|
|
BSTR lpszPassword,
|
|
long lnReserved
|
|
)
|
|
{
|
|
CCredentials NewCredentials(lpszUserName, lpszPassword, lnReserved);
|
|
|
|
_Credentials = NewCredentials;
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::ADSIReleaseObject()
|
|
{
|
|
delete this;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::NonDelegatingQueryInterface(
|
|
REFIID iid,
|
|
LPVOID FAR* ppv
|
|
)
|
|
{
|
|
ASSERT(ppv);
|
|
|
|
if (IsEqualIID(iid, IID_IISComputer)) {
|
|
|
|
*ppv = (IADsUser FAR *) this;
|
|
|
|
} else if (IsEqualIID(iid, IID_IISComputer2)) {
|
|
|
|
*ppv = (IADsUser FAR *) this;
|
|
|
|
} else if (IsEqualIID(iid, IID_IADsExtension)) {
|
|
|
|
*ppv = (IADsExtension FAR *) this;
|
|
|
|
} else if (IsEqualIID(iid, IID_IUnknown)) {
|
|
|
|
//
|
|
// probably not needed since our 3rd party extension does not stand
|
|
// alone and provider does not ask for this, but to be safe
|
|
//
|
|
*ppv = (INonDelegatingUnknown FAR *) this;
|
|
|
|
} else {
|
|
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
|
|
//
|
|
// Delegating AddRef to aggregator for IADsExtesnion and IISComputer.
|
|
// AddRef on itself for IPrivateUnknown. (both tested.)
|
|
//
|
|
|
|
((IUnknown *) (*ppv)) -> AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//
|
|
// IADsExtension::Operate()
|
|
//
|
|
|
|
STDMETHODIMP
|
|
CIISComputer::Operate(
|
|
THIS_ DWORD dwCode,
|
|
VARIANT varUserName,
|
|
VARIANT varPassword,
|
|
VARIANT varFlags
|
|
)
|
|
{
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|