我们有一个使用LDAP来获取用户基本信息的应用程序。多年来它一直运行良好。我们还有一个测试应用程序可以成功连接到 LDAP,除非您执行 Clean Solution;然后它会失败并显示服务器无法运行。从干净的状态恢复文件,它又可以工作了。此外,当我们发布应用程序时,用户会看到此错误。用户将在一段时间内(1-2 天)收到该错误消息,然后它会突然开始工作。
其他一些背景;我们提升了两个新的 DC,降级了两个,这就是问题开始的时候。 LDP.exe 连接得很好。当连接失败时,Wireshark 显示“LDAP ping”并且没有其他 LDAP 通信。成功时,Wireshark 显示 SASL/GSSAPI 连接。
测试应用程序的代码片段。
Dim ident As WindowsIdentity = WindowsIdentity.GetCurrent()
Dim username As String = ident.Name.Substring(ident.Name.IndexOf("\") + 1)
Dim protocol As String = "LDAP"
Dim path As String = "domain.com"
Dim sResult As SearchResult = Nothing
Dim ldapPath As String = If(String.IsNullOrEmpty(path), String.Format("{0}:", protocol), String.Format("{0}://{1}", protocol, path))
Using de As New DirectoryEntry(ldapPath)
Try
If de.Properties.Count > 0 Then
Using adSearch As New DirectorySearcher(de)
adSearch.Filter = String.Format("(&(objectClass=user)(sAMAccountName={0}))", username)
sResult = adSearch.FindOne()
End Using
End If
Catch ex As Exception
Label1.Text = ex.Message
End Try
End Using
Return sResult
这听起来与我们的问题非常相似,但通过重新启动修复了它。 VB.NET LDAP 身份验证错误:“服务器无法运行”
您可以通过以下链接启用 LDAP 客户端日志记录: https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/turn-on-debug-logging-ldap-client
当您的应用程序出现“服务器无法运行”错误时,请记下域控制器主机名/FQDN/IP。要查看与域控制器的连接,请从工作站命令行运行:netstat -bn 将提供可执行文件和目标端口(SSL 为 389 或 636,请记下端口)。可执行文件应与您的应用程序运行时代码相对应。
如果您在 netstat 输出中看到应用程序使用的连接处于“同步发送”状态,且目标端口为 389 / 636,则您应该解决工作站与此 DC 之间的防火墙问题。
在 DC 上,请启用 LDAP 接口日志记录,如链接中所示,您应该选择 min.Level 2(基本)和 16 - LDAP 接口事件。 https://learn.microsoft.com/en-US/troubleshoot/windows-server/active-directory/configure-ad-and-lds-event-logging
再次运行您的程序,当错误再次出现时,请如上所述记下 DC,并检查 LDAP 接口事件查看器日志。如果您看到事件 ID 2886、2887、2888、2889,则 LDAP 签名要求存在问题。请参阅 https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-signing-in-windows-server#event-reference-for-ldap-signing-requirements 并且您的工作站 LDAP 签名设置应进行相应设置。
如果防火墙和 LDAP 签名不存在问题并且通过 SSL(端口 636)进行连接,则 SSL 证书可能存在问题,您可以在事件查看器 - 应用程序和服务日志、Microsoft、 Windows,CAPI2 - 运行。您应该首先启用它。 如果受信任的根等存在问题,应该得到解决。
PL 还检查您已识别的 DC 的安全事件日志,这可能会揭示身份验证问题。例如,如果您的应用程序使用 NTLM v1,它可能会被删除,您应该使用 NTLMv2。或者,如果使用 Kerberos,您可以通过以下链接启用 Kerberos 日志记录:https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-kerberos-event-logging 查看阻止 LDAP 通信的身份验证问题是什么。
由于 LDAP ping 后通信停止,似乎在连接过程中未满足某些 LDAP 要求(例如签名),因此连接停止。