10 Stimmen

Fehler mit der Methode UserPrincipal.GetAuthorizationGroups()

Ich habe ein Problem bei der Verwendung der GetAuthorizationGroups-Methode der UserPrincipal-Klasse in einer Webanwendung.

Bei Verwendung des folgenden Codes erhalte ich die Meldung "Beim Versuch, die Autorisierungsgruppen abzurufen, ist ein Fehler (5) aufgetreten".

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

Ich glaube, dieser Code funktioniert teilweise.

  • Wenn ich das Kontext-Objekt ansehe, sehe ich, dass der Server und der Benutzername/das Passwort im Objekt korrekt aufgelöst wurden
  • Wenn ich das p-Objekt ansehe, sehe ich, dass AD-Details wie Telefonnummer usw. ausgefüllt wurden.

Hier ist die Stack-Trace des Fehlers.

[PrincipalOperationException: Beim Versuch, die Autorisierungsgruppen abzurufen, ist ein Fehler (5) aufgetreten.]
   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

Indem ich die Benutzername- und Passwortdetails aus dem Konstruktor von PrincipalContext entferne und den Anwendungspool (in iis7) so ändere, dass er als derselbe Benutzer (Benutzername@mycompany.com) ausgeführt wird, funktioniert der folgende Code.

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

Ich muss den Code im ersten Beispiel zum Laufen bringen - ich möchte den Anwendungspool nicht als Domänenbenutzer ausführen, nur um diesen Code zum Laufen zu bringen.

5voto

Osa E Punkte 1651

Ich hatte dasselbe Problem. Siehe Diskussion zur ähnlichen Frage. https://stackoverflow.com/a/8347817/2012977

Die Lösung ist unten:

public List GetGroups(string userName)
    {
        var result = new List();
        PrincipalContext ctx = GetContext(); /*Funktion zum Abrufen des Domänenkontexts*/
        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;
    }

3voto

Rob Punkte 44368

Fehler 5 bedeutet ERROR_ACCESS_DENIED, was auf ein Berechtigungsproblem hindeutet. Dennoch hat der folgende Code bei mir funktioniert, als er auf Windows 7 mit der Website ausgeführt wurde, die im Standardanwendungspool läuft:

Inhalt des "body" der .aspx-Seite:

Code-Behind:

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();
}

In meinem Beispiel war logon_domain die linke Seite von domain_name\username, anstatt des von Ihnen verwendeten Domain-Spezifikationsstils. Meine Lösung funktioniert möglicherweise oder auch nicht für Sie. Wenn nicht, weist dies auf ein Berechtigungsproblem hin.

0 Stimmen

Danke Rob, ich habe viele Kombinationen im PrincipalContext-Konstruktor ausprobiert, aber kein Glück gehabt. Ich glaube, die eigentliche Ursache meines Problems liegt darin, die Berechtigungsanforderungen des Anwendungsbenutzers zu kennen, um die GetAuthorizationGroups()-Methode aufzurufen. Mein Anwendungsbenutzer hat Leseberechtigungen für alle Informationen zu Objekten in der OU. Derzeit mache ich das auf die lange Art und Weise, indem ich die memberOf-Eigenschaft von Benutzern lese. Dies ist jedoch nur die erste Ebene und nicht rekursiv.

0 Stimmen

FWIW, ich hatte eine Version, in der ich var Context = new PrincipalContext(ContextType.Domain, "logon_domain"); verwendet habe, also war der Kontext rein auf eine Domain ausgelegt und das hat auch ohne Fehler in Win7/default-Anwendungspool funktioniert. Ist der Computer, auf dem du deinen Code ausführst, einer Domain beigetreten?

1 Stimmen

Ja, verbunden mit einer Domäne. Wenn ich den Konstruktor PrincipalContext(ContextType.Domain, "logon_domain") mit dem Netzwerkdienst (AppPool) verwende, funktioniert es nicht. Wenn ich den AppPool ändere, um als der gleiche Benutzer zu laufen, der im Methode PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM", "Benutzername", "Passwort") verwendet wird, funktioniert es!

0voto

Roger Punkte 1

Lassen Sie Ihren Administrator das AD-Konto für den Benutzer überprüfen, der den Fehlercode 5 zurückgibt. Ich bin heute darauf gestoßen und es stellte sich heraus, dass es eine Einstellung an dem Benutzerkonto war. Es gibt ein Kontrollkästchen zum Übernehmen der Sicherheitseinstellungen, das nicht aktiviert war (alle anderen Benutzer waren aktiviert). Das hat es für mich gelöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X