SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Wert aus dem Active Directory lesen

Unbeantwortet Dieser Beitrag hat 15 Antworten

Ohne Rang
194 Beiträge
Florian Lippert erstellt 27 Jan. 2011 10:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo allerseits,

ich habe mal wieder ein Problem und werde nicht so wirklich schlau aus dem was ich im Internet so finde.

Das Ziel ist, einen Wert zu einem bestimmten Benutzer aus dem AD zu lesen.

(Bei meinen bisherigen Windows-Forms-Anwendungen hat es bisher ohne Probleme funktioniert, nur jetzt nicht wo ich von SharePoint aufs AD zugreife)

Kurze Info: der SharePoint-Server befindet sich in der entsprechenden Domain.

 

Ich habe folgenden Code gefunden, angepasst und getestet:

[quote]

var sid = SPContext.Current.Web.CurrentUser.Sid;
DirectoryEntry userEntry = new DirectoryEntry("LDAP://<SID=" + sid + ">");
DirectorySearcher searchAD = new DirectorySearcher(userEntry);
SearchResultCollection searchResultCol = searchAD.FindAll();

[/quote]

Ich lasse mir dann den Fehler ausgeben:

[quote]

bei System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) bei System.DirectoryServices.DirectoryEntry.Bind() bei System.DirectoryServices.DirectoryEntry.get_AdsObject() bei System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) bei QMS_Suchergebnisse.Suchergebnisse.SuchergebnisseUserControl.GetUserRelevances()

[/quote]

 

Muss ich die Suche noch erweitern damit es funktioniert, oder reicht mir die SID?

Kennt sich jemand damit aus?

Ich danke schon mal für die Hilfe!!

VG

Florian

Alle Antworten

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 27 Jan. 2011 11:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Florian,

versuche es mal damit:

            DirectoryEntry root = new DirectoryEntry(@"LDAP://rootdse");
            string strLDAPPath = root.Invoke("GET", "defaultNamingContext").ToString();
            DirectoryEntry entry = new DirectoryEntry("LDAP://" + strLDAPPath);

            DirectorySearcher ds = new DirectorySearcher(entry);
            ds.Filter = "(&(objectClass=user)(sAMAccountName=" + m_strAccount + "))";
            SearchResultCollection result = ds.FindAll();

            if (result.Count > 0)
                m_Entry = result[0].GetDirectoryEntry();

In m_strAccount steht der Anmeldename, theoretisch kannst Du das aber sicherlich auf auf die SID umstellen.

m_Entry ist ein DirectoryEntry.

Grüße

Olaf

 

Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 27 Jan. 2011 11:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die schnelle Antwort.

Leider funktioniert das nicht...

Es kommt den Fehler (s.o) bei folgendem Code:

[quote]

SearchResultCollection result = ds.FindAll();

[/quote]

Ich habe es auch noch einmal in einer Windows-Forms-Anwendung propbiert um das Zugriffsrecht zu kontrollieren. Auslesen kann ich das AD (bestimmte Felder)...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Jan. 2011 11:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Genau sowas hatte ich erst vor Kurzem und bin über die seltsamsten Probleme gestolpert. Ich habe dann das Heckmeck mit dem DirectoryEntry weggelassen und es hat funktioniert. Also einfach einen DirectorySearcher instanzieren, Filter setzen und freuen, daß es geht.

searcher = new DirectorySearcher();
searcher.Filter = ...
SearchResultCollection result = ds.FindAll();

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 27 Jan. 2011 11:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ah ok....

also ich hab jetzt den DirectoryEntry weggelassen. Fehler (s.o) besteht immer noch, aber ich denke es liegt wohl an dem Filter-String:

[quote]

DirectorySearcher ds = new DirectorySearcher();
                ds.Filter = "(&(objectClass=user)(sAMAccountName=" + userLogin + "))";
                SearchResultCollection result = ds.FindAll();

[/quote]

Ist da ein Fehler im String?

 

Nachtrag:

Ich habe einfach mal den Filter gekürzt

