PrincipalContext / UserPrincipal.FindByIdentity()如何使用只读域控制器?

时间:2012-06-07 14:07:50

标签: .net active-directory domaincontroller

Active Directory(AD DS)具有“只读域控制器”(RODC)的概念。可能为了向后兼容,默认情况下会忽略只读域控制器:您必须明确指定允许连接到只读域控制器。

在我们的C#代码中,我们在两个地方看到了这一点。一个是在创建新的System.DirectoryServices.DirectoryEntry时:通过设置System.DirectoryServices.AuthenticationTypes.ReadonlyServer标志可以轻松解决问题,该标志允许使用RODC。

我的问题是如何为以下代码实现相同的功能,它使用System.DirectoryServices.AccountManagement命名空间中的类:

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
using (UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(
                                                      ctx,
                                                      IdentityType.SamAccountName,
                                                      ...))
{
    // ...
}

因为我们发现此代码忽略了任何只读域控制器。

(请注意,上述问题与MSDN "Visual C# General" forum中标题为"Issue connecting to read-only domain controller (RODC) from C# application through System.DirectoryServices.AccountManagement"的帖子中发布的问题完全相同。)

1 个答案:

答案 0 :(得分:1)

最有可能发生的事情是,由于此功能并不存在,因此过度了。如果它没有被查看,则它是故意的,因为RODC不允许您执行UserPrincipal上存在的许多方法(例如ChangePassword,Delete等)。我想,要解决这个问题,微软必须创建一个新的ReadOnlyUserPrincipal。更重要的是,为什么将System.DirectoryServices.AccountManagement命名空间中的任何内容实例化为只读是有意义的,因为命名空间似乎不仅仅是只读服务(缺少更好的术语),除非没有只读版本(情况就是这样)。因此,使用非只读服务并将其指向只读源并不起作用。