Active Directory组名称唯一性要求(来自C#客户端的查询)

时间:2015-09-25 20:34:48

标签: c# active-directory active-directory-group

我们公司的C#产品使用System.DirectoryServices.AccountManagement在Active Directory中查询用户和组。我们使用以下方法来获取主体:

...
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain);
return principalContext;
...

我们使用Active Directory组(例如groupName =" Devs"):

...
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(this.principalContext, groupName);
...

当我们在一个简单的一个域Active Directory数据库上运行它时,一切正常。

我的问题是,当我们在一个拥有多个" Devs"的大森林上运行此代码时会发生什么?组?可以有不止一个" Devs"森林里的安全小组?如果是这样,它将如何解决" Devs"?我是否必须切换到使用该方法:

public static GroupPrincipal FindByIdentity(
    PrincipalContext context,
    IdentityType identityType,
    string identityValue
)

我目前无法模拟这种情况(缺乏资源和缺乏时间),我一直在阅读很多相关内容。我知道有一些本地的,全球的和通用的安全组,在域树之间传播。但是森林中的域树在根之间有某种信任,所以它们并不完全相互无知。什么是最坏的情况下拥有&#34; Devs&#34;在林中重复,应用程序如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

搜索域层次结构是一项非常常见的任务。使用AccountManagement类,您可以执行以下操作:

// Connect to global catalog of the forest
var context = new PrincipalContext(ContextType.Domain, "contoso.com:3268", "DC=contoso,DC=com");

// Build a filter principal by name and context
var groupFilter = new GroupPrincipal(context) {Name = "Devs"};

// Build a searcher with a filter applied
var searcher = new PrincipalSearcher(groupFilter);

// This should return all groups in all subdomains matching specified name
var groups = searcher.FindAll().ToList();

foreach (var group in groups)
{
    Console.WriteLine(group.DistinguishedName);
}

您不会有任何重复项,因为域中不能有多个具有此名称(“Devs”)的组。在AccountManagement术语中,您可以使用上下文和名称参数创建GroupPrincipal对象,并且在具有相同名称的上下文中不能有多个。

如果您连接到域控制器(new PrincipalContext(ContextType.Domain)),则FindByIdentity将搜索此单个域。如果连接到林的全局编录(如我的示例,端口3268),则FindByIdentity将搜索整个林。 DistinguishedName属性将显示组所属的域。

对于跨林访问,您需要分别连接到每个林中的全局编录,因为林全局编录之间没有用户/组数据复制。