[quote]

ds.Filter = "(objectClass=user)";

[/quote]

Auch so bekomme ich leider den Fehler (s.o)...

Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 27 Jan. 2011 15:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Andere Frage am Rande:

Die SharePoint-Code wird ja von einem bestimmten User ausgeführt.... Wie kann ich Prüfen, ob dieser User Zugriff auf das AD hat?

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 27 Jan. 2011 15:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

z.B. in dem Du über den PeoplePicker einen Benutzer auswählst, der noch nicht als Benutzer in der Websitesammlung vorhanden ist. Dann greift SharePoint auf das Active Directory zu, um die SID, die Mail-Adresse, etc. zu lesen.

Grüße

Olaf

 

Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 27 Jan. 2011 15:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hab eben mal nen PeoplePicker in einer Aufgabenliste benutzt und einen Benutzer gesucht der noch nicht im SharePoint ist (z.m. steht der in keiner Liste) und habe ihn gefunden. Bedeutet also, dass SharePoint ans AD kommt?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Jan. 2011 16:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du mußt prüfen, unter welchem Account Dein Code läuft. Je nachdem wo in SharePoint Du den einsetzt (Webpart, Timerjob, Workflow, ...) kann sich das stark unterscheiden.

Alle Domänenbenutzer haben i.d.R. zumindest lesenden Zugriff auf das AD. Wenn Dein Code aber unter einem lokalen Account läuft (z.B. Netzwerkdienst), dann geht das nicht.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 27 Jan. 2011 16:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Code wird (mal wieder) in einem Webpart ausgeführt und der User mit dem ich das teste ist ein Mitglied der Domain...

Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 28 Jan. 2011 14:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also:

[quote]

DirectorySearcher ds = new DirectorySearcher();
ds.Filter = "(objectClass=user)";
SearchResultCollection result = ds.FindAll();

[/quote]

Ich habde diesen Code nun einmal als lokaler Administrator ausgeführt - Ergebnis war, das er die Domain nicht finden konnte.

Führe ich diesen Code mit meinem Domainkonto durch kommt weiterhin dieser Fehler. Jemand noch ne Idee? Danke.

Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 31 Jan. 2011 09:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Noch einmal:

Stand ist immer noch der selbe - es läuft nicht :-(

Frage:

Muss ich evtl. im IIS etwas einstellen oder ähnliches, was die Authentifizierung angeht? Evtl. nen Benutzer angeben etc. ?

 

@ Andi:

Du hattest ja geschrieben, dass es bei dir ohne "DirectoryEntry" funktioniert. Wo Benutzt du den Zugriff bzw. benutzt du einen bestimmten User?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 31 Jan. 2011 09:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich benutze diesen Code an zwei Stellen: in einer eigenen Workflowaktion und in einem eigenen WCF-Dienst. Läuft an beiden Stellen ohne besonderes Zutun und immer unter dem Account des ausführenden Benutzers.

Du kannst ja mal versuchen den Code innerhalb von SPSecurity.RunWithElevatedPriviledges auszuführen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 31 Jan. 2011 09:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die schnelle Antwort. *daumen hoch*

Ich habe in der Vergangenheit "SPSecurity.RunWithElevatedPriviledges" schon an anderen Stellen benutzt. (z.B. Items in eine geschützte Liste schreiben)

Als Benutzer wird dann immer der Systemaccount benutzt (soweit ich das gesehn habe)...

Ich werd aber mal testen ;-) Danke

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 31 Jan. 2011 09:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Florian Lippert"]Als Benutzer wird dann immer der Systemaccount benutzt [/quote]

Der Account, unter dem der Application Pool läuft.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 31 Jan. 2011 10:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Jawoll! Wuhuuu!!!!

Es läuft. Danke.

Da ich dachte, dass es sich bei dem Account um einen lokalen User handelt, dachte ich, dass der keinen Zugriff aufs AD hat. Dann war da der Denkfehler ;-)

Tausend dank!!! Echt Top die Hilfe!!

Viele Grüße,

Florian