ADMT中TCP端口与用户密码复制的关系

在这次的博客中我们来讨论下在用户进行林间迁移的过程中,密码复制和TCP端口的关系、可能发生的问题以及解决的方法。首先我们先来看看做这次林间迁移的特定环境、工具版本和条件。

1. 环境: 这是一个林间迁移,并且源域和目标域的域控都是windows 2003 R2。

2. 工具版本:我们所使用的ADMT迁移工具是Active Directory Migration Tool v3.0,以下是它的下载地址: https://www.microsoft.com/download/en/details.aspx?id=17488

3. 条件: 需要从源域中迁移出 >5000个设有密码的用户账号(为什么是>5000这个数值呢,我们在以下篇幅中会有详细说明)。

 

正常的迁移过程及结果

1. 选择源域及其域控,和目标域及其域控

 

2. 选择所源域中要迁移的用户

 

3. 选择目标域中迁移目标组织单元

4. 选择迁移账号的密码

 

5. 选择账号变更/用户/对象属性/冲突管理等一系列选项

6. 当迁移选项选择完成后,用户及其密码开始被迁移,并产生相应的日志文件。

 

在这次成功的迁移过程中我们可以看到相应的迁移日志信息:

我们可以看到所有被迁移的用户都在目标域中被创建了,并且其密码被成功复制。

 

迁移中可能会发生的问题及原因

通过对以上正常迁移过程的了解,我们并没有发现TCP端口与迁移用户密码复制的关系。让我们来看一下出现问题的迁移日志及网络包,如下图所示:

 

从ADMT迁移日志中我们可以看到一些账号的密码被成功复制了,而另一些则报错并抛出异常。

从网络包中我们可以看到客户端使用source port 4999,并尝试再次使用source port 1026,那是因为TCP Port默认的最大值是5000。也就是说,当客户端准备迁移某个用户账号并复制其密码的时候,它都会多开启一个TCP Port查询该用户帐号的信息,当所使用的TCP Port达到机器设置的最大值时,客户端就会尝试使用之前使用过的TCP Port,此时会出现两种情况:

  1. 之前使用过的TCP Port被释放了并且可以重用*,那么客户端成功使用该TCP Port,完成用户账号的迁移和密码复制(就想我们之前看到的正常的迁移过程及结果)。
  2. 之前使用过的TCP Port因为某种原因没有被释放或还不能重用*,那么客户端就拿不到空余的TCP Port,导致用户账号的迁移和密码复制出现异常。

在TCP协议中有定义TIME_WAIT状态,在TCP通讯关闭后,该连接被系统设置到TIME_WAIT状态,以避免短时内重用导致与之前连接的混淆。在Windows Server 2003上,TIME_WAIT状态缺省持续4分钟。所以ADMT不能在4分钟内尝试使用之前释放的的TCP Port。

所以本文所阐述的迁移用户账号及其密码所出现的问题多数在一个网络环境非常好且相关机器的处理能力极高时发送,在虚拟机上较少遇到。

问题的解决

针对上文所阐述的在特定条件下迁移用户账号及其密码所出现的问题,可以通过以下的建议和方法来解决。

 

建议:

不要一次性迁移个数 >5000的用户,因为可能会由于TCP Port不够用而出现错误。

 

解决方法:

如果一定要迁移 >5000的用户,可以通过在注册表中修改键值来增加TCP Port的最大值,从而解决port不够用的问题。

a)     路径:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

b)     键值名字:MaxUserPort

c)     数据类型:REG_DWORD