//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000 - 2001. // // File: baseaz.cpp // // Contents: Implementation of Base Classes for AzObjects // // History: 09-01 // //---------------------------------------------------------------------------- #include "headers.h" /****************************************************************************** Class: CBaseAz Purpose: This is the base class for all AzObject classes. ******************************************************************************/ CString CBaseAz:: GetParentType() { if(m_pParentContainerAz) { return m_pParentContainerAz->GetType(); } //m_pParentContainerAz will be null for AdminManagerAz in which //case return the Type of the store return GetType(); } CSidHandler* CBaseAz:: GetSidHandler() { //m_pParentContainerAz == NULL only for CAdminManagerAz which //overrides this method. ASSERT(m_pParentContainerAz); return m_pParentContainerAz->GetSidHandler(); } CAdminManagerAz* CBaseAz:: GetAdminManager() { //m_pParentContainerAz == NULL only for CAdminManagerAz which //overrides this method. ASSERT(m_pParentContainerAz); return m_pParentContainerAz->GetAdminManager(); } HRESULT CBaseAz::IsWritable(BOOL& bRefWrite) { TRACE_METHOD_EX(DEB_SNAPIN,CBaseAz,IsWritable) return GetProperty(AZ_PROP_WRITABLE, &bRefWrite); } /****************************************************************************** Class: CContainerAz Purpose: AdminManagerAz, ApplicationAz and ScopeAz can contain child objects. All of them can contain group objects. CContainerAz is base class for all AzObjects which are container ******************************************************************************/ HRESULT CContainerAz:: CanCreateChildObject(BOOL& bCahCreateChild) { TRACE_METHOD_EX(DEB_SNAPIN,CContainerAz,CanCreateChildObject) return GetProperty(AZ_PROP_CHILD_CREATE, &bCahCreateChild); } BOOL CContainerAz:: IsAuditingSupported() { TRACE_METHOD_EX(DEB_SNAPIN,CContainerAz,IsAuditingSupported) BOOL bVal = 0; HRESULT hr = GetProperty(AZ_PROP_GENERATE_AUDITS,&bVal); CHECK_HRESULT(hr); HRESULT hr1 = GetProperty(AZ_PROP_APPLY_STORE_SACL,&bVal); CHECK_HRESULT(hr1); return (SUCCEEDED(hr) || SUCCEEDED(hr1)); } //+---------------------------------------------------------------------------- // Function:IsDelegatorSupported // Synopsis:Checks if Container Supports delegator property //----------------------------------------------------------------------------- BOOL CContainerAz:: IsDelegatorSupported() { TRACE_METHOD_EX(DEB_SNAPIN,CContainerAz,IsDelegatorSupported) //Delegator Property is supported For AD Application, //AdminManager objects if(GetAdminManager()->GetStoreType() == AZ_ADMIN_STORE_AD) { if(GetObjectType() == ADMIN_MANAGER_AZ || GetObjectType() == APPLICATION_AZ) return TRUE; } return FALSE; } /****************************************************************************** Class: CAdminManagerAz Purpose: class for IAzAdminManager interface ******************************************************************************/ DEBUG_DECLARE_INSTANCE_COUNTER(CAdminManagerAz); CAdminManagerAz:: CAdminManagerAz(CComPtr& spAzInterface) :CContainerAzImpl(spAzInterface, ADMIN_MANAGER_AZ, NULL), m_pSidHandler(NULL) { TRACE_CONSTRUCTOR_EX(DEB_SNAPIN,CAdminManagerAz); DEBUG_INCREMENT_INSTANCE_COUNTER(CAdminManagerAz); SetType(IDS_TYPE_ADMIN_MANAGER); } CAdminManagerAz::~CAdminManagerAz() { TRACE_DESTRUCTOR_EX(DEB_SNAPIN,CAdminManagerAz); DEBUG_DECREMENT_INSTANCE_COUNTER(CAdminManagerAz); if(m_pSidHandler) delete m_pSidHandler; } HRESULT CAdminManagerAz:: UpdateCache() { HRESULT hr = m_spAzInterface->UpdateCache(CComVariant()); CHECK_HRESULT(hr); return hr; } HRESULT CAdminManagerAz:: DeleteSelf() { HRESULT hr = m_spAzInterface->Delete(CComVariant()); CHECK_HRESULT(hr); return hr; } HRESULT CAdminManagerAz:: CreateSidHandler(const CString& strTargetComputerName) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,CreateSidHandler) CMachineInfo * pMachineInfo = new CMachineInfo(); if(!pMachineInfo) return E_OUTOFMEMORY; pMachineInfo->InitializeMacineConfiguration(strTargetComputerName); m_pSidHandler = new CSidHandler(pMachineInfo); if(!m_pSidHandler) { delete pMachineInfo; return E_OUTOFMEMORY; } return S_OK; } //+---------------------------------------------------------------------------- // // Function: Initialize // Synopsis: Associates IAzAuthorizationStore to a policy store // Arguments: IN lStoreType // IN lFlags // IN strPolicyURL // See IAzAuthorizationStore for desc of Parameters // Returns: hr //----------------------------------------------------------------------------- HRESULT CAdminManagerAz::Initialize(IN ULONG lStoreType, IN ULONG lFlags, IN const CString& strPolicyURL) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,Initialize) if(strPolicyURL.IsEmpty()) { ASSERT(FALSE); return E_INVALIDARG; } HRESULT hr = S_OK; do { CString strFormalStoreName; //Get the formal Store Name NameToStoreName(lStoreType, strPolicyURL, FALSE, strFormalStoreName); Dbg(DEB_SNAPIN, "lStoreType = %u, storeName = %ws, formalStoreName = %ws\n",lStoreType,(LPCWSTR)strPolicyURL,(LPCWSTR)strFormalStoreName ); //Snapin always calls initailize in Manage Store mode lFlags |= AZ_AZSTORE_FLAG_MANAGE_STORE_ONLY; CComBSTR bstr = strFormalStoreName; hr = m_spAzInterface->Initialize(lFlags, bstr, CComVariant()); BREAK_ON_FAIL_HRESULT(hr); //Submit if creating new store if(lFlags & AZ_AZSTORE_FLAG_CREATE) { hr = Submit(); BREAK_ON_FAIL_HRESULT(hr); } m_strPolicyURL = strPolicyURL; GetDisplayNameFromStoreURL(strFormalStoreName,m_strAdminManagerName); m_ulStoreType = lStoreType; // //Create the Sid Handler for the store // CComBSTR bstrTargetMachineName; HRESULT hr1 = m_spAzInterface->get_TargetMachine(&bstrTargetMachineName); CString strMachineName; if(SUCCEEDED(hr1) && (bstrTargetMachineName.Length() != 0)) { strMachineName = bstrTargetMachineName; } hr = CreateSidHandler(strMachineName); BREAK_ON_FAIL_HRESULT(hr); }while(0); return hr; } //+---------------------------------------------------------------------------- // // Function: OpenPolicyStore // Synopsis: Open an existing policy store //----------------------------------------------------------------------------- HRESULT CAdminManagerAz::OpenPolicyStore(IN ULONG lStoreType, IN const CString& strPolicyURL) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,OpenPolicyStore) return Initialize(lStoreType, 0, strPolicyURL); } //+---------------------------------------------------------------------------- // Function: CreatePolicyStore // Synopsis: Creates a new policy store //----------------------------------------------------------------------------- HRESULT CAdminManagerAz::CreatePolicyStore(IN ULONG lStoreType, IN const CString& strPolicyURL) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,OpenPolicyStore) return Initialize(lStoreType, AZ_AZSTORE_FLAG_CREATE, strPolicyURL); } //+---------------------------------------------------------------------------- // Function:CreateApplication // Synopsis:Create a new application // Arguments:IN strApplicationName: Name of new application // OUT ppApplicationAz : receives pointer to CApplicatioAz for new // app //----------------------------------------------------------------------------- HRESULT CAdminManagerAz::CreateApplication(IN const CString& strApplicationName, OUT CApplicationAz ** ppApplicationAz) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz, CreateApplication); if(!ppApplicationAz) { ASSERT(ppApplicationAz); return E_POINTER; } HRESULT hr = S_OK; CComPtr spAzApplication; CComBSTR bstr = strApplicationName; hr = m_spAzInterface->CreateApplication(bstr, CComVariant(), &spAzApplication); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } *ppApplicationAz = new CApplicationAz(spAzApplication, this); if(!*ppApplicationAz) { return E_OUTOFMEMORY; } return hr; } HRESULT CAdminManagerAz::DeleteApplication(const CString& strApplicationName) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz, DeleteApplication); HRESULT hr = S_OK; CComBSTR bstr = strApplicationName; hr = m_spAzInterface->DeleteApplication(bstr, CComVariant()); CHECK_HRESULT(hr); return hr; } HRESULT CAdminManagerAz:: GetApplicationCollection(APPLICATION_COLLECTION** ppApplicationCollection) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,GetApplicationCollection) if(!ppApplicationCollection) { ASSERT(ppApplicationCollection); return E_POINTER; } HRESULT hr = S_OK; CComPtr spAzApplications; hr = m_spAzInterface->get_Applications(&spAzApplications); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } //Create AppCollection *ppApplicationCollection = new APPLICATION_COLLECTION(spAzApplications, this); if(!*ppApplicationCollection) { hr = E_OUTOFMEMORY; DBG_OUT_HRESULT(hr); return hr; } return hr; } HRESULT CAdminManagerAz:: CreateAzObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,CreateAzObject) if(!ppBaseAz) { ASSERT(ppBaseAz); return E_POINTER; } switch (eObjectType) { case APPLICATION_AZ: { return CreateApplication(strName, reinterpret_cast(ppBaseAz)); } case GROUP_AZ: { return CreateGroup(strName, reinterpret_cast(ppBaseAz)); } default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CAdminManagerAz:: OpenObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,OpenObject) if(!ppBaseAz) { ASSERT(ppBaseAz); return E_POINTER; } switch (eObjectType) { case GROUP_AZ: { return OpenGroup(strName, reinterpret_cast(ppBaseAz)); } default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CAdminManagerAz:: DeleteAzObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName) { TRACE_METHOD_EX(DEB_SNAPIN,CAdminManagerAz,DeleteAzObject) switch (eObjectType) { case APPLICATION_AZ: { return DeleteApplication(strName); } case GROUP_AZ: { return DeleteGroup(strName); } default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CAdminManagerAz:: GetAzObjectCollection(IN OBJECT_TYPE_AZ eObjectType, OUT CBaseAzCollection **ppBaseAzCollection) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,GetAzObjectCollection) if(!ppBaseAzCollection) { ASSERT(ppBaseAzCollection); return E_POINTER; } switch (eObjectType) { case APPLICATION_AZ: { return GetApplicationCollection(reinterpret_cast(ppBaseAzCollection)); } case GROUP_AZ: { return GetGroupCollection(reinterpret_cast(ppBaseAzCollection)); } default: { ASSERT(FALSE); return E_UNEXPECTED; } } } /****************************************************************************** Class: CApplicationAz Purpose: class for IAzApplication interface ******************************************************************************/ DEBUG_DECLARE_INSTANCE_COUNTER(CApplicationAz) CApplicationAz:: CApplicationAz(IN CComPtr& spAzInterface, IN CContainerAz* pParentContainerAz) :CRoleTaskContainerAzImpl(spAzInterface, APPLICATION_AZ, pParentContainerAz) { TRACE_CONSTRUCTOR_EX(DEB_SNAPIN,CApplicationAz) DEBUG_INCREMENT_INSTANCE_COUNTER(CApplicationAz); SetType(IDS_TYPE_APPLICATION); } //+---------------------------------------------------------------------------- // Function: Destructor //----------------------------------------------------------------------------- CApplicationAz::~CApplicationAz() { TRACE_DESTRUCTOR_EX(DEB_SNAPIN,CApplicationAz) DEBUG_DECREMENT_INSTANCE_COUNTER(CApplicationAz) } HRESULT CApplicationAz:: CreateOperation(IN const CString& strOperationName, OUT COperationAz** ppOperationAz) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,CreateOperation) if(!ppOperationAz) { ASSERT(ppOperationAz); return E_POINTER; } CComBSTR bstrName = strOperationName; HRESULT hr = S_OK; CComPtr spOperation; hr = m_spAzInterface->CreateOperation(bstrName, CComVariant(), //Reserved &spOperation); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } *ppOperationAz = new COperationAz(spOperation,this); if(!*ppOperationAz) return E_OUTOFMEMORY; return S_OK; } HRESULT CApplicationAz ::DeleteOperation(IN const CString& strOperationName) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,DeleteOperation) CComBSTR bstrName = strOperationName; HRESULT hr = S_OK; hr = m_spAzInterface->DeleteOperation(bstrName, CComVariant()); CHECK_HRESULT(hr); return hr; } HRESULT CApplicationAz ::OpenOperation(IN const CString& strOperationName, IN COperationAz** ppOperationAz) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,OpenOperation) if(!ppOperationAz) { ASSERT(ppOperationAz); return E_POINTER; } HRESULT hr = S_OK; CComBSTR bstrName = strOperationName; CComPtr spOperation; hr = m_spAzInterface->OpenOperation(bstrName, CComVariant(), //Reserved &spOperation); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } *ppOperationAz = new COperationAz(spOperation,this); if(!*ppOperationAz) { return E_OUTOFMEMORY; } return S_OK; } HRESULT CApplicationAz ::GetOperationCollection(OUT OPERATION_COLLECTION** ppOperationCollection) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,GetOperationCollection) if(!ppOperationCollection) { ASSERT(ppOperationCollection); return E_POINTER; } CComPtr spAzOperations; HRESULT hr = m_spAzInterface->get_Operations(&spAzOperations); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } *ppOperationCollection = new OPERATION_COLLECTION(spAzOperations, this); if(!*ppOperationCollection) { return E_OUTOFMEMORY; } return S_OK; } HRESULT CApplicationAz:: CreateScope(IN const CString& strScopeName, OUT CScopeAz** ppScopeAz) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,CreateScope) if(!ppScopeAz) { ASSERT(ppScopeAz); return E_POINTER; } CComBSTR bstrName = strScopeName; HRESULT hr = S_OK; CComPtr spScope; hr = m_spAzInterface->CreateScope(bstrName, CComVariant(), //Reserved &spScope); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } *ppScopeAz = new CScopeAz(spScope,this); if(!*ppScopeAz) { return E_OUTOFMEMORY; } return S_OK; } HRESULT CApplicationAz ::DeleteScope(IN const CString& strScopeName) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,DeleteScope) CComBSTR bstrName = strScopeName; HRESULT hr = S_OK; hr = m_spAzInterface->DeleteScope(bstrName, CComVariant()); CHECK_HRESULT(hr); return hr; } HRESULT CApplicationAz ::GetScopeCollection(OUT SCOPE_COLLECTION** ppScopeCollection) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,GetScopeCollection) if(!ppScopeCollection) { ASSERT(ppScopeCollection); return E_POINTER; } CComPtr spAzScopes; HRESULT hr = m_spAzInterface->get_Scopes(&spAzScopes); if(FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } *ppScopeCollection = new SCOPE_COLLECTION(spAzScopes, this); if(!*ppScopeCollection) { hr = E_OUTOFMEMORY; DBG_OUT_HRESULT(E_OUTOFMEMORY); return hr; } return S_OK; } //CContainerAz Override HRESULT CApplicationAz:: CreateAzObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,CreateAzObject) if(!ppBaseAz) { ASSERT(ppBaseAz); return E_POINTER; } switch (eObjectType) { case SCOPE_AZ: { return CreateScope(strName, reinterpret_cast(ppBaseAz)); } case GROUP_AZ: { return CreateGroup(strName, reinterpret_cast(ppBaseAz)); } case TASK_AZ: { return CreateTask(strName, reinterpret_cast(ppBaseAz)); } case ROLE_AZ: { return CreateRole(strName, reinterpret_cast(ppBaseAz)); } case OPERATION_AZ: { return CreateOperation(strName, reinterpret_cast(ppBaseAz)); } default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CApplicationAz:: OpenObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,OpenObject) if(!ppBaseAz) { ASSERT(ppBaseAz); return E_POINTER; } switch (eObjectType) { case GROUP_AZ: { return OpenGroup(strName, reinterpret_cast(ppBaseAz)); } case TASK_AZ: { return OpenTask(strName, reinterpret_cast(ppBaseAz)); } case ROLE_AZ: { return OpenRole(strName, reinterpret_cast(ppBaseAz)); } case OPERATION_AZ: { return OpenOperation(strName, reinterpret_cast(ppBaseAz)); } default: { return E_UNEXPECTED; } } } HRESULT CApplicationAz:: DeleteAzObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,DeleteAzObject) switch (eObjectType) { case SCOPE_AZ: return DeleteScope(strName); case GROUP_AZ: return DeleteGroup(strName); case TASK_AZ: return DeleteTask(strName); case ROLE_AZ: return DeleteRole(strName); case OPERATION_AZ: return DeleteOperation(strName); default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CApplicationAz:: GetAzObjectCollection(IN OBJECT_TYPE_AZ eObjectType, OUT CBaseAzCollection **ppBaseAzCollection) { TRACE_METHOD_EX(DEB_SNAPIN,CApplicationAz,GetAzObjectCollection) if(!ppBaseAzCollection) { ASSERT(ppBaseAzCollection); return E_POINTER; } switch (eObjectType) { case SCOPE_AZ: return GetScopeCollection(reinterpret_cast(ppBaseAzCollection)); case GROUP_AZ: return GetGroupCollection(reinterpret_cast(ppBaseAzCollection)); case TASK_AZ: return GetTaskCollection(reinterpret_cast(ppBaseAzCollection)); case ROLE_AZ: return GetRoleCollection(reinterpret_cast(ppBaseAzCollection)); case OPERATION_AZ: return GetOperationCollection(reinterpret_cast(ppBaseAzCollection)); default: { ASSERT(FALSE); return E_UNEXPECTED; } } } /****************************************************************************** Class: CScopeAz Purpose: Thin wrapper class around IAzApplication interface. ******************************************************************************/ DEBUG_DECLARE_INSTANCE_COUNTER(CScopeAz) CScopeAz::CScopeAz(CComPtr& spAzInterface, CContainerAz* pParentContainerAz) :CRoleTaskContainerAzImpl(spAzInterface, SCOPE_AZ, pParentContainerAz) { DEBUG_INCREMENT_INSTANCE_COUNTER(CScopeAz) SetType(IDS_TYPE_SCOPE); } CScopeAz::~CScopeAz() { DEBUG_DECREMENT_INSTANCE_COUNTER(CScopeAz) } HRESULT CScopeAz:: CreateAzObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { TRACE_METHOD_EX(DEB_SNAPIN,CScopeAz,CreateAzObject) if(!ppBaseAz) { ASSERT(ppBaseAz); return E_POINTER; } switch (eObjectType) { case GROUP_AZ: return CreateGroup(strName, reinterpret_cast(ppBaseAz)); case TASK_AZ: return CreateTask(strName, reinterpret_cast(ppBaseAz)); case ROLE_AZ: return CreateRole(strName, reinterpret_cast(ppBaseAz)); default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CScopeAz:: OpenObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { TRACE_METHOD_EX(DEB_SNAPIN,CScopeAz,OpenObject) if(!ppBaseAz) { ASSERT(ppBaseAz); return E_POINTER; } switch (eObjectType) { case GROUP_AZ: return OpenGroup(strName, reinterpret_cast(ppBaseAz)); case TASK_AZ: return OpenTask(strName, reinterpret_cast(ppBaseAz)); case ROLE_AZ: return OpenRole(strName, reinterpret_cast(ppBaseAz)); default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CScopeAz:: DeleteAzObject(IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName) { TRACE_METHOD_EX(DEB_SNAPIN,CScopeAz,DeleteAzObject) switch (eObjectType) { case GROUP_AZ: return DeleteGroup(strName); case TASK_AZ: return DeleteTask(strName); case ROLE_AZ: return DeleteRole(strName); default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CScopeAz:: GetAzObjectCollection(IN OBJECT_TYPE_AZ eObjectType, OUT CBaseAzCollection **ppBaseAzCollection) { TRACE_METHOD_EX(DEB_SNAPIN,CScopeAz,GetAzObjectCollection) if(!ppBaseAzCollection) { ASSERT(ppBaseAzCollection); return E_POINTER; } switch (eObjectType) { case GROUP_AZ: return GetGroupCollection(reinterpret_cast(ppBaseAzCollection)); case TASK_AZ: return GetTaskCollection(reinterpret_cast(ppBaseAzCollection)); case ROLE_AZ: return GetRoleCollection(reinterpret_cast(ppBaseAzCollection)); default: { ASSERT(FALSE); return E_UNEXPECTED; } } } HRESULT CScopeAz:: CanScopeBeDelegated(BOOL & bDelegatable) { TRACE_METHOD_EX(DEB_SNAPIN,CScopeAz,CanScopeBeDelegated) return GetProperty(AZ_PROP_SCOPE_CAN_BE_DELEGATED,&bDelegatable); } HRESULT CScopeAz:: BizRulesWritable(BOOL &brefBizRuleWritable) { TRACE_METHOD_EX(DEB_SNAPIN,CScopeAz,BizRulesWritable) return GetProperty(AZ_PROP_SCOPE_BIZRULES_WRITABLE,&brefBizRuleWritable); } /****************************************************************************** Class: CTaskAz Purpose: class for IAzTask interface ******************************************************************************/ DEBUG_DECLARE_INSTANCE_COUNTER(CTaskAz) CTaskAz:: CTaskAz(CComPtr& spAzInterface, CContainerAz* pParentContainerAz) :CBaseAzImpl(spAzInterface, TASK_AZ, pParentContainerAz) { DEBUG_INCREMENT_INSTANCE_COUNTER(CTaskAz) CComVariant var; if(SUCCEEDED(m_spAzInterface->GetProperty(AZ_PROP_TASK_IS_ROLE_DEFINITION, CComVariant(), &var))) { ASSERT(var.vt == VT_BOOL); if(var.boolVal == VARIANT_TRUE) SetType(IDS_TYPE_ROLE_DEFINITION); else SetType(IDS_TYPE_TASK); } else SetType(IDS_TYPE_TASK); } CTaskAz::~CTaskAz() { DEBUG_DECREMENT_INSTANCE_COUNTER(CTaskAz) } int CTaskAz:: GetImageIndex() { if(IsRoleDefinition()) return iIconRoleDefinition; else return iIconTask; } HRESULT CTaskAz:: GetMembers(IN LONG lPropId, OUT CList& listMembers) { switch (lPropId) { case AZ_PROP_TASK_OPERATIONS: return GetOperations(listMembers); case AZ_PROP_TASK_TASKS: return GetTasks(listMembers); } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CTaskAz:: AddMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { if(!pBaseAz) { ASSERT(FALSE); return E_POINTER; } switch (lPropId) { case AZ_PROP_TASK_OPERATIONS: case AZ_PROP_TASK_TASKS: { CComVariant varTaskName = pBaseAz->GetName(); HRESULT hr = m_spAzInterface->AddPropertyItem(lPropId, varTaskName, CComVariant()); CHECK_HRESULT(hr); return hr; } } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CTaskAz:: RemoveMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { CComVariant var = pBaseAz->GetName(); switch (lPropId) { case AZ_PROP_TASK_OPERATIONS: case AZ_PROP_TASK_TASKS: { return m_spAzInterface->DeletePropertyItem(lPropId, var, CComVariant()); break; } } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CTaskAz:: GetOperations(OUT CList& listOperationAz) { TRACE_METHOD_EX(DEB_SNAPIN,CTaskAz,GetOperations) HRESULT hr = S_OK; do { CComVariant varOperationList; hr = m_spAzInterface->GetProperty(AZ_PROP_TASK_OPERATIONS, CComVariant(), &varOperationList); BREAK_ON_FAIL_HRESULT(hr); // //Operations are contained by applications, //and they can only be opened at application // CContainerAz* pParetnContainerAz = GetParentAz(); if(pParetnContainerAz->GetObjectType() == SCOPE_AZ) pParetnContainerAz = pParetnContainerAz->GetParentAz(); ASSERT(pParetnContainerAz->GetObjectType() == APPLICATION_AZ); hr = SafeArrayToAzObjectList(varOperationList, pParetnContainerAz, OPERATION_AZ, listOperationAz); BREAK_ON_FAIL_HRESULT(hr); }while(0); return hr; } HRESULT CTaskAz:: GetTasks(OUT CList& listTaskAz) { TRACE_METHOD_EX(DEB_SNAPIN,CTaskAz,GetTasks) HRESULT hr = S_OK; do { CComVariant varTaskList; hr = m_spAzInterface->GetProperty(AZ_PROP_TASK_TASKS, CComVariant(), &varTaskList); BREAK_ON_FAIL_HRESULT(hr); hr = SafeArrayToAzObjectList(varTaskList, GetParentAz(), TASK_AZ, listTaskAz); BREAK_ON_FAIL_HRESULT(hr); }while(0); return hr; } BOOL CTaskAz:: IsRoleDefinition() { CComVariant var; if(SUCCEEDED(m_spAzInterface->GetProperty(AZ_PROP_TASK_IS_ROLE_DEFINITION, CComVariant(), &var))); { ASSERT(var.vt == VT_BOOL); return (var.boolVal == VARIANT_TRUE); } } HRESULT CTaskAz:: MakeRoleDefinition() { CComVariant var = TRUE; SetType(IDS_TYPE_ROLE_DEFINITION); HRESULT hr = m_spAzInterface->SetProperty(AZ_PROP_TASK_IS_ROLE_DEFINITION, var, CComVariant()); CHECK_HRESULT(hr); return hr; } DEBUG_DECLARE_INSTANCE_COUNTER(COperationAz) COperationAz:: COperationAz(CComPtr& spAzInterface, CContainerAz* pParentContainerAz) :CBaseAzImpl(spAzInterface, OPERATION_AZ, pParentContainerAz) { DEBUG_INCREMENT_INSTANCE_COUNTER(COperationAz) SetType(IDS_TYPE_OPERATION); } COperationAz::~COperationAz() { DEBUG_DECREMENT_INSTANCE_COUNTER(COperationAz) } DEBUG_DECLARE_INSTANCE_COUNTER(CRoleAz) CRoleAz:: CRoleAz(CComPtr& spAzInterface, CContainerAz* pParentContainerAz) :CBaseAzImpl(spAzInterface, ROLE_AZ, pParentContainerAz) { DEBUG_INCREMENT_INSTANCE_COUNTER(CRoleAz); SetType(IDS_TYPE_ROLE); } CRoleAz::~CRoleAz() { DEBUG_DECREMENT_INSTANCE_COUNTER(CRoleAz) } HRESULT CRoleAz:: GetMembers(IN LONG lPropId, OUT CList& listMembers) { switch (lPropId) { case AZ_PROP_ROLE_APP_MEMBERS: return GetApplicationGroups(listMembers); case AZ_PROP_ROLE_MEMBERS: return GetWindowsGroups(listMembers); case AZ_PROP_ROLE_OPERATIONS: return GetOperations(listMembers); case AZ_PROP_ROLE_TASKS: return GetTasks(listMembers); } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CRoleAz:: GetWindowsGroups(OUT CList& listWindowsGroups) { TRACE_METHOD_EX(DEB_SNAPIN,CGroupAz,GetWindowsGroups) HRESULT hr = S_OK; CList listSids; do { CComVariant varGroupList; hr = m_spAzInterface->GetProperty(AZ_PROP_ROLE_MEMBERS, CComVariant(), &varGroupList); BREAK_ON_FAIL_HRESULT(hr); hr = SafeArrayToSidList(varGroupList, listSids); BREAK_ON_FAIL_HRESULT(hr); CSidHandler * pSidHandler = GetSidHandler(); if(!pSidHandler) { ASSERT(pSidHandler); return E_UNEXPECTED; } hr = pSidHandler->LookupSids(this, listSids, listWindowsGroups); BREAK_ON_FAIL_HRESULT(hr); }while(0); RemoveItemsFromList(listSids,TRUE); return hr; } HRESULT CRoleAz:: GetApplicationGroups(CList& listGroupAz) { TRACE_METHOD_EX(DEB_SNAPIN,CGroupAz,GetApplicationGroups) HRESULT hr = S_OK; do { CComVariant varGroupList; hr = m_spAzInterface->GetProperty(AZ_PROP_ROLE_APP_MEMBERS, CComVariant(), &varGroupList); BREAK_ON_FAIL_HRESULT(hr); hr = SafeArrayToAzObjectList(varGroupList, GetParentAz(), GROUP_AZ, listGroupAz); BREAK_ON_FAIL_HRESULT(hr); }while(0); return hr; } HRESULT CRoleAz:: GetOperations(OUT CList& listOperationAz) { TRACE_METHOD_EX(DEB_SNAPIN,CTaskAz,GetOperations) HRESULT hr = S_OK; do { CComVariant varOperationList; hr = m_spAzInterface->GetProperty(AZ_PROP_ROLE_OPERATIONS, CComVariant(), &varOperationList); BREAK_ON_FAIL_HRESULT(hr); // //Operations are contained by applications, //and they can only be opened at application // CContainerAz* pParetnContainerAz = GetParentAz(); if(pParetnContainerAz->GetObjectType() == SCOPE_AZ) pParetnContainerAz = pParetnContainerAz->GetParentAz(); ASSERT(pParetnContainerAz->GetObjectType() == APPLICATION_AZ); hr = SafeArrayToAzObjectList(varOperationList, pParetnContainerAz, OPERATION_AZ, listOperationAz); BREAK_ON_FAIL_HRESULT(hr); }while(0); return hr; } HRESULT CRoleAz:: GetTasks(OUT CList& listTaskAz) { TRACE_METHOD_EX(DEB_SNAPIN,CTaskAz,GetTasks) HRESULT hr = S_OK; do { CComVariant varTaskList; hr = m_spAzInterface->GetProperty(AZ_PROP_ROLE_TASKS, CComVariant(), &varTaskList); BREAK_ON_FAIL_HRESULT(hr); hr = SafeArrayToAzObjectList(varTaskList, GetParentAz(), TASK_AZ, listTaskAz); }while(0); return hr; } HRESULT CRoleAz:: AddMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { if(!pBaseAz) { ASSERT(FALSE); return E_POINTER; } switch (lPropId) { case AZ_PROP_ROLE_OPERATIONS: case AZ_PROP_ROLE_TASKS: case AZ_PROP_ROLE_APP_MEMBERS: { CComVariant varName = pBaseAz->GetName(); return m_spAzInterface->AddPropertyItem(lPropId, varName, CComVariant()); } case AZ_PROP_ROLE_MEMBERS: { CString strSid; if(GetStringSidFromSidCachecAz(pBaseAz, &strSid)) { CComVariant var = strSid; return m_spAzInterface->AddPropertyItem(lPropId, var, CComVariant()); } else { return E_FAIL; } } } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CRoleAz:: RemoveMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { switch (lPropId) { case AZ_PROP_ROLE_OPERATIONS: case AZ_PROP_ROLE_TASKS: case AZ_PROP_ROLE_APP_MEMBERS: { CComVariant var = pBaseAz->GetName(); return m_spAzInterface->DeletePropertyItem(lPropId, var, CComVariant()); break; } case AZ_PROP_ROLE_MEMBERS: { CString strSid; if(GetStringSidFromSidCachecAz(pBaseAz, &strSid)) { CComVariant var = strSid; return m_spAzInterface->DeletePropertyItem(lPropId, var, CComVariant()); } else { return E_FAIL; } } } ASSERT(FALSE); return E_UNEXPECTED; } DEBUG_DECLARE_INSTANCE_COUNTER(CGroupAz) CGroupAz:: CGroupAz(CComPtr& spAzInterface, CContainerAz* pParentContainerAz) :CBaseAzImpl(spAzInterface, GROUP_AZ, pParentContainerAz) { DEBUG_INCREMENT_INSTANCE_COUNTER(CGroupAz) CComVariant varType; LONG lGroupType = AZ_GROUPTYPE_BASIC; HRESULT hr = m_spAzInterface->GetProperty(AZ_PROP_GROUP_TYPE, CComVariant(), &varType); if(SUCCEEDED(hr)) { ASSERT(varType.vt == VT_I4); lGroupType = varType.lVal; } SetType((lGroupType == AZ_GROUPTYPE_LDAP_QUERY) ? IDS_TYPE_LDAP_GROUP:IDS_TYPE_BASIC_GROUP); } CGroupAz::~CGroupAz() { DEBUG_DECREMENT_INSTANCE_COUNTER(CGroupAz) } HRESULT CGroupAz ::GetGroupType(LONG* plGroupType) { TRACE_METHOD_EX(DEB_SNAPIN,CGroupAz,GetGroupType) if(!plGroupType) { ASSERT(plGroupType); return E_POINTER; } CComVariant varType; HRESULT hr = m_spAzInterface->GetProperty(AZ_PROP_GROUP_TYPE, CComVariant(), &varType); if(SUCCEEDED(hr)) { ASSERT(varType.vt == VT_I4); *plGroupType = varType.lVal; } return hr; } HRESULT CGroupAz ::SetGroupType(LONG lGroupType) { TRACE_METHOD_EX(DEB_SNAPIN,CGroupAz,SetGroupType) SetType((lGroupType == AZ_GROUPTYPE_LDAP_QUERY) ? IDS_TYPE_LDAP_GROUP:IDS_TYPE_BASIC_GROUP); CComVariant varType = lGroupType; return m_spAzInterface->SetProperty(AZ_PROP_GROUP_TYPE, varType, CComVariant()); } HRESULT CGroupAz:: GetMembers(IN LONG lPropId, OUT CList& listMembers) { switch (lPropId) { case AZ_PROP_GROUP_APP_MEMBERS: return GetApplicationGroups(listMembers, TRUE); case AZ_PROP_GROUP_APP_NON_MEMBERS: return GetApplicationGroups(listMembers, FALSE); case AZ_PROP_GROUP_MEMBERS: return GetWindowsGroups(listMembers, TRUE); case AZ_PROP_GROUP_NON_MEMBERS: return GetWindowsGroups(listMembers, FALSE); } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CGroupAz:: AddMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { if(!pBaseAz) { ASSERT(FALSE); return E_POINTER; } switch (lPropId) { case AZ_PROP_GROUP_APP_MEMBERS: case AZ_PROP_GROUP_APP_NON_MEMBERS: { CComVariant varName = pBaseAz->GetName(); return m_spAzInterface->AddPropertyItem(lPropId, varName, CComVariant()); } case AZ_PROP_GROUP_MEMBERS: case AZ_PROP_GROUP_NON_MEMBERS: { CString strSid; if(GetStringSidFromSidCachecAz(pBaseAz, &strSid)) { CComVariant var = strSid; return m_spAzInterface->AddPropertyItem(lPropId, var, CComVariant()); } else { return E_FAIL; } } } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CGroupAz:: RemoveMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { switch (lPropId) { case AZ_PROP_GROUP_APP_MEMBERS: case AZ_PROP_GROUP_APP_NON_MEMBERS: { CComVariant var = pBaseAz->GetName(); return m_spAzInterface->DeletePropertyItem(lPropId, var, CComVariant()); break; } case AZ_PROP_GROUP_MEMBERS: case AZ_PROP_GROUP_NON_MEMBERS: { CString strSid; if(GetStringSidFromSidCachecAz(pBaseAz, &strSid)) { CComVariant var = strSid; return m_spAzInterface->DeletePropertyItem(lPropId, var, CComVariant()); } else { return E_FAIL; } } } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CGroupAz:: GetApplicationGroups(CList& listGroupAz, BOOL bMember) { TRACE_METHOD_EX(DEB_SNAPIN,CGroupAz,GetApplicationGroups) HRESULT hr = S_OK; do { CComVariant varGroupList; hr = m_spAzInterface->GetProperty(bMember ? AZ_PROP_GROUP_APP_MEMBERS : AZ_PROP_GROUP_APP_NON_MEMBERS, CComVariant(), &varGroupList); BREAK_ON_FAIL_HRESULT(hr); hr = SafeArrayToAzObjectList(varGroupList, GetParentAz(), GROUP_AZ, listGroupAz); BREAK_ON_FAIL_HRESULT(hr); }while(0); return hr; } HRESULT CGroupAz:: GetWindowsGroups(OUT CList& listWindowsGroups, IN BOOL bMember) { TRACE_METHOD_EX(DEB_SNAPIN,CGroupAz,GetWindowsGroups) HRESULT hr = S_OK; CList listSids; do { CComVariant varGroupList; hr = m_spAzInterface->GetProperty(bMember ? AZ_PROP_GROUP_MEMBERS : AZ_PROP_GROUP_NON_MEMBERS, CComVariant(), &varGroupList); BREAK_ON_FAIL_HRESULT(hr); hr = SafeArrayToSidList(varGroupList, listSids); BREAK_ON_FAIL_HRESULT(hr); CSidHandler * pSidHandler = GetSidHandler(); if(!pSidHandler) { ASSERT(pSidHandler); return E_UNEXPECTED; } hr = pSidHandler->LookupSids(this, listSids, listWindowsGroups); BREAK_ON_FAIL_HRESULT(hr); }while(0); RemoveItemsFromList(listSids,TRUE); return hr; } int CGroupAz:: GetImageIndex() { LONG lGroupType = AZ_GROUPTYPE_LDAP_QUERY; if(SUCCEEDED(GetGroupType(&lGroupType)) && lGroupType == AZ_GROUPTYPE_LDAP_QUERY) { return iIconLdapGroup; } else return iIconBasicGroup; } CSidCacheAz:: CSidCacheAz(SID_CACHE_ENTRY *pSidCacheEntry, CBaseAz* pOwnerBaseAz) :CBaseAz(SIDCACHE_AZ,NULL), m_pOwnerBaseAz(pOwnerBaseAz), m_pSidCacheEntry(pSidCacheEntry) { ASSERT(m_pOwnerBaseAz); ASSERT(m_pSidCacheEntry); } CSidCacheAz::~CSidCacheAz() { } int CSidCacheAz::GetImageIndex() { SID_NAME_USE sidType = m_pSidCacheEntry->GetSidNameUse(); if(sidType == SidTypeDeletedAccount || sidType == SidTypeInvalid || sidType == SidTypeUnknown) { return iIconUnknownSid; } else if(sidType == SidTypeUser) { return iIconUser; } else if(sidType == SidTypeComputer) { return iIconComputerSid; } else //Assume everything else is group { return iIconGroup; } } HRESULT CContainerAz::GetAzChildObjects(IN OBJECT_TYPE_AZ eObjectType, OUT CList& ListChildObjects) { HRESULT hr = S_OK; CBaseAzCollection *pBaseAzCollection = NULL; do { //Get the Collection Object hr = GetAzObjectCollection(eObjectType, &pBaseAzCollection); BREAK_ON_FAIL_HRESULT(hr); //Get Count of child objects LONG lCount = 0; hr = pBaseAzCollection->Count(&lCount); BREAK_ON_FAIL_HRESULT(hr); //Add Items to list CBaseAz* pBaseAz = NULL; for(LONG i = 1; i <= lCount; ++i) { pBaseAz = pBaseAzCollection->GetItem(i); if(pBaseAz) { ListChildObjects.AddTail(pBaseAz); } } }while(0); if(FAILED(hr)) { RemoveItemsFromList(ListChildObjects); } if(pBaseAzCollection) delete pBaseAzCollection; return hr; } HRESULT CContainerAz:: GetMembers(IN LONG lPropId, OUT CList& listMembers) { switch (lPropId) { case AZ_PROP_POLICY_ADMINS: case AZ_PROP_POLICY_READERS: case AZ_PROP_DELEGATED_POLICY_USERS: return GetPolicyUsers(lPropId,listMembers); } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CContainerAz:: AddMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { switch (lPropId) { case AZ_PROP_POLICY_ADMINS: case AZ_PROP_POLICY_READERS: case AZ_PROP_DELEGATED_POLICY_USERS: return AddPolicyUser(lPropId,pBaseAz); } ASSERT(FALSE); return E_UNEXPECTED; } HRESULT CContainerAz:: RemoveMember(IN LONG lPropId, IN CBaseAz* pBaseAz) { if(!pBaseAz) { ASSERT(pBaseAz); return E_POINTER; } switch (lPropId) { case AZ_PROP_POLICY_ADMINS: case AZ_PROP_POLICY_READERS: case AZ_PROP_DELEGATED_POLICY_USERS: return RemovePolicyUser(lPropId, pBaseAz); } ASSERT(FALSE); return E_UNEXPECTED; } //+---------------------------------------------------------------------------- // Function: GetAllAzChildObjects // Synopsis: Functions gets the child objects of type eObjectType and appends // them to ListChildObjects. It gets the childobjects from // pParentContainerAz and from parent/grandparent of // pParentContainerAz. //----------------------------------------------------------------------------- HRESULT GetAllAzChildObjects(IN CContainerAz* pParentContainerAz, IN OBJECT_TYPE_AZ eObjectType, OUT CList& ListChildObjects) { if(!pParentContainerAz) { ASSERT(pParentContainerAz); return E_POINTER; } HRESULT hr = S_OK; while(pParentContainerAz) { hr = pParentContainerAz->GetAzChildObjects(eObjectType, ListChildObjects); BREAK_ON_FAIL_HRESULT(hr); if(eObjectType == TASK_AZ) { if(pParentContainerAz->GetObjectType() == APPLICATION_AZ) break; } else if(eObjectType == GROUP_AZ) { if(pParentContainerAz->GetObjectType() == ADMIN_MANAGER_AZ) break; } else { break; } pParentContainerAz = pParentContainerAz->GetParentAz(); } return hr; } HRESULT GetPolicyUsersFromAllLevel(IN LONG lPropId, IN CContainerAz* pContainerAz, OUT CList& listPolicyUsers) { if(!pContainerAz) { ASSERT(pContainerAz); return E_POINTER; } ASSERT((lPropId == AZ_PROP_POLICY_ADMINS) || (lPropId == AZ_PROP_POLICY_READERS) || (lPropId == AZ_PROP_DELEGATED_POLICY_USERS)); HRESULT hr = S_OK; while(pContainerAz && pContainerAz->IsSecurable()) { hr = pContainerAz->GetMembers(lPropId, listPolicyUsers); BREAK_ON_FAIL_HRESULT(hr); pContainerAz = pContainerAz->GetParentAz(); } if(FAILED(hr)) { RemoveItemsFromList(listPolicyUsers); } return hr; } //+---------------------------------------------------------------------------- // Function: OpenObjectFromAllLevels // Synopsis: Opens an object of type eObjectType and name strName. If object // cannot be opened at pParentContainerAz, function tries at // parent/grandparent of pParentContainerAz //----------------------------------------------------------------------------- HRESULT OpenObjectFromAllLevels(IN CContainerAz* pParentContainerAz, IN OBJECT_TYPE_AZ eObjectType, IN const CString& strName, OUT CBaseAz** ppBaseAz) { if(!pParentContainerAz || !ppBaseAz) { ASSERT(pParentContainerAz); ASSERT(ppBaseAz); return E_POINTER; } HRESULT hr = S_OK; while(pParentContainerAz) { hr = pParentContainerAz->OpenObject(eObjectType, strName, ppBaseAz); if(SUCCEEDED(hr)) break; if(eObjectType == TASK_AZ) { if(pParentContainerAz->GetObjectType() == APPLICATION_AZ) break; } else if(eObjectType == GROUP_AZ) { if(pParentContainerAz->GetObjectType() == ADMIN_MANAGER_AZ) break; } else { break; } pParentContainerAz = pParentContainerAz->GetParentAz(); } return hr; } //+---------------------------------------------------------------------------- // Function:SafeArrayToAzObjectList // Synopsis:Input to function is a safearray of BSTR. Each BSTR in array is // name of object of type eObjectType. Function converts this safe // array into a list of corresponding CBaseAz objects. // Arguments:var: Varaint of type VT_ARRAY|VT_BSTR // pParentContainerAz: Pointer of parent which contains objects // in safe array. // eObjectType: Type of object in safe array // listAzObject: Gets list of CBaseAz objects // Returns: //----------------------------------------------------------------------------- HRESULT SafeArrayToAzObjectList(IN CComVariant& var, IN CContainerAz* pParentContainerAz, IN OBJECT_TYPE_AZ eObjectType, OUT CList& listAzObject) { TRACE_FUNCTION_EX(DEB_SNAPIN,SafeArrayToAzObjectList) if((var.vt != (VT_ARRAY | VT_VARIANT)) || !pParentContainerAz) { ASSERT(var.vt == (VT_ARRAY | VT_VARIANT)); ASSERT(pParentContainerAz); return E_INVALIDARG; } HRESULT hr = S_OK; do { BSTR HUGEP *pbstr = NULL; SAFEARRAY *psa = NULL; psa = V_ARRAY(&var); LONG lStart; hr = SafeArrayGetLBound(psa, 1, &lStart); BREAK_ON_FAIL_HRESULT(hr); LONG lEnd; hr = SafeArrayGetUBound(psa, 1, &lEnd); BREAK_ON_FAIL_HRESULT(hr); for (LONG lCurrent = lStart; lCurrent <= lEnd; lCurrent++) { CComVariant varElement; hr = SafeArrayGetElement( psa, &lCurrent, &varElement); BREAK_ON_FAIL_HRESULT(hr); ASSERT(varElement.vt == VT_BSTR); CString strName = varElement.bstrVal; CBaseAz* pBaseAz = NULL; //Open the object. hr = OpenObjectFromAllLevels(pParentContainerAz, eObjectType, strName, &pBaseAz); BREAK_ON_FAIL_HRESULT(hr); listAzObject.AddTail(pBaseAz); } }while(0); if(FAILED(hr)) { RemoveItemsFromList(listAzObject); } return hr; } HRESULT SafeArrayToSidList(IN CComVariant& var, OUT CList& listSid) { TRACE_FUNCTION_EX(DEB_SNAPIN,SafeArrayToSidList) if((var.vt != (VT_ARRAY | VT_VARIANT))) { ASSERT(var.vt == (VT_ARRAY | VT_VARIANT)); return E_INVALIDARG; } HRESULT hr = S_OK; do { BSTR HUGEP *pbstr = NULL; SAFEARRAY *psa = NULL; psa = V_ARRAY(&var); LONG lStart; hr = SafeArrayGetLBound(psa, 1, &lStart); BREAK_ON_FAIL_HRESULT(hr); LONG lEnd; hr = SafeArrayGetUBound(psa, 1, &lEnd); BREAK_ON_FAIL_HRESULT(hr); for (LONG lCurrent = lStart; lCurrent <= lEnd; lCurrent++) { CComVariant varElement; hr = SafeArrayGetElement( psa, &lCurrent, &varElement); BREAK_ON_FAIL_HRESULT(hr); ASSERT(varElement.vt == VT_BSTR); CString strSid = varElement.bstrVal; PSID pSid = NULL; if(!ConvertStringSidToSid(strSid, &pSid)) { hr = E_FAIL; BREAK_ON_FAIL_HRESULT(hr); } listSid.AddTail(pSid); } }while(0); if(FAILED(hr)) { RemoveItemsFromList(listSid, TRUE); } return hr; }