ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ADCollector源码解析(一):ICollector/IDisplay/IResult接口设计与SOLID原则落地

2026/8/24 17:27:51 拓冰建站 浏览量
ADCollector源码解析(一):ICollector/IDisplay/IResult接口设计与SOLID原则落地 ADCollector源码解析(一)ICollector/IDisplay/IResult接口设计与SOLID原则落地【免费下载链接】ADCollectorA lightweight tool to quickly extract valuable information from the Active Directory environment for both attacking and defending.项目地址: https://gitcode.com/gh_mirrors/ad/ADCollectorADCollector是一款轻量级Active DirectoryAD枚举工具能快速从域环境中提取高价值信息特权账户、委托配置、ACL、ADCS 等兼顾攻防两方的 Recon 场景。本文作为ADCollector源码解析系列的第一篇聚焦三个核心接口ICollector / IResult / IDisplay带你读懂它「采集 → 结果 → 展示」三段式架构的设计思路并逐条落地SOLID原则帮助新手快速建立对这款 AD 枚举工具的整体认知。想跟着读源码的话先克隆仓库git clone https://gitcode.com/gh_mirrors/ad/ADCollector为什么AD枚举工具需要干净的架构 先理解作者的困境才能理解这套接口为什么存在。从 README.md 可以看到ADCollector 内置了 30 项枚举功能域/林信息、信任关系、特权用户、无约束委托、SPN 账户、ASREP Roast 账户、ADCS 证书模板、SYSVOL 中的 GPP 口令……而且数据源各不相同有的走 LDAP 查询有的读 SYSVOL 文件有的调用 Win32 原生 API输出格式各不相同有的输出键值对表格有的输出 SID 列表有的输出 LDAP 对象属性。如果全部塞进一个大函数代码会变成意大利面。作者的解法是把一次枚举动作拆成三个独立角色角色职责核心抽象代码位置 采集执行查询、返回数据ICollectorCollector/ 结果标准化的数据容器IResultResults/️ 展示把数据渲染到终端IDisplayDisplay/三者各司其职通过抽象接口松耦合。下面逐个拆解。三个核心接口ADCollector架构骨架IResult接口设计最小的统一结果契约先看最简洁的一个 —— IResult.cspublic interface IResult { string Title { get; set; } }整个接口只有一个Title属性却承担了整个架构中数据契约的角色每个枚举任务的输出都被装进一个IResult实现类例如 LDAPResult.cs 装 LDAP 对象列表、ListResult.cs 装字符串列表如嵌套组成员、DLResult.cs 装键值对表格如 LDAP 基本信息采集层只管生产IResult展示层只管消费IResult双方互不知道对方的具体类型这是典型的依赖倒置。ICollector接口设计单方法的采集器ICollector.cs 同样只有唯一方法public interface ICollector { IResult Collect(SearchString searchstring); }约定非常清晰输入一个搜索字符串输出一个结果对象。Collector/ 目录下有 4 个实现CollectWithFilter.cs通用 LDAP 过滤查询内部把原始属性值转成可读字符串如 SID、时间戳CollectNestedGroupMembership.cs通过tokenGroups构造属性一次性拿到用户的嵌套组成员关系避免逐层递归查询CollectAppliedGPO.cs枚举对象实际生效的 GPOCollectSYSVOL.cs处理 SYSVOL 文件访问。IDisplay接口设计抽象类静态方法的小心机IDisplay.cs 有点特别它不是接口而是抽象类public abstract class IDisplay { public static void DisplayTitle(string Title) { ... } // 统一的绿色标题栏 public abstract void DisplayResult(IResult collectResult); }两个设计点值得新手注意DisplayTitle是静态方法所有展示器共享同一套标题输出风格[-] Title:保证终端输出格式统一无需每个子类重复实现DisplayResult是抽象方法每个子类只负责一种数据的渲染Display/ 目录下有 8 个实现如DisplayLDAPObjectsLDAP 对象表、DisplayList纯列表、DisplayDACL访问控制列表、DisplayADCS证书服务信息等。一次完整枚举的数据流从命令行到终端把上面的接口串起来ADCollector.cs 中的Collect方法就揭示了整条数据流命令行参数 (Options.cs) │ ▼ Program.ChooseOption() ── 分发功能开关 │ ▼ BuildSearchString ── 把功能翻译成 SearchString搜索意图 │ ▼ ICollector.Collect() ── 采集LDAP / SYSVOL / API │ ▼ IResult ── 统一数据容器 │ ▼ IDisplay.DisplayResult() ── 渲染输出 其中 ADCollector.cs 的Collect(ListSearchString)方法里有一个巧妙的配对逻辑根据SearchString的具体类型自动选出配套的采集器和展示器SearchString 类型采集器展示器LDAPSearchStringCollectWithFilterDisplayLDAPObjectsNestedGMSearchStringCollectNestedGroupMembershipDisplayListAppliedGPOSearchStringCollectAppliedGPODisplayDDSearchString/ 目录下的每种搜索字符串在采集端和展示端都有一对一实现。搜索意图、采集、渲染被类型这条线串起来新增功能时照着抄一套即可。SOLID原则落地逐条对照源码S — 单一职责原则SRP采集器只做采集CollectWithFilter不含任何打印逻辑展示器只做渲染DisplayList不发起任何查询连接管理独立在 Searcher.cs它专门负责 LDAP 连接池、分页查询、根 DSE 信息初始化采集器只需调用Searcher.GetResultEntries()。O — 开闭原则OCP这套架构最大的红利扩展新功能不需要修改已有代码。假设要新增枚举域内所有计算机的某属性只需写一个SearchString子类描述查询意图实现一个ICollector子类或直接复用CollectWithFilter实现一个IResult子类装数据实现一个IDisplay子类渲染。四个新文件搞定主流程 ADCollector.cs 几乎不动 —— 对扩展开放对修改关闭。L — 里氏替换原则LSPIResult的实现类LDAPResult、ListResult、DLResult…都可以无缝替换进DisplayResult(IResult collectResult)的参数位置ICollector的任意实现也都满足Collect的输入输出约定。抽象契约保证了换而不坏。I — 接口隔离原则ISP三个接口都刻意保持最小化IResult只有 1 个属性ICollector只有 1 个方法IDisplay只有 1 个抽象方法。实现类不会被迫依赖用不到的成员这也让每个实现类的测试和维护成本极低。D — 依赖倒置原则DIP主流程只依赖抽象ADCollector.Collect()中声明的是ICollector/IDisplay/IResult类型而非具体类。采集层与展示层之间完全通过IResult解耦——即使把终端展示换成 JSON 导出或图形界面采集逻辑一行都不用改。⚖️ 一点客观评价Program.cs 的ChooseOption中仍按命令行开关直接 new 具体类做分发这是轻量工具在极致整洁与代码量之间的务实取舍。对新手而言读懂接口层的纯度远比纠结入口处的具体化更重要。小结这套接口设计教会我们什么设计要点ADCollector 的做法契约要小三个接口平均不到 5 行代码数据与视图分离IResult作为采集/展示之间的信封用类型驱动扩展SearchString子类同时决定采集器和展示器SOLID 不是口号每条原则都能在 ICollector.cs、IDisplay.cs、IResult.cs 中找到对应代码对于正在学习 C# 或软件设计的同学ADCollector 是一个难得的小而完整的范本代码量不大但把接口设计、依赖倒置、策略替换这些核心概念用在了真实的安全工具场景里。建议的阅读路径是Program.cs → ADCollector.cs → 三接口 → 各实现类对照本文的表格逐个文件验证一个下午就能走通全部主流程。下一篇将深入Searcher的 LDAP 连接池与分页查询实现以及SearchString体系的构建细节敬请关注 【免费下载链接】ADCollectorA lightweight tool to quickly extract valuable information from the Active Directory environment for both attacking and defending.项目地址: https://gitcode.com/gh_mirrors/ad/ADCollector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考