//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997-1998 // // File: MacAdmin.cxx // // Contents: Index Server Administration Interface methods // // Classes: CMachineAdm // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- #include "pch.cxx" #pragma hdrstop #include "stdafx.h" #include DECLARE_INFOLEVEL( odm ); //+--------------------------------------------------------------------------- // // Member: CMachineAdm::InterfaceSupportsErrorInfo, public // // Arguments: [riid] -- interface iid // // Returns: S_OK if interface supports IErrorInfo // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::InterfaceSupportsErrorInfo(REFIID riid) { return ( riid == IID_IAdminIndexServer ); } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::SetErrorInfo, public // // Synopsis: Creates & sets the error object // // Arguments: [hRes] -- HRESULT error code to set // [ pwszDesc] -- error description // // Returns: S_OK upon success, other values upon failure // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- void CMachineAdm::SetErrorInfo( HRESULT hRes ) { CiodmError err(hRes); AtlSetErrorInfo(CLSID_AdminIndexServer, err.GetErrorMessage() , 0 , 0, IID_IAdminIndexServer, hRes, 0 ); } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::CMachineAdm, public // // Synopsis: Constructor // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- CMachineAdm::CMachineAdm() :_eCurrentState(CIODM_NOT_INITIALIZED), _cMinRefCountToDestroy(1), _cEnumIndex(0) { wcscpy(_wcsMachineName,L"."); // default to local machine } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::InternalAddRef, public // // Synopsis: overrides CComObjectRootEx::InternalAddRef, for debugging only. // // Arguments: none // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- ULONG CMachineAdm::InternalAddRef() { unsigned cRef = CComObjectRootEx::InternalAddRef(); odmDebugOut(( DEB_TRACE,"CMachineAdm AddRef returned: %d\n", cRef )); odmDebugOut(( DEB_TRACE,"=========================== CMachineAdm object count: %d\n", _cMinRefCountToDestroy )); return cRef; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::InternalRelease, public // // Synopsis: overrides CComObjectRootEx::InternalRelease, for debugging only. // // Arguments: none // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- ULONG CMachineAdm::InternalRelease() { CLock lock(_mtx); // // Delete contained objects if we're being destoryed. // m_dwRef is an internal ATL public refcount member. // if ( _eCurrentState != CIODM_DESTROY && m_dwRef == _cMinRefCountToDestroy ) { _eCurrentState = CIODM_DESTROY; _aICatAdmin.Free(); } unsigned cRef = CComObjectRootEx::InternalRelease(); odmDebugOut(( DEB_TRACE,"CMachineAdm Release returned: %d\n", cRef )); odmDebugOut(( DEB_TRACE,"=========================== CMachineAdm object count: %d\n", _cMinRefCountToDestroy )); return cRef; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::Initialize, public // // Synopsis: Initializes CMachineAdm object, creates CMachineAdmin object, // populates catalogs lists. // // Arguments: none. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- void CMachineAdm::Initialize() { // // create CMachineAdmin object // if ( IsCurrentObjectValid() ) { return; } TRY { _xMachineAdmin.Set (new CMachineAdmin( _wcsMachineName ) ); XPtr xCatEnum( _xMachineAdmin->QueryCatalogEnum() ); Win4Assert( 0 == _aICatAdmin.Count() ); while ( xCatEnum->Next() ) { XPtr xCatAdmin(xCatEnum->QueryCatalogAdmin()); XInterface xICatAdm; GetCatalogAutomationObject( xCatAdmin, xICatAdm ); _aICatAdmin.Add( xICatAdm.GetPointer(), _aICatAdmin.Count() ); xICatAdm.Acquire(); } _eCurrentState = CIODM_INITIALIZED; } CATCH ( CException, e ) { _xMachineAdmin.Free(); _cEnumIndex = 0; wcscpy(_wcsMachineName,L"."); _aICatAdmin.Free(); _eCurrentState = CIODM_NOT_INITIALIZED; RETHROW(); } END_CATCH } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetCatalogAutomationObject, public // // Synopsis: Wraps a CCatalogAdmin pointer in an IDispatch interface. // // Arguments: [xCatAdmin] -- Catalog admin object // [xICatAdm] -- XInterface to contain created CatAdmObject // // Returns: none, throws upon error. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- void CMachineAdm::GetCatalogAutomationObject( XPtr & xCatAdmin, XInterface & xICatAdm ) { Win4Assert( !xCatAdmin.IsNull() ); SCODE sc = CatAdmObject::CreateInstance( xICatAdm.GetPPointer() ); if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "CatAdmObject::CreateInstance() Failed: %x\n", sc )); THROW(CException(sc)); } else { Win4Assert( !xICatAdm.IsNull() ); xICatAdm->SetParent( (CComObject *)this ); xICatAdm->AddRef(); IncObjectCount(); // inc. internal object count } // // Initialize the new object // xICatAdm->Initialize( xCatAdmin ); } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetIDisp, public // // Synopsis: QI for IDispatch on CCatAdm object given by the passed in index. // // Arguments: [cPosition] -- index of CCatAdm object // // Returns: [IDispatch *] -- pointer to IDispatch on CCatAdm, throws upon failure. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- IDispatch * CMachineAdm::GetIDisp( unsigned i ) { IDispatch * pTmpIDisp = 0; SCODE sc = _aICatAdmin[i]->QueryInterface(IID_IDispatch, (void **) &pTmpIDisp); if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "QueryInterface() Failed: %x\n", sc )); THROW(CException(sc)); } Win4Assert( pTmpIDisp ); return pTmpIDisp; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::get_MachineName, public // // Synopsis: Gets MachineName property // // Arguments: [pVal] pointer to bstr buffer return value // // Returns: S_OK on success, other values on failure. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::get_MachineName(BSTR * pVal) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); *pVal = SysAllocString(_wcsMachineName); if ( 0 == *pVal ) { sc = E_OUTOFMEMORY; } } CATCH ( CException,e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "CMachineAdm::get_MachineName exception: %x\n",sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::put_MachineName, public // // Synopsis: Gets MachineName property // // Arguments: [newVal] -- machine name to set. // // Returns: S_OK on success, other values on failure. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::put_MachineName(BSTR newVal) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam(newVal); if ( IsCurrentObjectValid() ) { odmDebugOut(( DEB_ERROR,"CMachineAdm(%ws) already initialized", newVal)); sc = HRESULT_FROM_WIN32(ERROR_ALREADY_INITIALIZED); } else if ( SysStringLen( newVal ) >= MAX_PATH ) { odmDebugOut(( DEB_ERROR,"CMachineAdm(%ws): Path too long", newVal)); sc = E_INVALIDARG; } else { Win4Assert( L'.' == _wcsMachineName[0] && L'' == _wcsMachineName[1] ); if ( newVal[0] == L'' ) { wcscpy( _wcsMachineName, L"." ); } else { wcscpy( _wcsMachineName, newVal ); } Initialize(); } } CATCH ( CException,e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR,"put_MachineName Failed: %x\n", sc)); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::AddCatalog, public // // Synopsis: Adds a catalog. // // Arguments: [bstrCatName] - in param, catalog name // [bstrCatLocation] - in param, catalog location // [pIDisp] - out param, IDisp interface to the new catalog // // Returns: S_OK upon success, other values upon failure. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::AddCatalog(BSTR bstrCatName, BSTR bstrCatLocation, IDispatch * * pIDisp) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam(bstrCatName); ValidateInputParam(bstrCatLocation); Initialize(); if ( CatalogExists( bstrCatName, bstrCatLocation ) ) { sc = HRESULT_FROM_WIN32( ERROR_ALREADY_EXISTS ); } else { _xMachineAdmin->AddCatalog( bstrCatName, bstrCatLocation ); XPtr xCatAdmin( _xMachineAdmin->QueryCatalogAdmin( bstrCatName ) ); unsigned cPosition = _aICatAdmin.Count(); XInterface xICatAdm; GetCatalogAutomationObject( xCatAdmin, xICatAdm ); _aICatAdmin.Add( xICatAdm.GetPointer(), cPosition ); xICatAdm.Acquire(); *pIDisp = GetIDisp(cPosition); } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED (sc) ) { odmDebugOut(( DEB_ERROR, "AddCatalog Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // member: CMachineAdm::CatalogExists, public // // Synopsis: determines if a catalog name or location is used up. // // Arguments: [pCatName] -- Catalog name // [pCatLocation] -- Catalog location. // // Returns: TRUE if catalog already exists, false otherwise. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- BOOL CMachineAdm::CatalogExists( WCHAR const * pCatName, WCHAR const * pCatLocation ) { Win4Assert( pCatName ); Win4Assert( pCatLocation); unsigned cMaxCatalogs = _aICatAdmin.Count(); for ( DWORD i = 0; i < cMaxCatalogs; i++ ) { Win4Assert( _aICatAdmin[i] ); CCatalogAdmin * pCatalogAdmin = _aICatAdmin[i]->GetCatalogAdmin(); Win4Assert( pCatalogAdmin ); if ( !_wcsicmp( pCatName, pCatalogAdmin->GetName() ) || !_wcsicmp( pCatLocation, pCatalogAdmin->GetLocation() ) ) { return TRUE; } } return FALSE; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::RemoveCatalog, public // // Synopsis: deletes a catalog, and optionally the corresponding directory // // Arguments: [bstrCatName] - Catalog Name // [fDelDirectory] - TRUE --> delete catalog directory. // // Returns: S_OK upon success, other values upon failure. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::RemoveCatalog(BSTR bstrCatName, VARIANT_BOOL fDelDirectory) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam(bstrCatName); Initialize(); if (_xMachineAdmin->IsCIStarted()) sc = CI_E_INVALID_STATE; else { unsigned cMax = _aICatAdmin.Count(); for ( DWORD i = 0; i < cMax ; i++ ) { Win4Assert( _aICatAdmin[i] ); CCatalogAdmin * pCatalogAdmin = _aICatAdmin[i]->GetCatalogAdmin(); Win4Assert( pCatalogAdmin ); if ( !_wcsicmp( bstrCatName, pCatalogAdmin->GetName() ) ) { // // Remove from CI // _xMachineAdmin->RemoveCatalog( bstrCatName, fDelDirectory ); // // Remove catalog from local list, set catalog object to invalid, // and release removed catalog // CatAdmObject * pICatAdm = _aICatAdmin.AcquireAndShrink(i); pICatAdm->SetInvalid(); pICatAdm->Release(); break; } } if ( i == cMax ) { odmDebugOut(( DEB_ERROR, "RemoveCatalog Failed, Catalog(%ws) not found\n", bstrCatName )); sc = HRESULT_FROM_WIN32(ERROR_NOT_FOUND); } } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED (sc) ) { odmDebugOut(( DEB_ERROR, "RemoveCatalog Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetCatalogByName, public // // Arguments: [bstrCatalogName] -- Catalog name to search for. // [pIDisp] -- IDisp interface to the found catalog // // Returns: S_OK upon success, other values upon failure. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::GetCatalogByName(BSTR bstrCatalogName, IDispatch * * pIDisp) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam(bstrCatalogName); Initialize(); unsigned cMaxCatalogs = _aICatAdmin.Count(); for ( DWORD i = 0; i < cMaxCatalogs; i++ ) { Win4Assert( _aICatAdmin[i] ); CCatalogAdmin * pCatalogAdmin = _aICatAdmin[i]->GetCatalogAdmin(); Win4Assert( pCatalogAdmin ); if ( !_wcsicmp( bstrCatalogName, pCatalogAdmin->GetName() ) ) { *pIDisp = GetIDisp(i); break; } } if ( i == cMaxCatalogs ) { odmDebugOut(( DEB_ERROR, "Catalog(%ws) not found\n", bstrCatalogName )); sc = HRESULT_FROM_WIN32( ERROR_NOT_FOUND ); } } CATCH ( CException,e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "GetCatalogByName Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::FindFirstCatalog, public // // Synopsis: Catalog enumerator. Resets scan to start of list. // // Arguments: [pfFound] -- out param, True --> Found at least one catalog // // Returns: SO_OK upon success, other values upon faillure // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::FindFirstCatalog(VARIANT_BOOL * pfFound) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); _cEnumIndex = 0; if ( _aICatAdmin.Count() > 0 ) { Win4Assert( _aICatAdmin[_cEnumIndex] ); *pfFound = VARIANT_TRUE; } else { *pfFound = VARIANT_FALSE; } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "FindFirstCatalog Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::FindNextCatalog, public // // Synopsis: Catalog enumerator. Scans for next catalog in the list // // Arguments: [pfFound] -- out param, True --> Found next catalog // // Returns: SO_OK upon success, other values upon faillure // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::FindNextCatalog(VARIANT_BOOL * pfFound) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); if ( !IsCurrentObjectValid() ) { odmDebugOut(( DEB_ERROR,"CMachineAdm not initialized" )); sc = HRESULT_FROM_WIN32(ERROR_INVALID_STATE); } else { _cEnumIndex++; if ( _cEnumIndex < _aICatAdmin.Count() ) { Win4Assert( _aICatAdmin[_cEnumIndex] ); *pfFound = VARIANT_TRUE; } else { *pfFound = VARIANT_FALSE; } } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "FindNextCatalog Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetCatalog, public // // Synopsis: Catalog enumerator. Returns IDispatch to current catalog // // Arguments: [pIDisp] -- out param, IDispatch to current catalog // // Returns: SO_OK upon success, other values upon faillure // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::GetCatalog(IDispatch * * pIDisp) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); if ( !IsCurrentObjectValid() ) { odmDebugOut(( DEB_ERROR,"CMachineAdm not initialized" )); sc = HRESULT_FROM_WIN32(ERROR_INVALID_STATE); } else { if ( _cEnumIndex >= _aICatAdmin.Count() ) { odmDebugOut(( DEB_ERROR, "No More Catalogs, Index: %d\n", _cEnumIndex )); sc = HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS); } else { Win4Assert( _aICatAdmin[_cEnumIndex] ); *pIDisp = GetIDisp(_cEnumIndex); } } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "GetCatalog Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::Start, public // // Synopsis: Starts cisvc service // // Returns: S_OK upon success, othervalues upon failure // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::Start() { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); _xMachineAdmin->StartCI(); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Start cisvc Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::Stop, public // // Synopsis: Stops cisvc service // // Returns: S_OK upon success, othervalues upon failure // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::Stop() { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); _xMachineAdmin->StopCI(); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Stop cisvc Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::IsRunning, public // // Synopsis: is cisvc running // // Returns: True if cisvc is running, False otherwise. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::IsRunning( VARIANT_BOOL *pfIsRunning ) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); *pfIsRunning = _xMachineAdmin->IsCIStarted() ? VARIANT_TRUE : VARIANT_FALSE; } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Failed to see if cisvc is running: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::IsPaused, public // // Synopsis: is cisvc paused // // Returns: True if cisvc is paused, False otherwise. // // History: 08-11-98 kitmanh created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::IsPaused( VARIANT_BOOL *pfIsPaused ) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); *pfIsPaused = _xMachineAdmin->IsCIPaused() ? VARIANT_TRUE : VARIANT_FALSE; } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Failed to see if cisvc is paused: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::EnableCI, public // // Synopsis: Sets cisvc to auto-start (enabled) or manual start (disabled) // // Arguments: [fAutoStart] - True -> set to auto start, False -> set to demand start // // Returns: S_OK upon success, failure error if failed to set service setting. // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::EnableCI( VARIANT_BOOL fAutoStart ) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); sc = fAutoStart ? _xMachineAdmin->EnableCI() : _xMachineAdmin->DisableCI(); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Failed enable/disable cisvc settings: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::SetLongProperty, public // // Synopsis: Sets CI registry params // // Arguments: [bstrPropName] -- property name // [lPropVal] -- property value // // Returns: S_OK upon success, othervalues upon failure // // Notes: Property value is an unsigned value, though it is being // passed in as a signed LONG for compatiblity with automation // clients (VB5, VB6 don't support unsigned long). // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::SetLongProperty(BSTR bstrPropName, LONG lPropVal ) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam( bstrPropName ); Initialize(); _xMachineAdmin->SetDWORDParam( bstrPropName, lPropVal ); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "SetLongParam Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetLongProperty, public // // Synopsis: Gets CI registry params // // Arguments: [bstrPropName] -- property name // [plPropVal] -- returned property value // // Returns: S_OK upon success, othervalues upon failure // // Notes: Property value is an unsigned value, though it is being // passed in as a signed LONG for compatiblity with automation // clients (VB5, VB6 don't support unsigned long). // // History: 12-10-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::GetLongProperty(BSTR bstrPropName, LONG * plPropVal ) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam( bstrPropName ); Initialize(); unsigned long uVar = 0; if ( !_xMachineAdmin->GetDWORDParam( bstrPropName, uVar ) ) { sc = E_FAIL; } else { *plPropVal = uVar; } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "GetLONGParam Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::SetSZProperty, public // // Synopsis: Sets CI registry params // // Arguments: [bstrPropName] -- property name // [bstrVal] -- property value // // Returns: S_OK upon success, othervalues upon failure // // History: 4-6-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::SetSZProperty(BSTR bstrPropName, BSTR bstrVal) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam( bstrPropName ); ValidateInputParam( bstrVal ); Initialize(); unsigned cLen = SysStringLen( bstrVal ); unsigned cbLen = sizeof WCHAR * (cLen + 1); _xMachineAdmin->SetSZParam( bstrPropName, bstrVal, cbLen ); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "SetSZParam Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetSZProperty, public // // Synopsis: Gets CI registry params // // Arguments: [bstrPropName] -- property name // [pbstrVal] -- returned property value // // Returns: S_OK upon success, othervalues upon failure // // History: 4-6-97 mohamedn created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::GetSZProperty(BSTR bstrPropName, BSTR * pbstrVal) { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); ValidateInputParam( bstrPropName ); Initialize(); WCHAR awcPropVal[MAX_PATH+1]; if ( !_xMachineAdmin->GetSZParam( bstrPropName, awcPropVal, sizeof awcPropVal ) ) { sc = E_FAIL; } else { BSTR pPropVal = SysAllocString( awcPropVal ); if ( !pPropVal ) { sc = E_OUTOFMEMORY; } else { *pbstrVal = pPropVal; } } } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "GetSZProperty Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::Pause, public // // Synopsis: Pauses cisvc service // // Returns: S_OK upon success, othervalues upon failure // // History: 10-08-98 kitmanh created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::Pause() { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); _xMachineAdmin->PauseCI(); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Pause cisvc Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::Continue, public // // Synopsis: Continues cisvc service // // Returns: S_OK upon success, othervalues upon failure // // History: 09-08-98 kitmanh created // //---------------------------------------------------------------------------- STDMETHODIMP CMachineAdm::Continue() { SCODE sc = S_OK; CLock lock(_mtx); TRANSLATE_EXCEPTIONS; TRY { SafeForScripting(); Initialize(); _xMachineAdmin->StartCI(); } CATCH( CException, e ) { sc = e.GetErrorCode(); } END_CATCH UNTRANSLATE_EXCEPTIONS; if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "Start cisvc Failed: %x\n", sc )); SetErrorInfo( sc ); } return sc; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::SafeForScripting, public // // Synopsis: determines if it is safe to invoke this method from a given client site. // // Arguments: none. // // Returns: E_ACCESSDENIED if not safe to run, else S_OK // // History: 9/10/98 mohamedn created // //---------------------------------------------------------------------------- void CMachineAdm::SafeForScripting() { SCODE sc = S_OK; if ( m_spUnkSite || m_dwSafety ) { Win4Assert( m_spUnkSite ); XInterface xpunkSite; sc = GetSite( IID_IUnknown, xpunkSite.GetQIPointer() ); // m_spUnkSite if ( FAILED(sc) ) { odmDebugOut(( DEB_ERROR, "GetSite Failed sc: %x, m_spUnkSite: %x, punkSite:%x, m_dwSafety:%x\n", sc, m_spUnkSite, xpunkSite.GetPointer() , m_dwSafety )); THROW( CException( E_ACCESSDENIED ) ); } else { Win4Assert( !xpunkSite.IsNull() ); if ( m_dwSafety && LocalZoneCheck(xpunkSite.GetPointer()) != S_OK) { odmDebugOut(( DEB_ERROR, "LocalZoneCheck() Failed, Access denied\n" )); THROW( CException( E_ACCESSDENIED ) ); } } } } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::IUnknown_QueryService, private // // Synopsis: determines if it is safe to invoke this method from a given client site. // // Arguments: [punk] -- site's IUnkown // [guidService] -- sp guid // [riid] -- interface to query for. // [ppvOut] -- out param, contaiing found interface // // Returns: S_OK upon success, failure codes otherwise. // // History: 9/10/98 mohamedn created // //---------------------------------------------------------------------------- HRESULT CMachineAdm::IUnknown_QueryService(IUnknown* punk, REFGUID guidService, REFIID riid, void **ppvOut) { HRESULT hres; XInterface xPsp; *ppvOut = NULL; if (!punk) return E_FAIL; hres = punk->QueryInterface(IID_IServiceProvider, xPsp.GetQIPointer() ); if ( SUCCEEDED(hres) ) { hres = xPsp->QueryService(guidService, riid, ppvOut); } return hres; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::GetHTMLDoc2, private // // Synopsis: determines if it is safe to invoke this method from a given client site. // // Arguments: [punk] -- site's IUnknown // [ppHtmlDoc] -- out param to htm doc // // Returns: S_OK upon success, failure codes otherwise. // // History: 9/10/98 mohamedn created // //---------------------------------------------------------------------------- HRESULT CMachineAdm::GetHTMLDoc2(IUnknown *punk, IHTMLDocument2 **ppHtmlDoc) { HRESULT hr = E_NOINTERFACE; *ppHtmlDoc = NULL; // The window.external, jscript "new ActiveXObject" and the tag // don't take us down the same road. XInterface xClientSite; hr = punk->QueryInterface(IID_IOleClientSite, xClientSite.GetQIPointer()); if (SUCCEEDED(hr)) { // tag path XInterface xContainer; hr = xClientSite->GetContainer(xContainer.GetPPointer()); if (SUCCEEDED(hr)) { hr = xContainer->QueryInterface(IID_IHTMLDocument2, (void **)ppHtmlDoc); } if (FAILED(hr)) { // window.external path XInterface xWebBrowser2; hr = IUnknown_QueryService(xClientSite.GetPointer(), SID_SWebBrowserApp, IID_IHTMLDocument2, xWebBrowser2.GetQIPointer() ); if (SUCCEEDED(hr)) { XInterface xDispatch; hr = xWebBrowser2->get_Document(xDispatch.GetPPointer()); if (SUCCEEDED(hr)) { hr = xDispatch->QueryInterface(IID_IHTMLDocument2, (void **)ppHtmlDoc); } } } } else { // jscript path hr = IUnknown_QueryService(punk, SID_SContainerDispatch, IID_IHTMLDocument2, (void **)ppHtmlDoc); } Win4Assert( FAILED(hr) || (*ppHtmlDoc) ); return hr; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::LocalZoneCheckPath, private // // Synopsis: determines if it is safe to invoke this method from a given client site. // // Arguments: [pbstrPath] -- out param. Path of htm page. // // Returns: S_OK upon success, failure codes otherwise. // // History: 9/10/98 mohamedn created // //---------------------------------------------------------------------------- HRESULT CMachineAdm::LocalZoneCheckPath(LPCWSTR pbstrPath) { HRESULT hr = E_ACCESSDENIED; if (pbstrPath) { XInterface xSecMgr; if (SUCCEEDED(CoCreateInstance(CLSID_InternetSecurityManager, NULL, CLSCTX_INPROC_SERVER, IID_IInternetSecurityManager, xSecMgr.GetQIPointer()))) { DWORD dwZoneID = URLZONE_UNTRUSTED; if (SUCCEEDED(xSecMgr->MapUrlToZone(pbstrPath, &dwZoneID, 0))) { if (dwZoneID == URLZONE_LOCAL_MACHINE) hr = S_OK; } } } else { hr = E_INVALIDARG; } return hr; } //+--------------------------------------------------------------------------- // // Member: CMachineAdm::LocalZoneCheck, private // // Synopsis: determines if it is safe to invoke this method from a given client site. // // Arguments: [punkSite] -- site's IUnknown. // // Returns: S_OK upon success, failure codes otherwise. // // History: 9/10/98 mohamedn created // //---------------------------------------------------------------------------- HRESULT CMachineAdm::LocalZoneCheck(IUnknown *punkSite) { // Return S_FALSE if we don't have a host site since we have no way of doing a // security check. This is as far as VB 5.0 apps get. if (!punkSite) return S_FALSE; // Try to use the URL from the document to zone check XInterface xHtmlDoc; HRESULT hr = E_ACCESSDENIED; if (SUCCEEDED(GetHTMLDoc2(punkSite, xHtmlDoc.GetPPointer()) )) { Win4Assert(xHtmlDoc.GetPointer()); BSTR bstrPath; if ( SUCCEEDED( xHtmlDoc->get_URL(&bstrPath) )) { hr = LocalZoneCheckPath( bstrPath ); SysFreeString(bstrPath); } } return hr; }