我使用API System.DirectoryServices.AccountManagement绑定到AD-LDS实例。我正在使用与AD-LDS实例中本地存在的用户的简单绑定。当我在托管AD-LDS的服务器上运行客户端时,它可以工作,但是当我在远程计算机上运行客户端时,它不起作用。
这是我用来绑定和搜索用户的代码:
var c = new PrincipalContext(ContextType.ApplicationDirectory, "fullhostname:50001", "CN=Users,DC=app,DC=local", ContextOptions.SimpleBind, "CN=joe,CN=Users,DC=app,DC=local", "abc");
var u = UserPrincipal.FindByIdentity(c, IdentityType.Name, "john");
这是我在远程计算机上运行时抛出的异常:
System.DirectoryServices.AccountManagement.PrincipalServerDownException: The server is not operational.
---> System.Runtime.InteropServices.COMException: The server is not operational.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectoryEntry.get_Options()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
--- End of inner exception stack trace ---
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoApplicationDirectoryInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
at System.DirectoryServices.AccountManagement.PrincipalContext.get_ConnectedServer()
at MyApplication.DiagnosticsController.TryAdLdsSettings(AdLdsData data) in C:\code\MyApplication\DiagnosticsController.cs:line 166
如果我改为使用System.DirectoryServices API,它也可以从远程计算机上运行:
var obj = new DirectoryEntry("LDAP://fullhostname:50001/CN=Users,DC=app,DC=local", "CN=joe,CN=Users,DC=app,DC=local",
"abc", AuthenticationTypes.None);
obj.RefreshCache();
这样可行,但我需要使用System.DirectoryServices.AccountManagement API。
任何人都知道出了什么问题?
答案 0 :(得分:0)
我能够在域上进行此操作,只需进行一些小的更改,我希望这些提示有所帮助。
创建PrincipalContext时,倒数第二个参数"CN=joe,CN=Users,DC=app,DC=local"
应该是完全限定的用户名,而不是LDAP路径;这通常看起来像COMPUTER-NAME\\joe
(无论您的计算机名称是什么),或者您是否在我的域名DOMAIN-NAME\\joe
。 (如果fullhostname不是您的本地工作站,那么您可能在域中,或者您可能需要指定fullhostname \ joe来请求对主机服务器而不是您的本地服务器进行身份验证,因为您的本地凭据可能已赢得&#39 ; t在主机服务器上工作。)
要在域上进行测试,我必须将第一个参数从ContextType.ApplicationDirectory
更改为ContextType.Domain
;听起来你不在域名中,所以你可能需要ContextType.ApplicationDirectory
,但错误信息让我觉得Active Directory服务没有运行。
由于:50001
足够高,无法阻止,因此请确保您没有阻止请求的防火墙软件,无论是从您的计算机发出,还是来自" fullhostname"机;当然,请确保您的活动目录服务实际上在50001上可用,而不是其他一些身份验证协议。
答案 1 :(得分:0)
我最终改写了PrincipalContext
和UserIdentity
的用法,直接使用DirectoryEntry
。我花了几个小时才找到适合我需要的方便UserIdentity
功能的重新实现,但是这样做之后一切正常。
DirectoryEntry
中重写所有内容,使所有内容与我知道如何完全相似,修复问题。