将UserPrincipal.FindByIdentity和PrincipalContext与嵌套OU一起使用

时间:2012-09-27 08:30:19

标签: c# active-directory principalcontext

这是我想要实现的目标: 我有一个嵌套的OU结构,大约有5个级别。

OU=Portal,OU=Dev,OU=Apps,OU=Grps,OU=Admin,DC=test,DC=com

我试图找出用户是否在OU = Portal上有权限/存在。

以下是我目前所拥有的片段:

PrincipalContext domain = new PrincipalContext(
    ContextType.Domain,
    "test.com",
    "OU=Portal,OU=Dev,OU=Apps,OU=Grps,OU=Admin,DC=test,DC=com");

UserPrincipal user = UserPrincipal.FindByIdentity(domain, myusername);
PrincipalSearchResult<Principal> group = user.GetAuthorizationGroups();

由于某些未知原因,从上面的代码生成的值user始终为null。但是,如果我按如下方式删除所有OU:

PrincipalContext domain = new PrincipalContext(
    ContextType.Domain,
    "test.com",
    "DC=test,DC=com");

UserPrincipal user = UserPrincipal.FindByIdentity(domain, myusername);
PrincipalSearchResult<Principal> group = user.GetAuthorizationGroups();

这样可以正常工作并返回正确的用户。我只是想减少结果的数量,而不是从AD获得所有内容。

我做错了什么吗?我用谷歌搜索了几个小时,测试了各种组合而没有太多运气。

5 个答案:

答案 0 :(得分:2)

好吧,如果

UserPrincipal.FindByIdentity(context, identityType, username) == null

然后找不到用户,在您的情况下可能是,因为用户未在OU中定义=您在上下文中设置为容器。

答案 1 :(得分:1)

经过多次探索,实验,谷歌搜索和搜索堆栈溢出;似乎.NET没有内置方法来“读取”具有对包含用户作为其成员的外部组的引用的特定OU。不幸的是,建议和推荐的解决方案是在域级检索并执行某种形式的自定义过滤。

答案 2 :(得分:0)

您在OU=Portal,OU=Dev,OU=Apps,OU=Grps,OU=Admin,DC=test,DC=com内寻找的用户?

第二次搜索后,user对象的外观如何?什么是DistinguishedName属性?

您在第一个示例中的搜索将搜索该子子子OU(您拥有的OU=Portal, ....)内的对象。

如果您的用户存在于某个其他OU中,则您必须从域的顶部进行搜索 - 或者在用户实际存在的OU内(或其任何父级)进行搜索。

答案 3 :(得分:0)

用户不存在,或者您不会返回null。

你的最终比赛是什么?你是什​​么意思:

  

我试图找出用户是否有权限   OU =门户。

您在寻找什么类型的权限?行政代表团?

答案 4 :(得分:0)

希望这有一些帮助,我在尝试从嵌套的OU中检索组时遇到了同样的问题。 ou的结构是组&gt; WebGroups。所以我写了以下内容......

var ctx = new PrincipalContext(ContextType.Domain, "domain", "OU=Groups,OU=WebGroups,DC=domain,DC=ie", "username", "password")

证明订单很重要,WebGroups必须先行。当我将其更改为以下代码时,我的代码工作了......

var ctx = new PrincipalContext(ContextType.Domain, "domain", "OU=WebGroups,OU=Groups,DC=domain,DC=ie", "username", "password")

所以我假设你必须写“OU = Admin,OU = Groups ... OU = Portal”才能让你的工作。