在我们的系统中,我们以两种略有不同的方式从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的用户密码,因此无法选择工作解决方案。
请帮助我理解为什么失败的解决方案不会返回用户所属的所有组。
答案 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}}