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

Daten aus SharepointBenutzern in einer Liste abrufen

bewertet von 0 Usern
Beantwortet Dieser Beitrag hat 3 Geprüfte Antworten | 8 Antworten | 2 Followers

Top-100-Beitragsschreiber
133 Beiträge
Shay erstellt in 22 Nov 2013 10:57

Hallo zusammen =)

Ich habe zwei Probleme vor denen ich gerade stehe, vielleicht kann mir ja jemand mit einer Idee weiter helfen.

1. Ich habe eine Liste, in welcher ein Benutzerfeld existiert und ein Raum-Feld.
Ich möchte gern, dass wenn man den Benutzer auswählt, automatisch das Raum-Feld mit dem dazugehörigem Raum ausgefüllt wird, welches über die Benutztersynchronisation aus dem AD für diesen Benutzer mit nach Sharepoint synchronisiert wird. Ist das möglich?

2. Ich hätte gern eine normale Liste die sich aus den SharepointBenutzern zusammen setzt. Also auch inklusive Telefonnummer und Raumnummer, allgemein so was vom AD mit übermittelt wird.
Momentan benutze ich dafür eine Erweiterung (UsersADBrowser WebPart), die direkt auf das AD zugreift und die Daten wiedergibt, allerdings nicht als Liste, also kann ich damit zum weiterverwenden nichts anfangen. 

Hat jemand eine Idee dazu?

Shay

Beantwortet Geprüfte Antwort

Top-10-Beitragsschreiber
19.129 Beiträge

Im Grunde mußt Du nur im Anschluß an die vorhandene Funktion das Script nochmal umgekehrt laufen lassen. Also alle Listenelemente durchgehen und nachschauen, ob es einen passenden Eintrag in $allUsers gibt. Wenn nicht ist der Eintrag im AD nicht mehr vorhanden und das Element kann in SharePoint gelöscht werden.

PS: das Script ist sehr schlampig und verbraucht unnötig viele Ressourcen. SPList.Items holt bei jedem Zugriff alle Elemente aus der Datenbank. Also lieber am Anfang einmal in einer Variablen speichern und dann damit arbeiten:

$items = $list.Items
foreach ($item in $items)
usw...

Viele Grüße
Andi
af @ evocom de
Blog
Top-10-Beitragsschreiber
19.129 Beiträge

Fertige Lösungen kosten Geld ;-)

Aber sinngemäß so:

foreach ($item in $items) {
$found = $false
foreach ($user in $AllUsers) {
if ($item["Title"] -eq $user.SID) {
$found = $true
}
}
if (!$found) {
$item.Recycle()
}
}

Viele Grüße
Andi
af @ evocom de
Blog
Top-10-Beitragsschreiber
19.129 Beiträge

Das kommt daher, daß innerhalb von "foreach $item" ein Element gelöscht werden soll. Man muß die Elemente vorher in ein Array umkopieren und die foreach-Schleife darüber laufen lassen.

Ich wollte Dir ja eigentlich auch nur das Konzept verdeutlichen ;-)

Viele Grüße
Andi
af @ evocom de
Blog

Alle Antworten

Top-25-Beitragsschreiber
391 Beiträge

Shay,

eine solche Benutzer-Liste kann man aus dem AD leicht und ohne Programmierung oder Installation erstellen:
http://www.layer2.de/en/community/FAQs/cloud-connector/Pages/Office-365-AD-Phonebook.aspx

Das Beispiel ist für Office 365, geht aber natürlich auch mit einem normalen SharePoint. Die Verwendung einer "normalen" Kontaktliste hat den Vorteil, das alle Listenfunktionen zur Verfügung stehen, wie z.B. Ansichten (z.B. Neue Benutzer), Suche, Anhänge bzw. zusätzliche "SharePoint-Only" Spalten, Metadaten, Änderungsmitteilungen, Workflows wenn sich im AD was ändert. Die Listenelemente sind dann auch Offline verfügbar (über Outlook).

MfG, Frank

 

Top-100-Beitragsschreiber
133 Beiträge

Dritt Software die etwas kostet kommt leider für mich nicht in Frage.

Ich habe jetzt ein Script gefunden, dass das AD ausließt und die Daten in eine Liste schreibt.
Der einzige Nachteil daran ist, es werden keine im AD gelöschten Benutzer in der Liste gelöscht.
Gibt es hier die Möglichkeit das Script um ein paar Zeilen zu erweitern, um auch so eine Art Abgleich zu machen?

