Active Directory 工具学习笔记(10.14):第十章·实战脚本包——AdExplorer/AdInsight/AdRestore 一键化落地

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)

  1. 连通性与权限体检:确认能到 DC、时间同步、凭据有效。
  2. 拉取基线:导出 OU/组/关键对象清单,记录"谁该在这里"。
  3. 定位问题
    • 目录侧:用 AdExplorer 查结构/属性快照(GUI 为主)。
    • 客户端/应用侧:用 AdInsight 观察实时 LDAP 调用(GUI 为主,按需筛选)。
  4. 恢复与缝合 :用 AdRestore 把误删对象拉回,再用 PowerShell 补权限/组成员/密码策略。
  5. 留痕与复盘:导出操作日志、差异清单,更新快照作为"事后基线"。

二、现场脚本 ①:连通性与权限体检(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"快速定位 sAMAccountNamelastKnownParent 等。
  • 发生恢复后,再保存一份快照做 前后对比

提示:快照是"读档",不是恢复;真正恢复见下节 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 故障处理进入"既快又稳"的常态化。

相关推荐
遇到困难睡大觉哈哈5 小时前
HarmonyOS 关系型数据库 RDB 数据持久化(ArkTS)实战:建库建表、CRUD、事务、FTS、性能优化,一篇搞懂
笔记·华为·harmonyos
东华万里5 小时前
第十四篇 操作符详讲
c语言·学习·大学生专区
nwsuaf_huasir5 小时前
深度学习2-pyTorch学习-张量基本操作
pytorch·深度学习·学习
d111111111d5 小时前
江协科技-PID基本原理-(学习笔记)-主页有所有STM32外设的笔记基本都是万字起步。
笔记·科技·stm32·单片机·嵌入式硬件·学习
winner88815 小时前
深入理解 find 与 grep 路径参数位置差异:Unix 哲学下的设计逻辑
服务器·unix
啦哈拉哈5 小时前
【Python】知识点零碎学习3
开发语言·python·学习
ℳ₯㎕ddzོꦿ࿐5 小时前
先立后破:Linux 下“新建管理员 → 验证 → 禁用 root 远程 SSH”的零翻车笔记
linux·笔记·ssh
LO嘉嘉VE5 小时前
学习笔记二十九:贝叶斯决策论
人工智能·笔记·学习
2401_834517075 小时前
AD学习笔记-33 丝印位号的调整
笔记·学习