我们如何从现在根本没有作为 DC 响应的 AD 域中恢复?

我们如何从现在根本没有作为 DC 响应的 AD 域中恢复?

Windows Server 2012 是主要的服务器环境。所有机器都位于为网络测试实验室提供服务的服务器机房中。实验室中有 400 多台服务器,其中大部分都是虚拟化的,因此测试实验室可以使用 3500-4000 台机器。

场景:我们的备份 DC 大约一个月前出现故障,但没有人意识到这一点,因为前任管理员刚刚离开,而我们的新基础设施人员正在现场学习我们的网络。DC 出现硬件故障,完全无法使用。

我们的 PDC 开始出现复制问题,并最终给我们发送了一条消息,称由于未完成管理 DC 的角色,它宣布自身无效。此任务无法验证(废话!)。

大约一周前,我们运行了一个 Powershell 脚本,将 400 台机器添加到 AD/域中。大约 25% 的运行过程中,脚本停止识别 PDC 作为域控制器。从那时起,我们就无法将机器添加到域中,目前其他客户端的缓存时间已经用完,因为它们登录到的域没有实际的 PDC。

我们无法从 PDC 中移除损坏的 DC,因此我们无法备份 AD 并迁移数据。

我们迄今所做的

  • 从头创建了两个新的 DC。
  • 当我们尝试让新的 PDC 接管时,原来的 PDC 现已与实验室断开连接。

问题

  • 我们无法备份我们的 GPO 并且无法导出我们的 AD 列表。
  • 我们无法降级原始 PDC,它会出现错误。

有没有办法可以避免从头开始彻底重建我们的 AD?

是否有无需手动重新创建即可恢复 GPO 的选项?

dcdiag 数据

运行 后dcdiag,除 外所有CheckSDRefDom测试均失败。所有 LDAP 相关测试均失败LDAP Error 0x3a (58)。F​​MSO 检查成功。DNS 未能响应并报告为未启动,尽管服务已启动。

我想我们会采纳 Mathius 的建议并将此作为重新设计和学习的机会。

答案1

我担心听起来有点精英主义和居高临下,但从你提供的信息和你提出问题的方式来看,我认为最可行的长期解决方案是

  • 在“新”(新安装的)服务器上使用新的 FQDN 在新林中创建新域
  • 取消所有客户端与现有域的加入
  • 重启并加入新域
  • 在现有域控制器上重新安装操作系统
  • 在服务器上安装 AD DS 并加入新域
  • 利用这个机会重新审视你对 Active Directory 的理解,了解它是什么以及它是如何工作的

微软已经发布了一系列有关 Active Directory 设计和部署的指南,其中值得一提的是:

AD DS 设计指南在 TechNet
Active Directory 域服务指南来自 Microsoft 基础设施和规划指南系列

祝你好运!


备份您的 GPO:

从您最近的更新来看,AD DS 当前似乎无法运行,因此这里是最后一种 GPO 备份和恢复解决方案,不包括链接和 WMI 过滤器。

组策略对象由两部分组成,组策略容器和组策略模板。

容器是活动目录中的一个对象,它保存着用于将给定的 GPO 应用于给定的 OU 的组策略链接 - 如果此时 DSA 对您不可用,您将无法在不安装和探索 NTDS 数据库的离线副本的情况下检索这些链接(这并不像听起来那么容易)。

另一方面,模板包含 GPO 的核心内容、所有设置、名称、版本信息等,并存储在文件系统的 SYSVOL 文件夹中。
使用默认配置,您可以在 中找到所有 GPT C:\Windows\SYSVOL\domain\policies\。使用 GPT 的文件级备份,您将能够重新创建新域中的 GPO,最好使用 PowerShell,如下所示:

$gptBackupFilePath = "C:\backup\policies\"
$ServerName = $env:COMPUTERNAME

Import-Module GroupPolicy

