#pragma once #include #include #include "DomainAccount.h" #include "VarSetBase.h" #include #ifndef StringSet typedef std::set<_bstr_t> StringSet; #endif //--------------------------------------------------------------------------- // Container Class // // This class encapsulates the properties of a domain container and the // operations that may be performed on a domain container. //--------------------------------------------------------------------------- class CContainer { public: CContainer(); CContainer(_bstr_t strPath); CContainer(IDispatchPtr sp); CContainer(const CContainer& r); virtual ~CContainer(); // assignment operator CContainer& operator =(_bstr_t strPath); CContainer& operator =(const CContainer& r); // boolean operator // returns true if dispatch interface is not null operator bool() { return m_sp; } IDispatchPtr GetInterface() const { return m_sp; } _bstr_t GetPath(); _bstr_t GetDomain(); _bstr_t GetName(); _bstr_t GetRDN(); // duplicates container hierarchy given a source container void CreateContainerHierarchy(CContainer& rSource); // create a child container given a relative distinguished name virtual CContainer CreateContainer(_bstr_t strRDN); // retrieve a child container given a relative distinguished name virtual CContainer GetContainer(_bstr_t strRDN); virtual void QueryContainers(std::vector& rContainers); virtual void QueryUsers(bool bRecurse, StringSet& setExcludeNames, CDomainAccounts& rUsers); virtual void QueryGroups(bool bRecurse, StringSet& setExcludeNames, CDomainAccounts& rGroups); virtual void QueryComputers(bool bIncludeDCs, bool bRecurse, StringSet& setExcludeNames, CDomainAccounts& rComputers); protected: // duplicates container hierarchy given a source container void CreateContainerHierarchy(CContainer& rSource, bool bParentCreated); // create a child container given a relative distinguished name virtual CContainer CreateContainer(_bstr_t strRDN, bool& bCreated); // recursively delete this container virtual void DeleteContainersRecursively(); protected: IDispatchPtr m_sp; }; typedef std::vector ContainerVector; //--------------------------------------------------------------------------- // Domain Class //--------------------------------------------------------------------------- class CDomain : public CContainer { public: CDomain(); ~CDomain(); bool Initialized() const { return m_bInitialized; } bool UpLevel() const { return m_bUpLevel; } bool NativeMode() const { return m_bNativeMode; } _bstr_t Name() const { _bstr_t strName = m_strDomainNameDns; if (!strName) { strName = m_strDomainNameFlat; } return strName; } _bstr_t NameDns() const { return m_strDomainNameDns; } _bstr_t NameFlat() const { return m_strDomainNameFlat; } _bstr_t ForestName() const { return m_strForestName; } _bstr_t Sid() const { return m_strDomainSid; } _bstr_t DomainControllerName() const { return m_strDcNameDns.length() ? (LPCTSTR)m_strDcNameDns : (LPCTSTR)m_strDcNameFlat; } _bstr_t DomainControllerNameDns() const { return m_strDcNameDns; } _bstr_t DomainControllerNameFlat() const { return m_strDcNameFlat; } void Initialize(_bstr_t strDomainName); DWORD IsAdministrator() { return IsAdminRemote(DomainControllerName()); } virtual CContainer CreateContainer(_bstr_t strRDN); CContainer GetContainer(_bstr_t strRelativeCanonicalPath, bool bCreate = false); virtual void QueryContainers(ContainerVector& rContainers); void QueryUsers(CContainer& rContainer, StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rUsers); void QueryGroups(CContainer& rContainer, StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rGroups); void QueryComputers(CContainer& rContainer, bool bIncludeDCs, StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rComputers); void QueryComputersAcrossDomains(CContainer& rContainer, bool bIncludeDCs, StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rComputers); virtual void QueryUsers(bool bRecurse, StringSet& setExcludeNames, CDomainAccounts& rUsers); virtual void QueryGroups(bool bRecurse, StringSet& setExcludeNames, CDomainAccounts& rGroups); virtual void QueryComputers(bool bIncludeDCs, bool bRecurse, StringSet& setExcludeNames, CDomainAccounts& rComputers); protected: CDomain(const CDomain& r) {} void GetDcName(_bstr_t strDomainName, _bstr_t& strDnsName, _bstr_t& strFlatName); _bstr_t GetGcName(); _bstr_t GetSid(); _bstr_t GetLDAPPath(_bstr_t strDN); _bstr_t GetWinNTPath(_bstr_t strName); _bstr_t GetDistinguishedName(_bstr_t strRelativeCanonicalPath); void QueryObjects(CContainer& rContainer, StringSet& setIncludeNames, StringSet& setExcludeNames, LPCTSTR pszClass, CDomainAccounts& rAccounts); void QueryUsers4(StringSet& setExcludeNames, CDomainAccounts& rUsers); void QueryUsers4(StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rUsers); void QueryGroups4(StringSet& setExcludeNames, CDomainAccounts& rGroups); void QueryGroups4(StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rGroups); void QueryComputers4(bool bIncludeDCs, StringSet& setExcludeNames, CDomainAccounts& rComputers); void QueryComputers4(bool bIncludeDCs, StringSet& setIncludeNames, StringSet& setExcludeNames, CDomainAccounts& rComputers); protected: bool m_bInitialized; bool m_bUpLevel; bool m_bNativeMode; _bstr_t m_strADsPath; _bstr_t m_strDcNameDns; _bstr_t m_strDcNameFlat; _bstr_t m_strGcName; _bstr_t m_strForestName; _bstr_t m_strDomainNameDns; _bstr_t m_strDomainNameFlat; _bstr_t m_strDomainSid; };