Wenn AD User bereits in der Liste, dann ersetze, wenn nicht da, dann erstelle und andersrum, wenn in Liste vorhanden aber nicht im AD dann löschen?

 

Import-Module ActiveDirectory

$AllUsers=Get-ADUser -Filter {mail -like "*@XXX.de"} -SearchBase “OU=Testuser,OU=XXX,OU=Benutzer,OU=XXX,DC=XXX,DC=DE” -Properties *

Add-PSSnapin Microsoft.SharePoint.PowerShell -EA SilentlyContinue

#Variablen zum adressieren der Liste

$webURL = “http://intranet.XXX.de/”

$listName = “ADImport” 

#Webseite adressieren

$web = Get-SPWeb $webURL 

#Liste adressieren

$list = $web.Lists[$listName]

 

foreach ($User in $AllUsers) {

    foreach ($item in $list.items) {

        if ($item["Title"] -eq $User.SID) {

            $item["Nachname"] = $User.sn

            $item["EMail"] = $User.EmailAddress

            $item["Telefon"] = $User.OfficePhone

   $item["Vorname"] = $User.GivenName

   $item["Abteilung"] = $User.Department

   $item["Büro"] = $User.physicalDeliveryOfficeName

   $item.update()

            $Flag =”gefunden”

        }

    }

    if ($Flag -ne “gefunden”) {  

            #Neuen Eintrag erstellen

            $newItem = $list.Items.Add()  

            #Eigenschaften ins ListItem füllen

            $newItem["Title"] = $User.SID

            $newItem["Nachname"] = $User.sn

            $newItem["EMail"] = $User.EmailAddress

            $newItem["Telefon"] = $User.OfficePhone

   $newItem["Vorname"] = $User.GivenName

   $newItem["Abteilung"] = $User.Department

   $newItem["Büro"] = $User.PhysicalDeliveryOfficeName

   #Listenelement schreiben

            $newItem.Update()

    }

    $Flag=”"

}

Danke schon mal =)

Top-10-Beitragsschreiber
19.129 Beiträge

Im Grunde mußt Du nur im Anschluß an die vorhandene Funktion das Script nochmal umgekehrt laufen lassen. Also alle Listenelemente durchgehen und nachschauen, ob es einen passenden Eintrag in $allUsers gibt. Wenn nicht ist der Eintrag im AD nicht mehr vorhanden und das Element kann in SharePoint gelöscht werden.

PS: das Script ist sehr schlampig und verbraucht unnötig viele Ressourcen. SPList.Items holt bei jedem Zugriff alle Elemente aus der Datenbank. Also lieber am Anfang einmal in einer Variablen speichern und dann damit arbeiten:

$items = $list.Items
foreach ($item in $items)
usw...

Viele Grüße
Andi
af @ evocom de
Blog
Top-100-Beitragsschreiber
133 Beiträge

Es ist das Einzige was ich gefunden habe :D

Ich weiß es ist ein bisschen viel verlangt, aber könntest du mir hier vielleicht bei helfen?
Weiß nicht wie ich da Code mäßig was schreiben soll :x

Top-10-Beitragsschreiber
19.129 Beiträge

Fertige Lösungen kosten Geld ;-)

Aber sinngemäß so:

foreach ($item in $items) {
$found = $false
foreach ($user in $AllUsers) {
if ($item["Title"] -eq $user.SID) {
$found = $true
}
}
if (!$found) {
$item.Recycle()
}
}

Viele Grüße
Andi
af @ evocom de
Blog
Top-100-Beitragsschreiber
133 Beiträge

Vielen lieben Dank =)

Ich habe zwar noch einen "Fehler bei der Enumeration einer Auflistung: Collection was modified; enumeration operation may not execute..",
aber so weit funktioniert es.
Den Fehler versuch ich mal mit Google zu lösen.

Wirklich vielen Dank für deine Hilfe 

Top-10-Beitragsschreiber
19.129 Beiträge

Das kommt daher, daß innerhalb von "foreach $item" ein Element gelöscht werden soll. Man muß die Elemente vorher in ein Array umkopieren und die foreach-Schleife darüber laufen lassen.

Ich wollte Dir ja eigentlich auch nur das Konzept verdeutlichen ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Top-100-Beitragsschreiber
133 Beiträge

Hab's nun geschafft durch die Umsetzung mit einem Array =)

Seite 1 von 1 (9 Elemente) | RSS