从Active Directory读取用户授权组

时间:2010-12-23 13:11:52

标签: c# .net active-directory

在我们的系统中,我们以两种略有不同的方式从Active Directory读取用户安全组。在一种情况下,AD返回的组列表缺少域本地组。 GetAuthorizationGroups()的响应取决于使用的PrincipalContext。在失败的场景中,GetAuthorizationGroups()将仅返回全局组。结果是缺少AD中的所有域本地组。有人可以解释一下原因吗?

失败的解决方案:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

在这种情况下,该过程由“UserA”执行。 “UserA”是域“our.domain.net”的成员。 “UserA”与工作解决方案中特定标识的用户完全相同。因为PrincipalContext与工作解决方案中的PrincipalContext相同。 GetAuthorizationGroups()在此解决方案中的响应错过了AD中的域本地组。

工作解决方案:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net", "UserA", "PasswordA");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

在这种情况下,在创建Principal Context时,使用名称和密码专门标识调用用户。在这种情况下,AD返回用户所属的所有组。这也是我希望从失败的解决方案中看到的行为。在某些情况下,我没有UserA的用户密码,因此无法选择工作解决方案。

请帮助我理解为什么失败的解决方案不会返回用户所属的所有组。

2 个答案:

答案 0 :(得分:1)

我们最终发现了这个问题。事实证明,诺伊完全没有编码问题。奇怪的行为是由Active Directory中的一个错误的域级引起的。

域名级别必须设置为“2003功能级别”

现在一切正常。

答案 1 :(得分:1)

“它错过了AD中的域本地组”,因为您可能正在使用foreach循环对结果NoMatchingPrincipalException进行迭代,并且您将获得foreach例外用户没有读访问权限的其中一个组,此时它停止迭代,无法获得其余组。

作为解决方案,您可以使用以下迭代器(var enumerator = groups.GetEnumerator(); while (enumerator.MoveNext()) { try { var e = enumerator.Current; listView1.Items.Add(e.Name); } catch (NoMatchingPrincipalException) { } } 结构后面的代码)来获取所有其他组:

{{1}}