Cyber-tools/AD-Toolkit
GitHub: Cyber-tools/AD-Toolkit
一个交互式 PowerShell 脚本工具,用于端到端初始化 Windows Server 并完成 AD DS 域控提升、安全加固 GPO 配置及基础服务角色部署。
Stars: 2 | Forks: 0
# Init-WindowsServer
用于全面初始化 **Windows Server 2019/2022/2025** 服务器的交互式 PowerShell 脚本:包含更新、静态 IP、重命名、提升为域控制器、基于 **AGDLP** 模型的 Active Directory 结构(OU、用户、计算机、全局组 GG、本地域组 GDL)、**安全加固 GPO (ANSSI/NIST)**、文件服务器(SMB 共享 + 细粒度 NTFS ACL)以及辅助角色(DHCP、WSUS、RDS、IIS、Hyper-V)。
单文件,无外部依赖。可在**英文或法文**操作系统上运行(身份通过 SID 解析)。幂等设计:可重复运行且不会产生重复项,并支持**每次重启后自动恢复**(状态文件为 `%ProgramData%\InitWindowsServer\state.json`)。
## 前置条件
- Windows Server 2019、2022 或 2025(桌面体验版或带有服务器 RSAT 工具的 Core 版)
- Windows PowerShell **5.1**(操作系统内置),兼容 PowerShell 7+
- Administrators 组成员账户(脚本会自动触发 UAC 提权)
- 仅在可选的更新步骤(PSWindowsUpdate 模块)需要 Internet 访问
## 使用说明
```
# 交互式执行(阶段 1 在成员服务器上,阶段 2 在域控制器上)
.\Init-WindowsServer.ps1
# 模拟:显示将要执行的操作,而不创建任何内容
.\Init-WindowsServer.ps1 -WhatIf
# 不包含屏幕截图(Server Core,无桌面会话)
.\Init-WindowsServer.ps1 -NoScreenshots
# 非交互式,由配置文件驱动(参见 config.sample.psd1)
.\Init-WindowsServer.ps1 -ConfigFile .\config.sample.psd1 -Unattended
# 重置脚本创建的内容(参见下文)
.\Init-WindowsServer.ps1 -Reset
```
执行流程:
1. **阶段 1**(未提升的服务器):Windows 更新、静态 IP、重命名、时区,随后安装 AD DS 并进行提升。每次重启后,**请重新运行脚本**:它将从中断处继续执行。
2. **阶段 2**(检测到域控制器):重新加载现有 AD,随后脚本将提供域密码策略(ANSSI),创建 OU/用户/计算机/GG/GDL,设置有限期的外部供应商账户,配置 GPO(包含 39 条可选应用或打包应用的加固规则目录),设置仅限 GDL 访问的共享(严格的 AGDLP 模型)并启用基于访问的枚举,针对 OU 的控制委派,Windows LAPS 准备,可选角色以及 AD 访问审计。
每个阶段结束时,都会默认在 `C:\Rapports\` 目录中生成一份**PDF 执行报告**(无需 Office):包含标题(脚本/服务器/日期)、关键信息(IP、域、OU/GG/GDL、共享、角色)、**已创建账户列表(登录名 / 明文密码 / OU)**、带有时间戳的步骤日志,以及**每个主要步骤结束时的屏幕截图**。同时会附带一份 `.txt` 摘要(不含密码)。
### PDF 生成策略(按顺序)
报告将通过第一个可用的策略生成,所有策略均**无需 Microsoft Office**:
1. **PSWritePDF** 模块(如果已安装);
2. **PdfSharp** 库(将 `PdfSharp.dll` 放置于脚本旁的 `lib\` 子目录或 `%ProgramData%\InitWindowsServer\lib\` 下);
3. 通过 Windows “Print to PDF” 管道进行 **HTML 打印**(如果存在则使用无头 Edge,否则使用 *Microsoft Print to PDF* 打印机);
4. **内置的原生极简 PDF 生成器**(无依赖,始终可用,支持嵌入截图);
5. 最终回退:独立的 **HTML** 报告(截图以 base64 格式嵌入)。
屏幕截图(带时间戳的 PNG)保存在 `C:\Rapports\captures\` 中,并插入到 PDF 的相应部分。可通过 `-NoScreenshots`(或 `Report.NoScreenshots = $true`)禁用。报告和截图的生成是**非阻塞的**:在 Server Core 或无桌面会话中,失败将被记录在日志中,脚本会继续执行。
## 密码
脚本中没有任何硬编码的敏感信息。每个用户的初始密码均是随机生成的(`New-RandomPassword`)或由管理员一次性输入(可选择),在控制台摘要中**明文显示**(表格 `登录名 | (明文) 密码 | OU`)并在 PDF 报告中展示以便初次分发,随后**强制要求在首次登录时更改密码**(`-ChangePasswordAtLogon`)。
## 防病毒软件(可能出现误报)
截图功能使用了公开且有文档记录的 .NET API `System.Drawing.Graphics.CopyFromScreen`。由于其与安全加固设置(LSA、防病毒、USB等)**共存于同一文件中**,可能会被某些启发式防病毒软件(尤其是 Windows Defender/AMSI)错误地识别为间谍软件特征。
为避免这种**误报**,脚本通过**反射**而不是直接通过其字面名称来解析此方法:这一处理在代码中有明确的注释说明,该操作依然只是简单的屏幕截图,会被记录在日志中,并且可以通过 `-NoScreenshots` 禁用。如果您的防病毒软件依然阻止执行,请使用 `-NoScreenshots` 运行,或者在您的服务器上为该脚本添加排除项。
## ANSSI 加固与域策略
GPO 配置器提供了一个包含 **39 条规则**的目录,分为 9 个类别,均可按需应用或打包应用,并通过 GPO 推送到您选择的 OU:
| 类别 | 主题 | 规则示例 |
|---|---|---|
| 1 | 终端安全 | 防火墙、增强的 UAC、BitLocker(在 AD 中备份密钥) |
| 2 | 网络加固 (ANSSI) | Kerberos AES、禁用 NTLMv1、SMB 签名、关闭 SMBv1、关闭 LLMNR、RDP NLA |
| 3 | 审计与日志 | 事件 4688 中的命令行记录、PowerShell 日志记录/转录 |
| 4 | 终端管理 | Windows LAPS、WSUS、关闭 Autorun、阻止 USB 写入 |
| 5 | 用户限制 | CMD、任务管理器、控制面板、Regedit |
| 6 | 锁定与横幅 | 安全屏幕保护程序、法律声明横幅、隐藏上次登录用户名 |
| 7 | 减少攻击面 | USBSTOR、可移动存储、PowerShell RemoteSigned |
| 8 | 凭据保护 (ANSSI) | 关闭 WDigest、LSA 保护、受限缓存、限制匿名访问 |
| 9 | 终端防护 | SmartScreen、Defender PUA 防护、强制高级审计 |
这些设定基于经过验证的真实注册表项。具有潜在副作用(LSA 保护、RDP NLA、完全阻止 PowerShell)的规则附带有警告,且保持可选状态。**请在投入生产环境前在测试环境中进行验证。**
在阶段 2,脚本还提供应用**域密码和锁定策略**的选项(长度 12、复杂性要求、历史记录 24、90 天过期、5/15 分钟锁定),该策略符合 ANSSI 建议和 B1-M8 培训模块。所有值均可配置(参见 `DomainPasswordPolicy` 部分)。
这些措施涵盖了“保护用户终端和移动设备”模块的内容(本地账户、AD/AGDLP 网络权限、加密、加固)。以下内容由于超出了 GPO 脚本的范围,被特意保留为手动步骤:实际激活 BitLocker(`manage-bde`,选择 TPM/PIN)、AppLocker/WDAC 规则(XML 策略)、MFA、移动设备管理 (MDM)。
## 访问权限管理 (模块 B1-M9)
阶段 2 集成了多项精细的权限管理操作,符合 AGDLP 和最小权限原则:
- **AD 访问审计(只读)**:特权组成员(Administrators、Domain/Enterprise/Schema Admins、Operators 等)、休眠账户(阈值可配置)以及风险账户(不需要密码或密码不过期)。结果将呈现在 PDF 报告中。也可在非交互模式下使用 (`AccessAudit`)。
- 共享上的**基于访问的枚举 (ABE)**:每个用户只能看到其有权访问的内容 (`Set-SmbShare -FolderEnumerationMode AccessBased`)。
- **有限期的外部供应商账户**:专用的 OU 和 GDL,账户自动过期,可选的登录工作站限制 (`LogonWorkstations`),生成密码并强制在首次访问时修改。
- **针对 OU 的控制委派**:通过 `dsacls` 将特定任务(重置密码、管理组成员、创建/删除账户)委派给某个组,无需授予域管理权限。委派的 ACE 不会在“biere”重置过程中被移除。
- **AD 端的 Windows LAPS 准备**:扩展架构 (`Update-LapsADSchema`) 以及委派密码读取权限 (`Set-LapsADReadPasswordPermission`);客户端部分通过 GPO 规则 1 (LAPS) 激活。如果缺少 Windows LAPS cmdlet,则会被妥善跳过。
以下内容作为手动步骤保留(无法通过 AD/GPO 脚本完全简化):专用管理站 (PAW) 及相关的“拒绝登录”策略、文件夹重定向、GPO 环回处理。
## “biere”重置
脚本会在 `state.json` 中记录**它创建的每个对象**(OU、组、用户、计算机、GPO、GPO 链接、共享、文件夹)。重置功能(在脚本末尾提供或通过 `-Reset` 访问)仅删除**这些被记录的对象**,绝不删除任何复用的现有对象。
保护机制:
1. 精确输入单词 `biere`(区分大小写:任何其他输入都将取消操作);
2. 提供即将删除内容的详细摘要,然后进行**第二次 Y/N 确认**;
3. 删除**文件夹**(涉及数据!)需要单独的额外确认;
4. 幂等且容错的执行过程:已缺失的对象会被忽略且不报错;包含非脚本创建对象的 OU 将被**保留**并给出提示;
5. **域控制器的降级绝不包含在内**:这是一个独立的选项,会单独提供,要求准确输入域的 DNS 名称,并在执行 `Uninstall-ADDSDomainController` 之前进行最后一次确认。
每一次删除都会被记入日志,并生成重置报告。
## 仓库内容
| 文件 | 作用 |
|---|---|
| `Init-WindowsServer.ps1` | 核心脚本(单文件、UTF-8 BOM,PSScriptAnalyzer 0 警告) |
| `config.sample.psd1` | 用于 `-Unattended` 模式的配置示例 |
| `Tests/Init-WindowsServer.Tests.ps1` | 针对纯实用工具函数的 Pester v5 测试 |
| `.gitignore` | 忽略报告、截图、本地状态和本地 DLL(从不进行版本控制) |
| `.gitattributes` | 规范化换行符(`.ps1` 使用 CRLF,其余使用 LF) |
| `CHANGELOG.md` | 修复和更新历史 |
| `LICENSE` | MIT 许可证 |
## 测试
```
Install-Module Pester -MinimumVersion 5.0 -Scope CurrentUser
Invoke-Pester -Path .\Tests
```
测试通过 dot-sourcing 引入脚本(入口点已受保护),涵盖验证器、密码生成器、XML 转义、NTFS 到 SMB 的映射、v2 状态文件、PDF 换行以及 PDF 报告生成(原生生成器 + HTML 回退)。
## 许可证
[MIT](LICENSE):自由使用、修改、分享。如果这个脚本救了你的命...*找个机会请 Quentin 和 Max 喝杯啤酒吧!* 🍺
标签:Active Directory, AI合规, IPv6, Libemu, Plaso, PowerShell, Terraform 安全, Windows Server, 基础架构配置, 多人体追踪, 数字取证, 系统加固, 系统运维, 自动化脚本