UserPrincipal.GetAuthorizationGroups()方法出错

我在Web应用程序中使用UserPrincipal类的GetAuthorizationGroups方法时遇到问题。

使用以下代码,我收到“尝试检索授权组时,发生错误(5)”

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM", "username", "password"); UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs"); var groups = p.GetAuthorizationGroups(); 

我相信这段代码在某种程度上有效。

  • 当我查看上下文对象时,我可以看到服务器和用户名/密码已在对象中正确解析
  • 当我查看p对象时,我可以看到已经填充了AD详细信息,如电话号码等。

这是错误的堆栈跟踪。

 [PrincipalOperationException: While trying to retrieve the authorization groups, an error (5) occurred.] System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase) +317279 System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p) +441 System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper() +78 System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups() +11 

通过从PrincipalContext构造函数中删除用户名和密码详细信息并更改应用程序池(在iis7中)以同一用户(username@mycompany.com)运行 – 以下代码可以正常工作。

 PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM"); UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs"); var groups = p.GetAuthorizationGroups(); 

我需要让第一个示例中的代码工作 – 我不希望将应用程序池作为域用户运行,只是为了让这段代码正常工作。

我处理了同样的问题。 见有关类似问题的讨论。 https://stackoverflow.com/a/8347817/2012977

解决方案如下:

 public List GetGroups(string userName) { var result = new List(); PrincipalContext ctx = GetContext(); /*function to get domain context*/ UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); if (user != null) { PrincipalSearchResult groups = user.GetAuthorizationGroups(); var iterGroup = groups.GetEnumerator(); using (iterGroup) { while (iterGroup.MoveNext()) { try { Principal p = iterGroup.Current; result.Add((GroupPrincipal) p); } catch (PrincipalOperationException) { continue; } } } } return result; } 

错误5表示ERROR_ACCESS_DENIED ,表示与权限相关的问题。 也就是说,以下代码对我有用,在Windows 7上运行,网站作为默认应用程序池运行:

.aspx页面“body”的内容:

   

代码隐藏:

 protected void Page_Load(object sender, EventArgs e) { var Context = new PrincipalContext(ContextType.Domain, "logon_domain", "username", "password"); var principal = UserPrincipal.FindByIdentity(Context, "user_to_query"); var groups = principal.GetAuthorizationGroups(); GridView1.DataSource = groups; GridView1.DataBind(); } 

在我的示例中, logon_domaindomain_name\username的左手,而不是您使用的域规范的样式。 我的解决方案可能适用于您,也可能不适用。 如果没有,它确实指向某处的权限问题。

让您的管理员查看返回错误代码5的用户的AD帐户。我今天遇到了这个问题,结果certificate是该用户帐户的设置。 有一个复选框可以inheritance未检查的安全设置(已检查所有其他用户)。 这解决了我。