我们公司的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>
答案 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
属性将显示组所属的域。
对于跨林访问,您需要分别连接到每个林中的全局编录,因为林全局编录之间没有用户/组数据复制。