$GPTs = Get-ChildItem $gptBackupFilePath -Directory |Where-Object {$_.Name -imatch "^\{([0123456789abcdef-]){36}\}$"}

foreach($GPT in $GPTs)
{
    if("{31B2F340-016D-11D2-945F-00C04FB984F9}" -eq $GPT.Name.ToUpper())
    {
        Write-Host "Skipping Default Domain Policy "
    }

    if("{6AC1786C-016F-11D2-945F-00C04FB984F9}" -eq $GPT.Name.ToUpper())
    {
        Write-Host "Skipping Default Domain Controllers Policy "
    }
    $GPTPath = $GPT.FullName
    $GPOName = (Get-Content (Join-Path $GPTPath "GPT.ini") |Where-Object {$_ -match "^displayName="}).Substring(12) |Select -First 1
    if(-not($GPOName))
    {
        Write-Warning "Unable to read GPO name from $GPTPath"
        continue
    }

    $newGPO = New-GPO -Name $GPOName -Server $ServerName
    if(-not($?))
    {
        Write-Warning "Unable to create new GPO $GPOName"
        continue
    }

    $GPOGuid = $newGPO.Id.ToString()

    $Destination = Get-Item ("C:\Windows\SYSVOL\domain\policies\{" + $GPOGuid + "}")
    if(-not(Test-Path $Destination))
    {
        Write-Warning "Unable to access new GPT for GPO $GPOName"
        continue
    }

    Get-ChildItem -Path $GPTPath -Recurse -Exclude @("gpt.ini") |Copy-Item -Destination $($_.FullName -replace $GPTPath,$DestinationPath.FullName) -Force
    if($?)
    {
        Write-Host "Successfully recreated GPO $GPOName as $GPOGuid"
    }
}

我怀疑这是一个受支持的解决方案,并且与带有迁移表的常规 GPO 导入不同,您需要手动适当的 UNC 路径其他特定于域的引用。

上述示例旨在在新林中的域控制器上运行,并$gptBackupFilePath更改为包含旧域控制器上 [..]\policies 内容的文件夹


目前只有其他答案可以回答这个问题,这表明您失去了当前拥有 RID 主机 FSMO 角色的域控制器,并且已经耗尽了当前的 RID 池,这很可能是完全正确的,并且您很可能能够从当前状态恢复林。

我建议从头开始,不是使用简单的默认 goto 响应,而是基于个人对 AD 灾难恢复的经验,精心选择的响应,更重要的是,为他人的灾难性灾难恢复工作进行清理

如果您不完全了解健康的 Active Directory 环境应具备哪些功能,而是通过反复试验来执行所要求的操作(FSMO 扣押、元数据清理等),那么潜在的未解决的问题可能仍然存在 - 但对于未经训练的人来说太过难以捉摸,因此是隐藏的。

过去 30 或 60 天内出现的任何不一致可能不会立即显现出来,但如果它真的出现了——你会希望自己有机会从头开始

答案2

我猜死机的服务器是RID 主服务器

域控制器使用相对 ID (RIDS) 池分配唯一的 SIDS。域中的一个 DC,即 RID 主控,负责为每个域控制器提供唯一的池。当域控制器用完 RID 时,它就无法再创建任何安全主体。

在这种情况下,添加更多域控制器根本无济于事。

要修复它,你需要夺取 RID 主机角色在工作 DC 上。重要提示:在您夺得角色后,不要让旧的 RID 主机重新上线! 这可能会导致问题。

另外,建议创建新域的答案比看起来的工作量要大得多。除其他事项外,您现在必须使用新服务帐户配置每台服务器上的每项服务,这可能意味着设置服务主体名称和权限。您现在必须重新创建您的消息系统,可能需要导出和导入每个邮箱。扁平化 AD 林是最后手段,只有在您用尽其他选项后才可以这样做!

另外,我建议您等待几天再接受此处的答案 - 不要只接受第一个提出的答案。

相关内容