System.DirectoryServices.ActiveDirectory 的端口要求

Port requirements for System.DirectoryServices.ActiveDirectory

我们有一个使用 AD 实现基于角色的身份验证的产品。 在此应用程序开始时,它会尝试枚举当前林中的所有域以获取一些稍后将使用的信息。
代码片段如下所示

Domain currentDomain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain));
Forest currentForest = currentDomain.Forest;
string forestName = currentForest.Name;
foreach (Domain domain in currentForest.Domains)
{
     //processing code.
}

以上代码运行良好,直到第 3 条语句并且 forestName 变量已使用当前林名称正确初始化。
但是当它试图执行 currentForest.Domains

时,它在 foreach 循环中失败了

我们收到 ActiveDirectoryServerDownException 错误消息 "The specified domain either does not exist or could not be contacted",错误代码为 1355。
从下面link,我了解到这可能是 dns 配置错误或端口可能被防火墙阻止。
https://social.technet.microsoft.com/Forums/msonline/en-US/53804e9d-ccdd-450a-967b-b7e8f67cddae/active-directory-error-code-1355?forum=winserverDS
我正在尝试了解需要打开的端口以在服务器计算机(Active Directory 服务器)和客户端计算机上进行通信。
下面link指定了这么多端口,让我很困惑。
https://support.microsoft.com/en-us/help/832017/service-overview-and-network-port-requirements-for-windows
有人可以向我提供有关需要在服务器和客户端计算机上打开哪些端口的信息,以便我可以成功枚举林中的所有域。

这些方法使用 LDAP 协议与 AD 通信,AD 位于 389 端口。

为了确定,我 运行 你的代码并观察了它使用的网络连接,它只使用了端口 389。

附带说明一下,您可以通过使用 Forest.GetCurrentForest() 来稍微简化您的代码,而不是查找当前域然后查找该域的林。

Forest currentForest = Forest.GetCurrentForest();

两种方法都可以完成同样的工作。