【问题标题】:UserPrincipal.FindByIdentity Insists "There is no such object on the server."UserPrincipal.FindByIdentity 坚持“服务器上没有这样的对象。”
【发布时间】:2011-12-26 13:04:10
【问题描述】:

我目前的目标是使用System.DirectoryServices.AccountManagement 程序集中的实用程序为基于域安全组的 ASP.NET 应用程序实现只读角色提供程序。我有以下代码在我的开发域上运行良好,但在部署环境中失败:

Using myContext As New PrincipalContext(ContextType.Domain, Nothing, "DC=My,DC=Controller", accountName, accountPassword)
    Try
        Dim p As UserPrincipal = UserPrincipal.FindByIdentity(myContext, IdentityType.SamAccountName, userName)
        Dim groups = p.GetAuthorizationGroups()
        For Each g In groups
            Debug.WriteLine("Found security group: " & g.DisplayName & vbNewLine)
        Next
    Catch ex As Exception
        Debug.WriteLine("Encountered an exception: " & vbNewLine & ex.ToString())
    End Try
End Using

异常堆栈跟踪返回如下:

System.DirectoryServices.AccountManagement.PrincipalOperationException:服务器上没有这样的对象。 ---> System.DirectoryServices.DirectoryServicesCOMException (0x80072030):服务器上没有这样的对象。 在 System.DirectoryServices.DirectoryEntry.Bind(布尔 throwIfFail) 在 System.DirectoryServices.DirectoryEntry.Bind() 在 System.DirectoryServices.DirectoryEntry.get_SchemaEntry() 在 System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de) 在 System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase,布尔 ownCtxBase,字符串用户名,字符串密码,ContextOptions 选项) 在 System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry 条目) 在 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() --- 内部异常堆栈跟踪结束 --- 在 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() 在 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() 在 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() 在 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() 在 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext 上下文,类型 principalType,Nullable`1 identityType,字符串 identityValue,DateTime refDate) 在 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext 上下文,类型 principalType,IdentityType identityType,字符串 identityValue) 在 System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext 上下文,IdentityType identityType,字符串 identityValue)

我知道这里明显的“陷阱”是确定对象实际上,嗯......存在于服务器上。但是,我可以毫无疑问地确认,无论我使用哪个账户的 SAM 账户名,我都会从通话中收到相同的结果。此外,Microsoft 的ActiveDirectoryMembershipProvider 对相同的SAM 帐户名称进行身份验证没有问题,我可以使用DirectorySearcher 类的该信息找到对象。我可以确定开发网络和部署之间的唯一区别是部署环境的 DC 是 Windows Server 2003 机器,而在本地我正在使用 Windows Server 2008 DC 进行开发。我可能会忽略什么?

【问题讨论】:

    标签: .net vb.net .net-3.5 active-directory account-management


    【解决方案1】:

    由于某种原因,问题出在域控制器的路径上。将路径描述为DC=box123,DC=dom 不起作用,但使用路径box123.dom 可以。不能说为什么,这不是我可以在本地域上复制的行为,但这解决了问题。

    编辑:
    经过进一步调查,构造 DC=box123,DC=dom 在缩减为 DC=dom 时也能正常运行。我不了解寻址的动态,但我能够通过使用 DirectorySearcher 对象显示示例用户的路径来确定问题所在,该对象显示我的用户的路径为:LDAP://box123.dom/CN=username/CN=Users/DC=dom

    【讨论】:

    • 那么有什么解决办法呢?
    【解决方案2】:

    我知道这是一个相对古老的问题,但我认为我们的解决方案可能会帮助其他人。我们在客户的现场环境中遇到了同样的问题。最初我们无法在我们的测试环境中复制该问题,但后来我们发现它仅在访问 https 下的站点时发生。通过大量的试验和错误以及给 Microsoft 的支持电话,我开始尝试创建主体上下文的调用。最初,对象实例化被编码为

    using (var pc = new PrincipalContext(ContextType.Domain, <serverUri>, <ldapDomain>, <username>, <userpass>))
    

    完整的构造函数可以带一个额外的参数

    using (var pc = new PrincipalContext(ContextType.Domain, <serverUri>, <ldapDomain>, ContextOptions.Negotiate, <username>, <userpass>))
    

    一旦指定了ContextOption(在我们的例子中,它必须是Negotiate),对UserPrincipal.FindByIdentity 的调用就会按预期工作。

    【讨论】:

      【解决方案3】:

      这里不显示 dcPath 的值是一种像这样构造 PrincipalContext 的方法。

      Using myContext As New PrincipalContext ContextType.Domain, "dom.fr:389", "dc=dom,dc=fr", "jpb", "root.123");
      

      之后,可以通过 userName 不是您的控制器上的有效 samAccountName 这一事实来解释该异常。

      【讨论】:

      • DC 路径构造正确,否则抛出的异常是“从服务器返回了一个引用”。正如我所解释的,相同的 SAM 帐户名称可以成功地与带有过滤字符串 "samaccountname=" &amp; userNameDirectorySearcher 一起使用。我需要另一个想法。 :\
      • +1 让我尝试新的方法来构建控制器的路径。下面描述了一个相当意外的结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2011-12-07
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多