我们的一个 AD 存在问题:创建一个新对象将会删除另一个对象。
在其中一个DC中,我们记录了以下消息:
“SAM 数据库中有两个或多个具有相同 SID 属性的对象”
此 AD 最近在站点迁移期间被克隆:我们将原始 AD(所有机器)克隆到新 AD 中,并在运行测试时并行运行它(这两个 AD 实际上没有任何连接)。我们对文件服务器数据执行了增量更新(使用新基础架构上的“桥接”机器,它是唯一可以连接到两个位置的机器,不是 DC,无法连接到旧基础架构上的 DC)。
现在,这种情况发生了两次:创建新对象(任何对象:用户、组、计算机帐户等)会导致使用与现有对象相同的 SID 创建对象,此时两个对象都会立即被删除。我们发现了这一点,因为当我们尝试创建新用户帐户时,新创建的文件服务器突然从域中删除(我们必须将其重新添加到域)
现在,我们已尝试使两个 DC 上的 RID 池无效,但这似乎并未解决问题。
我们从 AD 中导出了所有 SID,并找到了最大的一个:S-1-5-21-XXXXXX-XXX-XXXXX-7601
然后我们使用Dcdiag.exe /TEST:RidManager /v
RID 主服务器检查了我们的 DC,得到了以下信息:
* rIDAllocationPool is 7600 to 8099
The DS has corrupt data: rIDPreviousAllocationPool value is not valid
* rIDPreviousAllocationPool is 0 to 0
* rIDNextRID: 0
No rids allocated -- please check eventlog.
所以:首先,我们收到了The DS has corrupt data: rIDPreviousAllocationPool value is not valid
消息。我不知道这是因为自从 RID 重置以来我们还没有分配新对象,还是因为这是一个真正的错误。可以肯定的是,事件日志中没有错误,只有关于 RID 池失效的信息性消息。
第二,rID分配池确实从 7600 开始,这暗示下一个要创建的对象很可能使用 RID7600它低于目前更高的 7601 SID,可能会导致删除问题(并且由于 RID 为 7601 的对象是我们必须将其重新添加到 AD 的文件服务器,因此会导致许多问题)。
所以:除了我不知道我们怎么会遇到这样的问题,因为我们从来没有将 AD 恢复到以前的状态之外,我该如何解决它?
答案1
我们已经修复了这个问题,但还没有找到根本原因。非常感谢那些试图提供帮助的人。
问题的根本原因是一台 AD 服务器的 RID 池无效。我们尝试通过使该计算机上的 RID 池无效来修复此问题,但在修复过程中我们犯了两个严重错误:首先,我们使错误服务器上的池无效。当我们意识到这一点时,我们又犯了第二个错误,即使另一台系统上的池无效,导致两台计算机上的所有池信息都丢失。
为了解决这个问题,我们做了以下事情:
- 将 RID 主服务器克隆到单独的隔离 VM。预计,我们可以将另一台 AD 服务器从网络中移除或将其关闭,然后在现有服务器上执行整个操作。
- 使 RID 池无效。
- 使用 ndsutil 在同一台机器上强制夺取 RID 主机角色。这样就恢复了 RID 池信息。
- 关闭原始 RID 主机,用克隆主机替换它,然后重新启动它。
- 一旦域恢复正常运行(并同步),则重新使第二个 AD 服务器上的 RID 池无效。
- 重新启动了第二台服务器。这导致池在服务器上刷新并再次有效。
我们的想法是,当 RID 主角色转移时,AD 中的 RID 信息将被重新创建。由于域 RID 信息正确,并且只有服务器本地池丢失,因此我们希望强制重新创建池,从 RID 主角色开始。
由于 RID 池信息在 RID 主机角色转移时会重新创建,因此我们希望强制执行该操作。我们还希望确保此操作在当前 RID 主机上完成,因为我们知道即使池无效,它也能够访问数据对象。
因此,我们需要一种方法来强制夺取当前 RID 主机上的角色。方法是将其与其他 AD 服务器隔离(在克隆系统上执行此操作只会给我们带来一些安全性)。一旦 RID 主机重新启动并运行,剩下的就只是管道了。
两台服务器现在都已恢复正常运行,并且 ID 池有效。我们在此过程中损失了大约 1000 个 RID(因为必须放弃每台服务器使用的范围),但这只是很小的代价。
我们将在有时间的时候重建两个新的 AD 服务器,并删除这两个服务器,以确保这里不存在任何挥之不去的问题。
我们让 MS 协助处理此案,但他们实际上并没有提供帮助:技术人员告诉我们 AD 已损坏,我们需要恢复备份。然后,当我们恢复所有功能时,他告诉我们他不知道为什么会这样。