У меня есть проблема с помощью метода GetAuthorizationGroups класса UserPrincipal в веб-приложении.
С помощью следующего кода я получаю "При попытке получить группы полномочий, ошибка (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();
Я верю этому коду работы до степени.
Вот отслеживание стека от ошибки.
[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 и изменения applicationpool (в 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();
Я должен заставить код в первом примере работать - я не хочу, выполняет пул приложений как пользователя домена только для получения этой работы кода.
Ошибка 5 указывает на ERROR_ACCESS_DENIED , что указывает на проблему, связанную с разрешениями. Тем не менее, следующий код только что работал у меня, работая в Windows 7 с веб-сайтом, работающим в качестве пула приложений по умолчанию:
Содержимое «тела» страницы .aspx:
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
Код программной части:
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_domain
был левой частью domain_name \ username
, а не стилем спецификации домена, который вы использовали. Мое решение может сработать для вас, а может и не сработать. Если это не так, значит, где-то есть проблема с разрешениями.