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.


"Telefonbuch" aus "Benutzerprofile von Shared Services" erstellen

Geprüfte Antwort Dieser Beitrag hat 17 Antworten

Ohne Rang
30 Beiträge
DavidSch. erstellt 28 Jul 2010 11:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen, ich habe folgende Situation:

Ich importiere derzeit regälmäßig in der "Verwaltung der gemeinsamen Dienste" die User aus dem AD. Unter (SharedServices -->Benutzerprofile und Eigenschaften --> Benutzerprofile anzeigen) http://ssp.local/ssp/admin/_layouts/ProfMngr.aspx?ConsoleView=Active habe ich die liste aller importierten User aus dem AD. Via Rechtsklick --> bearbeiten kann ich super alle Felder, d.h. Telefonnummer, Name, Abteilung ... anschauen.
Nun würde ich liebendgerne für meine Intranetseite (unter http://intranet.local/ ) eine Seite erstellen, die ich quasi als Telefonbuch zum Suchen der Leute usw benutzen kann. Mein Problem dabei ist, dass ich nicht weiß, wie ich auf die Daten unter ssp.local zugreifen kann. Ich hab schon reichlich gesucht, hab leider nichts gefunden und somit keinen Ansatz :-( Gibt es irgendwie eine möglichkeit, dass ich auf die Daten zugreifen kann? Sobald ich den Zugriff habe, kann ich den Rest ja selbst machen.

Danke schonmal für die Mühe! Hoffentlich gibts irgendwie eine Möglichkeit.

Alle Antworten

Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 2 Aug 2010 08:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Moin zusammen,

hat da leider keiner einen Ansatz für mich oder irgend eine Art von Hilfe? Bin da momentan echt ratlos :-( Wäre auch nicht schlimm zu wissen, wenn mir einer sagen würde, dass es Mission Impossible ist!

Gruß, David

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 2 Aug 2010 10:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Schau mal hier: http://msdn.microsoft.com/en-us/library/microsoft.office.server.userprofiles(office.12).aspx

Der MOSS hat eine eigene API für seine Features.

Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 3 Aug 2010 12:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wir haben uns auch ein kleines WebPart geschrieben, welches die von Thomas genannte API verwendet um Daten aus den Profilen auszulesen und als Adress- und Geburtstagsliste anzuzeigen.

Henning Eiben
busitec.de

Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 3 Aug 2010 14:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hey Leute, danke schonmal für die Tipps.
Ich denke ich werde das mit der API mal ausprobieren. Das wird bestimmt machbar sein :-)
Habe bislang nur mit dem Sharepoint-Designer gearbeitet, daher hab ich das Problem, dass Visual Studio bei mir noch nicht richtig auf dem Dev-Rechner "eingerichtet" ist.
Aktuell habe ich VS2005 Prof installiert. Zuerst hat er gemeckert dass er die Microsoft.Sharepoint.dll nicht finden kann. Ich habe dann auf die Microsoft.Sharepoint.dll vom Sharepoint-Server verwiesen. Jetzt ist er soweit, dass er immerhin schon anfängt zu compilieren. Ich bekommen dann aber eine Fehlermeldung "Der Objektverweis wurde nicht afu eine Objektinstant festgelegt". Hab erstmal nur den Standardcode mit "Hello World" benutzt um zu testen ob VS den Code compiliert. Vergeblich... Eine Suche im Internet konnte bislang nicht weiterhelfen :-( Wie kann ich am einfachsten Testen, ob ich ein Webpart compilieren und Deployen kann??? Die Programmierung später sollte, denke ich, kein Problem sein, wenn man sich mit der API beschäftigt hat!

Gruß, David

Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 5 Aug 2010 13:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sodele.
Nachdem mich nun VS auf dem TestServer installiert habe, funktioniert alles einwandfrei. Kann Webparts entwickeln. Jetzt muss ich mich nurnoch in die API einlesen und gucken ob ich das irgendwie hinbekomme.

Gibts es vllt. irgendwo ein kleines Code-Beispiel, wie ich z.B. die Daten aufrufen kann oder so? Hab bislang noch keins gefunden :-( Und wozu das Rad neu erfinden, wenn es das schon gibt?

Greez, David

Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 10 Aug 2010 14:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hey Leute, habe mir die Sachen nochmal genauer angeschaut... Leider bin ich immer noch nicht weiter gekommen. Könnt ihr mir denn einen Ansatz geben oder einer weiter Hilfe wie ich mit der API die sachen abrufen kann??? Ich muss ja, wenn ich richtig liege erstmal eine Connection aufbauen, dann irgendwie auf den Sharepoint referenzieren und die Daten abrufen. Oder???

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 10 Aug 2010 14:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Im Zweifel kommst Du über SPFarm.Local an die Farm und damit an alles was darin enthalten ist. Für die Benutzerprofile kannst Du auch den UserProfile Webservice nehmen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 11 Aug 2010 15:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi, danke für den Tipp!
Habe jetzt im Projekt den Webverweis http://server/_vti_bin/userprofileservice.asmx hinzugefügt und z.B. folgenden Code erstellt, um meine Arbeitskollegen auszugeben:

using 

 

 

System;
using
System.Collections.Generic;
using
System.Text;

namespace ReadUser2

 class Program
{
public static Userprofileservice.UserProfileService myService = new Userprofileservice.UserProfileService();
 {

static void Main(string[] args)
{
myService.Credentials = System.Net.CredentialCache
.DefaultCredentials;
Console.WriteLine("Kollegen:"
);
FindCommonColleagues();

static void FindCommonColleagues()
{
Userprofileservice.ContactData[] contacts = myService.GetCommonColleagues("domain\\user"
);
for (int
i = 0; i < contacts.Length; i++)
{
Console
.WriteLine(contacts[i].Name);
Console
.WriteLine(contacts[i].Email);
Console.Read();
}
}
}

 

Domäne und User sind natürlich abgeändert. Habe aber bislang nichts passendes gefunden, dass mir alle User aus dem Webservice ausgibt... Eischränken, kann man das natürlich erstmal mit einer Schleife, dass zuerst nur 50 ausgegeben werden.

Könnt ihr mir da noch weiterhelfen??? Spüre, dass ich mit eurer Hilfe so gut wie am Ziel bin ;-)

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Aug 2010 15:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mit GetCommonColleages bekommst Du die gemeinsamen Kollegen des Benutzers, der diesen Code ausführt, und dem Benutzer "domain\user". Willst Du einfach alle User? Dann suche nach einer passenden Methode - ich habe das Objektmodell dazu gerade nicht im Kopf :-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 12 Aug 2010 11:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist ja gerade mein Problem :-( . Suche schon einige Zeit nach der richtigen Methode. Mit

...
Userprofileservice.
UserProfileService myService = new Userprofileservice.UserProfileService();
...
long countcontacts = myService.GetUserProfileCount();
...

kann ich ja auch z.B. die Anzahl der Einträge lesen. Aber ich finde einfach nicht die passenden Methode! Kann mir da vllt noch einer helfen? Finde einfach keine Methode, wie ich komplett alle User auslesen kann.

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Aug 2010 11:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mit der von Dir genannten Methode bekommst Du die Anzahl. Jetzt machst Du eine Schleife von 0 bis Anzahl und nimmst die Methode, die ein Profil mit dem Index als Parameter zurückgibt - ich weiß gerade nicht mehr, wie die heißt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 12 Aug 2010 14:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Userprofileservice.GetUserProfileByIndexResult user = myService.GetUserProfileByIndex(i); 

for (int id = 1; id < 20; id++)
{
Console.WriteLine(user.UserProfile[id].Name);
Console.WriteLine(user.UserProfile[id].Values);

}

hmm... bei Name werden mir die ersten 20 Feldernamen angezeigt (jut und fein!). Nur bei Value zeigt er mir nur "ReadUser2.Userprofileservice.ValueData[ ]" an... Hmpf... danke schonmal dass ich so weit gekommen bin. Bin aber noch nicht ganz an Ziel ;-)

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Aug 2010 15:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Console.WriteLine ruft einfach ToString() auf dem übergebenen Objekt auf. Bei Values ist das eben irgendein Collection-Objekt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 12 Aug 2010 15:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

...da hast du natürlich recht... mein Fehler. Nur irgendwie kann man doch bestimmt den Wer des Feldes auslesen und als String übergeben. Bin entweder mit dem Auslesen auf dem Holzweg oder... ich weiß auch nicht. Gibts da noch eine andere Methode die ich verwenden muss?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Aug 2010 09:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist wie gesagt irgendein Collection-Objekt - den ganeuen Typnamen hattest Du ja oben mit ToString() ermittelt :-)

Schaue damit in der MSDN nach, wie man damit umgehen kann und welche Elemente enthalten sind. Die gehst Du dann z.B. mit foreach durch.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
30 Beiträge
DavidSch. Als Antwort am 18 Aug 2010 09:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Moin! Da bin ich wieder. Bekomme momentan wie folgt meine User (zum testen habe ich nur die ersten 20 genommen). Vorweg mein Problem:
Ich will mit GetUserProfileByIndex(i) die Profile von 0 bis 20 druchgehen und somit die Infos von 21 Usern auslesen. Wenn ich dass aber ohne die If-Abfrage mache, bekomme ich beim durchlauf von Index 0 - 20 z.B. 7x den ersten User, danach 4x den nächsten User, dann 5x den nächsten, und 5x wieder den Nächsten.
Mit der Abfrage kontrolliere ich ob der User gerade schon da gewesen ist oder nicht. So vermeide ich, dass ein User x-mal ausgegeben wird. Aber richtig ist das eigentlich nicht. oder? Normalerweise müsste man doch bei jedem Durchlauf der Schleife einen neuen User bekommen, da der Index einen hochgesetzt wird...oder?

 

//Anzahl der Eintrge

 long countcontacts = myService.GetUserProfileCount();
Console.WriteLine("Anzahl der Eintrge: " + countcontacts);
int icountcontacts = System.Convert.ToInt32(countcontacts);
//alter Loginname zum testen
string oldloginname = "n.A.";

for (int i = 0; i < 20; i++)
{Userprofileservice.
GetUserProfileByIndexResult user = myService.GetUserProfileByIndex(i);
string loginname = user.UserProfile[1].Values[0].Value.ToString();

 

if (oldloginname != loginname)
{
//Loginname
Console.WriteLine(user.UserProfile[1].Name);
Console.WriteLine(user.UserProfile[1].Values[0].Value.ToString());

// Vorname
Console.WriteLine(user.UserProfile[2].Name);
try { Console.WriteLine(user.UserProfile[2].Values[0].Value.ToString()); }
catch { Console.WriteLine("n.A."); }

 

 

//Nachname
Console.WriteLine(user.UserProfile[3].Name);
try { Console.WriteLine(user.UserProfile[3].Values[0].Value.ToString()); }
catch { Console.WriteLine("n.A."); }

//Telefon
Console.WriteLine(user.UserProfile[5].Name);
try { Console.WriteLine(user.UserProfile[5].Values[0].Value.ToString()); }
catch { Console.WriteLine("n.A."); }

 

//Abteilung
Console.WriteLine(user.UserProfile[7].Name);
try { Console.WriteLine(user.UserProfile[7].Values[0].Value.ToString()); }
catch { Console.WriteLine("n.A."); } }

oldloginname = loginname;

}
}

 

Ohne Rang
391 Beiträge
Frank Daske Als Antwort am 4 Aug 2011 17:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hier ist nochmal eine ganz andere Lösung ohne Programmierung beschrieben.

Echte SharePoint Listen werden per LDAP mit dem Active Directory verbunden und synchronisiert. Man kann dann alle Listen Features verwenden, persönliche Ansichten, Filter, Gruppierungen, zusätzliche Felder für Bemerkungen, berechnete Felder für Bilder, Rating, Kategorisierung usw. - und natürlich die schnelle Suche, wenn die Liste indiziert ist. Das ganze geht auch für Foundation oder 2007 / WSS (ohne MySite).

http://www.layer2.de/en/community/FAQs/BDLC/Pages/How-to-build-sharepoint-phonebook-10-minutes.aspx