4

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

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上述代码生成的值始终为空。但是,如果我要删除所有 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 中获取所有内容。

有什么我做错了吗?我已经用谷歌搜索了几个小时并测试了各种组合,但运气不佳。

4

5 回答 5

2

好吧,如果

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

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

于 2012-09-27T08:56:42.477 回答
1

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

于 2012-10-02T07:21:11.177 回答
0

您正在寻找的用户是在里面OU=Portal,OU=Dev,OU=Apps,OU=Grps,OU=Admin,DC=test,DC=com吗?

user第二次搜索后,您的对象是什么样的?它的DistinguishedName属性是什么?

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

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

于 2012-09-27T09:36:41.650 回答
0

该用户在那里不存在,否则您将不会返回 null。

你的最终游戏是什么?你是什​​么意思:

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

您正在寻找什么类型的权限?管理员委托?

于 2012-10-01T21:04:36.120 回答
0

希望这会有所帮助,我在尝试从嵌套 OU 中检索组时遇到了同样的问题。ou 的结构是 Groups > 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”才能让你的工作。

于 2013-02-19T15:47:19.267 回答