Active Directory 工具学习笔记(10.14):第十章·实战脚本包------AdExplorer/AdInsight/AdRestore 一键化落地
- [Active Directory 工具学习笔记(10.14):第十章·实战脚本包------AdExplorer/AdInsight/AdRestore 一键化落地](#Active Directory 工具学习笔记(10.14):第十章·实战脚本包——AdExplorer/AdInsight/AdRestore 一键化落地)
-
- 一、整体打法(Runbook)
- [二、现场脚本 ①:连通性与权限体检(PowerShell)](#二、现场脚本 ①:连通性与权限体检(PowerShell))
- [三、现场脚本 ②:对象与组的"基线快照"](#三、现场脚本 ②:对象与组的“基线快照”)
- [四、定位与取证:AdExplorer 与 AdInsight 的"最小动作"](#四、定位与取证:AdExplorer 与 AdInsight 的“最小动作”)
-
- [4.1 AdExplorer(目录结构与属性)](#4.1 AdExplorer(目录结构与属性))
- [4.2 AdInsight(LDAP 实时洞察)](#4.2 AdInsight(LDAP 实时洞察))
- [五、现场脚本 ③:AdRestore 恢复 + "四件套缝合"](#五、现场脚本 ③:AdRestore 恢复 + “四件套缝合”)
-
- [5.1 恢复单对象(示例:用户 bob)](#5.1 恢复单对象(示例:用户 bob))
- [5.2 批量按 OU 恢复(静默)](#5.2 批量按 OU 恢复(静默))
- [5.3 恢复后的"缝合四件套"(PowerShell)](#5.3 恢复后的“缝合四件套”(PowerShell))
- 六、留痕与差异比对
-
- [6.1 导出"恢复后"基线](#6.1 导出“恢复后”基线)
- [6.2 差异比对(CSV → 简易对比)](#6.2 差异比对(CSV → 简易对比))
- 七、回滚与风控清单
- 八、随拿就用的"口袋命令"
- 结语
Active Directory 工具学习笔记(10.14):第十章·实战脚本包------AdExplorer/AdInsight/AdRestore 一键化落地
目标:把第十章里 AdExplorer / AdInsight / AdRestore 的方法收束为"可直接带去现场"的脚本与操作清单:先基线→再定位→最后恢复,全程留痕、可回滚、可审计。
一、整体打法(Runbook)
- 连通性与权限体检:确认能到 DC、时间同步、凭据有效。
- 拉取基线:导出 OU/组/关键对象清单,记录"谁该在这里"。
- 定位问题 :
- 目录侧:用 AdExplorer 查结构/属性快照(GUI 为主)。
- 客户端/应用侧:用 AdInsight 观察实时 LDAP 调用(GUI 为主,按需筛选)。
- 恢复与缝合 :用 AdRestore 把误删对象拉回,再用 PowerShell 补权限/组成员/密码策略。
- 留痕与复盘:导出操作日志、差异清单,更新快照作为"事后基线"。
二、现场脚本 ①:连通性与权限体检(PowerShell)
powershell
# 0. 日志
$log = ".\AD_FirstAid_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
Start-Transcript -Path $log -Append
# 1. 参数
$DC = "dc1.corp.local"
$TestHosts = @($DC, "gc.corp.local")
$Ports = @(53, 88, 135, 389, 445, 3268) # DNS/Kerberos/RPC/LDAP/SMB/GC
# 2. 连通性
$TestHosts | ForEach-Object {
$h = $_
foreach ($p in $Ports) {
try {
$ok = (New-Object Net.Sockets.TcpClient).ConnectAsync($h, $p).Wait(1500)
"{0}:{1} => {2}" -f $h,$p,($(if($ok){"OK"}else{"FAIL"})) | Write-Host
} catch { "{0}:{1} => FAIL" -f $h,$p | Write-Host }
}
}
# 3. 时间偏差(Kerberos 很敏感,5 分钟都嫌多)
$dcTime = (Invoke-Command -ComputerName $DC { Get-Date }).ToUniversalTime()
$localTime = (Get-Date).ToUniversalTime()
"TimeSkewSeconds={0}" -f [int]($localTime - $dcTime).TotalSeconds | Write-Host
# 4. 身份与权限(当前会话是谁)
whoami /all
Stop-Transcript
用途:一分钟确认"能不能通 "与"是谁在操作",把锅从网络/时间里剥离出来。
三、现场脚本 ②:对象与组的"基线快照"
AdExplorer 的"快照"在 GUI 内完成;脚本侧我们并行拉一份 CSV 基线,用于差异比对与恢复后回填成员。
powershell
$ts = Get-Date -Format 'yyyyMMdd_HHmmss'
$baseDir = ".\Baseline_$ts"; New-Item -ItemType Directory -Force -Path $baseDir | Out-Null
# 1) 最近30天变更的用户/组(便于定位事故窗口)
Get-ADUser -Filter * -Properties whenChanged |
Where-Object { $_.whenChanged -gt (Get-Date).AddDays(-30) } |
Select-Object SamAccountName,Enabled,whenChanged,DistinguishedName |
Export-Csv "$baseDir\users_changed_30d.csv" -NoType
Get-ADGroup -Filter * -Properties whenChanged |
Where-Object { $_.whenChanged -gt (Get-Date).AddDays(-30) } |
Select-Object Name,GroupScope,whenChanged,DistinguishedName |
Export-Csv "$baseDir\groups_changed_30d.csv" -NoType
# 2) 关键组成员基线(示例:Domain Admins / Helpdesk)
$criticalGroups = @("Domain Admins","Helpdesk","Server Local Admins")
foreach($g in $criticalGroups){
Get-ADGroupMember -Identity $g -Recursive |
Select-Object @{n="Group";e={$g}}, Name, ObjectClass, SamAccountName, DistinguishedName |
Export-Csv "$baseDir\group_${g}_members.csv" -Append -NoType
}
# 3) 近30天删除对象(需要回收站/或包含已删除对象查询)
Get-ADObject -IncludeDeletedObjects -Filter 'isDeleted -eq $true' -Properties samaccountname, lastKnownParent, whenChanged |
Where-Object { $_.whenChanged -gt (Get-Date).AddDays(-30) } |
Select-Object samaccountname, lastKnownParent, whenChanged, DistinguishedName |
Export-Csv "$baseDir\deleted_30d.csv" -NoType
四、定位与取证:AdExplorer 与 AdInsight 的"最小动作"
4.1 AdExplorer(目录结构与属性)
- 在 DC/管理机上运行 AdExplorer。
- 定位问题 OU/对象,保存快照(File → Save Snapshot)。
- 用"Search"快速定位
sAMAccountName、lastKnownParent等。 - 发生恢复后,再保存一份快照做 前后对比。
提示:快照是"读档",不是恢复;真正恢复见下节 AdRestore。
4.2 AdInsight(LDAP 实时洞察)
- 选择进程(如应用池
w3wp.exe、服务进程或客户端进程),开始捕获。 - 用过滤器只看 Bind / Search / Modify 关键操作,按域控/客户端 IP 过滤噪音。
- 关注 错误码 (如
invalidCredentials / unwillingToPerform / constraintViolation)与 DN 路径。
抓到"谁在查什么/改什么/报啥错",就能把锅精确扔到配置、权限或密码上。
五、现场脚本 ③:AdRestore 恢复 + "四件套缝合"
恢复动作用 AdRestore;恢复后的"缝合"用 PowerShell。
5.1 恢复单对象(示例:用户 bob)
cmd
:: 在含 AdRestore.exe 的目录或已入 PATH 的 Shell 内执行
AdRestore.exe /filter:"(sAMAccountName=bob)" /restore
5.2 批量按 OU 恢复(静默)
cmd
AdRestore.exe /server:dc1 ^
/filter:"(&(objectClass=user)(lastKnownParent=OU=Sales,DC=corp,DC=local))" ^
/restore /quiet
5.3 恢复后的"缝合四件套"(PowerShell)
powershell
param([Parameter(Mandatory=$true)][string]$UserSam, [string]$TempPwd="Temp#2025!")
$u = Get-ADUser -Identity $UserSam -ErrorAction Stop
Enable-ADAccount $u
Set-ADAccountPassword $u -Reset -NewPassword (ConvertTo-SecureString $TempPwd -AsPlainText -Force)
Set-ADUser $u -ChangePasswordAtLogon $true
# 可选:从基线 CSV 回填组成员
#$csv = Import-Csv ".\Baseline_xxx\group_Domain Admins_members.csv"
#$csv | ? { $_.SamAccountName -eq $UserSam } | % {
# Add-ADGroupMember -Identity $_.Group -Members $UserSam -ErrorAction SilentlyContinue
#}
# 可选:先移至隔离 OU 再回业务 OU
#Move-ADObject $u.DistinguishedName -TargetPath "OU=Recovery,DC=corp,DC=local"
计算机对象恢复后仍无法域信任?用
Reset-ComputerMachinePassword在主机端重置信任关系。
六、留痕与差异比对
6.1 导出"恢复后"基线
与第二节脚本相同,再导一次,放到 Baseline_After_$ts 目录。
6.2 差异比对(CSV → 简易对比)
powershell
$before = Import-Csv .\Baseline_Before\group_Domain Admins_members.csv
$after = Import-Csv .\Baseline_After\group_Domain Admins_members.csv
Compare-Object $before $after -Property SamAccountName,DistinguishedName -PassThru |
Export-Csv .\baseline_diff_DA.csv -NoType
重点看:多了谁/少了谁、OU 是否回到位、对象是否启用与强制改密。
七、回滚与风控清单
- 可逆性 :批量恢复前先导出
deleted_30d.csv;如误恢复,可按 DN 精确删除,或移至隔离 OU。 - 时效性 :超过 DeletedObject 生命周期,必须依赖 备份/权威还原(系统态策略)。
- 最小权限 :恢复与缝合尽量使用 受委派账号,操作全程有 Transcript/日志。
- 变更窗口:涉及大量对象恢复与权限回填,统一纳入维护窗口,提前通知应用与业务方。
- 回收站:如林功能级别允许,评估并启用回收站提升"链接属性"的保留度(一次性动作,需评审)。
八、随拿就用的"口袋命令"
text
# AdRestore(单人/批量)
AdRestore /filter:"(sAMAccountName=bob)" /restore
AdRestore /filter:"(lastKnownParent=OU=Sales,DC=corp,DC=local)" /restore /quiet
# 用户启用 + 强制改密
Enable-ADAccount bob
Set-ADAccountPassword bob -Reset -NewPassword (ConvertTo-SecureString "Temp#2025!" -AsPlainText -Force)
Set-ADUser bob -ChangePasswordAtLogon $true
# 关键组成员导出
Get-ADGroupMember "Domain Admins" -Recursive | Export-Csv DA_members.csv -NoType
# 机器信任重置(在目标机器上)
Reset-ComputerMachinePassword -Server dc1.corp.local
结语
这份脚本包把第十章的三件趁手兵器串成一条流水线:
连通性→基线→定位→恢复→缝合→对比 。
现场只要能开 PowerShell 和 Sysinternals 工具,就能把"误删/错改/配置紊乱"从惊慌转为流程化操作。下一步建议把这些脚本纳入你的 应急仓库 ,配一份你的环境 关键组清单 与 隔离 OU 策略,让 AD 故障处理进入"既快又稳"的常态化。