//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: copyobj.h // //-------------------------------------------------------------------------- ///////////////////////////////////////////////////////////////////// // copyobj.h #ifndef __COPYOBJ_H_INCLUDED__ #define __COPYOBJ_H_INCLUDED__ ///////////////////////////////////////////////////////////////////// // CCopyableAttributesHolder class CCopyableAttributesHolder { public: CCopyableAttributesHolder() { } ~CCopyableAttributesHolder() { } HRESULT LoadFromSchema(MyBasePathsInfo* pBasePathsInfo); BOOL CanCopy(LPCWSTR lpszAttributeName); private: BOOL _FindInNotCopyableHardwiredList(LPCWSTR lpszAttributeName); CStringList m_attributeNameList; }; ///////////////////////////////////////////////////////////////////// // CCopyObjectHandlerBase class CCopyObjectHandlerBase { public: CCopyObjectHandlerBase() { } virtual ~CCopyObjectHandlerBase() { } IADs* GetCopyFrom() { ASSERT(m_spIADsCopyFrom != NULL); return m_spIADsCopyFrom; } virtual HRESULT Init(MyBasePathsInfo*, IADs* pIADsCopyFrom) { m_spIADsCopyFrom = pIADsCopyFrom; return S_OK; } virtual HRESULT CopyAtCreation(IADs*) { return S_OK; } virtual HRESULT Copy(IADs*, BOOL, HWND, LPCWSTR) { return S_OK; } protected: CComPtr m_spIADsCopyFrom; }; ///////////////////////////////////////////////////////////////////// // CGroupMembershipEntry class CGroupMembershipEntry { public: enum actionType { none, add, remove}; CGroupMembershipEntry(DWORD dwObjectRID, LPCWSTR lpszDistinguishedName) { m_dwObjectRID = dwObjectRID; m_szDistinguishedName = lpszDistinguishedName; m_action = none; m_hr = S_OK; } ~CGroupMembershipEntry() { } LPCWSTR GetDN() { return m_szDistinguishedName; } DWORD GetRID() { return m_dwObjectRID; } BOOL IsPrimaryGroup() { return m_dwObjectRID != 0x0; } actionType GetActionType() { return m_action; } void MarkAdd() { m_action = add; } void MarkRemove() { m_action = remove; } #ifdef DBG LPCWSTR GetActionString() { if (m_action == none) return L"none"; else if (m_action == add) return L"add"; return L"remove"; } #endif // DBG public: HRESULT m_hr; private: CString m_szDistinguishedName; // DN of the group DWORD m_dwObjectRID; // RID (valid only if it is the primary group) actionType m_action; }; ///////////////////////////////////////////////////////////////////// // CGroupMembershipEntryList class CGroupMembershipEntryList : public CList { public: ~CGroupMembershipEntryList() { _RemoveAll(); } CGroupMembershipEntry* FindByDN(LPCWSTR lpszDN) { for (POSITION pos = GetHeadPosition(); pos != NULL; ) { CGroupMembershipEntry* pEntry = GetNext(pos); if (wcscmp(lpszDN, pEntry->GetDN()) == 0) { return pEntry; } } return NULL; } void Merge(CGroupMembershipEntryList* pList) { while(!pList->IsEmpty()) AddTail(pList->RemoveHead()); } #ifdef DBG void Trace(LPCWSTR lpszTitle) { TRACE(L"\n%s\n\n", lpszTitle); for (POSITION pos = GetHeadPosition(); pos != NULL; ) { CGroupMembershipEntry* pEntry = GetNext(pos); TRACE(L"action = %s RID %d, DN = <%s> \n", pEntry->GetActionString(), pEntry->GetRID(), pEntry->GetDN()); } TRACE(L"\n"); } #endif // DBG private: void _RemoveAll() { while(!IsEmpty()) delete RemoveHead(); } }; ///////////////////////////////////////////////////////////////////// // CSid class CSid { public: CSid() { m_pSID = NULL; } ~CSid() { if (m_pSID != NULL) free(m_pSID); } HRESULT Init(IADs* pIADs); BOOL Init(size_t nByteLen, PSID pSID) { if ((nByteLen == 0) || (pSID == NULL)) return FALSE; m_pSID = malloc(nByteLen); if (m_pSID == NULL) return FALSE; memcpy(m_pSID, pSID, nByteLen); return TRUE; } PSID GetSid() { return m_pSID;} private: PSID m_pSID; }; ///////////////////////////////////////////////////////////////////// // CGroupMembershipHolder class CGroupMembershipHolder { public: CGroupMembershipHolder() { m_bPrimaryGroupFound = FALSE; } ~CGroupMembershipHolder() { } HRESULT Read(IADs* pIADs); HRESULT CopyFrom(CGroupMembershipHolder* pSource); HRESULT Write(); void ProcessFailures(HRESULT& hr, CString& szFailureString, BOOL* pPrimaryGroupFound); private: HRESULT _ReadPrimaryGroupInfo(); HRESULT _ReadNonPrimaryGroupInfo(); CComPtr m_spIADs; // object ADSI pointer CSid m_objectSid; // object SID CString m_szDomainLDAPPath; // LDAP path of the domain the object is in CGroupMembershipEntryList m_entryList; BOOL m_bPrimaryGroupFound; }; ///////////////////////////////////////////////////////////////////// // CCopyUserHandler class CCopyUserHandler : public CCopyObjectHandlerBase { public: CCopyUserHandler() { m_bPasswordCannotChange = FALSE; m_bPasswordMustChange = FALSE; m_hrFailure = S_OK; m_bPrimaryGroupFound = FALSE; m_bNeedToCreateHomeDir = FALSE; } virtual HRESULT Init(MyBasePathsInfo* pBasePathsInfo, IADs* pIADsCopyFrom); virtual HRESULT CopyAtCreation(IADs* pIADsCopyTo) { return _CopyAttributes(pIADsCopyTo); } virtual HRESULT Copy(IADs* pIADsCopyTo, BOOL bPostCommit, HWND hWnd, LPCWSTR lpszObjectName); BOOL PasswordCannotChange() { return m_bPasswordCannotChange; } BOOL PasswordMustChange() { return m_bPasswordMustChange; } void _ShowGroupMembershipWarnings(HWND hWnd, LPCWSTR lpszObjectName); private: HRESULT _ReadPasswordCannotChange(); HRESULT _ReadPasswordMustChange(); HRESULT _CopyAttributes(IADs* pIADsCopyTo); HRESULT _CopyGroupMembership(IADs* pIADsCopyTo); HRESULT _UpdatePaths(IADs* pIADsCopyTo); HRESULT _CreateHomeDirectory(IADs* pIADsCopyTo, LPCWSTR lpszObjectName, HWND hWnd); CCopyableAttributesHolder m_copyableAttributesHolder; CGroupMembershipHolder m_sourceMembershipHolder; BOOL m_bPasswordCannotChange; BOOL m_bPasswordMustChange; HRESULT m_hrFailure; CString m_szFailureString; BOOL m_bPrimaryGroupFound; BOOL m_bNeedToCreateHomeDir; }; #endif // __COPYOBJ_H_INCLUDED__