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)
。FMSO 检查成功。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 林是最后手段,只有在您用尽其他选项后才可以这样做!
另外,我建议您等待几天再接受此处的答案 - 不要只接受第一个提出的答案。