2010-12-23 183 views
2

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

失败溶液:

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

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

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

在这种情况下,处理由“用户A”执行。 “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(); 

在这种情况下,主叫用户专门使用名称和密码创建主体上下文时确定。在这种情况下,AD将返回用户所属的所有组。这也是我希望从失败的解决方案中看到的行为。在某些情况下,我没有UserA的用户密码,因此无法使用工作解决方案。

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

+0

你有多个域名吗?你在什么操作系统上?它可能与UAC有关。我会尝试关闭UAC并重试(请记住在关闭UAC后重新启动计算机)。仅供参考,ValidateCredentials()不帮助你做GetAuthorizationGroups()以防你认为它确实如此。 – 2011-01-02 04:16:30

回答

1

我们最终发现了这个问题。事实证明,noy完全是一个编码问题。这种奇怪的行为是由Active Directory中的一个恶意的域级引起的。

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

现在这一切按预期工作。

1

“它丢了AD域本地组”,因为你可能迭代产生groupsforeach循环,你正在NoMatchingPrincipalException例外用户可是没有读访问权的集团之一,在这一点上它停止迭代,无法获得其余的组。

正如你可以使用以下的迭代器(在foreach结构后面的代码),以获得组的所有其他的解决方案:

var enumerator = groups.GetEnumerator();     
while (enumerator.MoveNext()) 
{ 
    try 
    { 
     var e = enumerator.Current; 
     listView1.Items.Add(e.Name); 
    } 
    catch (NoMatchingPrincipalException) 
    { 
    } 
} 
相关问题