Kontaktliste in Userpostfach importieren via PS

Mitglied: atk691

atk691 (Level 1) - Jetzt verbinden

06.12.2016, aktualisiert 09:04 Uhr, 8903 Aufrufe, 33 Kommentare, 4 Danke

Hallo zusammen,
ich bin auf der Suche nach einer Lösung für folgendes Problem:
Eine Kontaktliste (Telefon), erstellt mittels Get-AdUser , soll in ein oder mehrere Userpostfächer importiert werden. Als separater Kontaktordner.
Diese Liste wird 1x wöchentlich erstellt.
Das eigentliche Ziel: eine Mitarbeitertelefonliste (auch user ohne Postfach) sollen via ActivSysnc allen Smartphones zur Verfügung stehen und immer aktuell.
Bisher wurde das klassisch per Hand gemacht und war (natürlich) nie wirklich aktuell.

Unter diesem Link: xxx.fixthis.ch/blog/post/power-shell_Kontakte-von-AD-filtern-nach-Exchange/
habe ich ein Script gefunden, das genau meinen Anforderungen entspricht.
Allerdings läuft es bei mir nicht und eventuell ist es auch etwas zu "heavy" für meine Ansprüche.
Meine PS-Kenntnisse reichen hier leider nicht aus.

Zu dem Script:
EWS Management API Bibliothek (2.0 + 2.2) ist installiert aber es meldet dennoch immer "EWS Management API DLL fehlt". Die dll ist aber vorhanden (C:\ProgramFiles\Microsoft\Exchange\WebServices\2.0\Microsoft.Exchange.WebServices.dll)
Ein Login auf "https://mail.companydomain.ch/ews/exchange.asmx" funktioniert einwandfrei.

Eventuell kann mich hier jemand unterstützen, bzw. hätte noch einen anderen Lösungsvorschlag ;-) face-wink

Danke und Gruss

atk691

Uuups fast vergessen: Exchange 2010 (bald 2016), W2008R2, PS4
33 Antworten
Mitglied: xbast1x
06.12.2016 um 08:55 Uhr
Ich wäre auch an einer Lösung interessiert, da ich auch Anfragen zu nicht aktuellen Kontaktlisten erhalte.
Bitte warten ..
Mitglied: Kraemer
06.12.2016 um 09:03 Uhr
Unter diesem Link: xxx.fixthis.ch/blog/post/power-shell_Kontakte-von-AD-filtern-nach-Exchange/
Was soll der Quatsch?
Bitte warten ..
Mitglied: atk691
06.12.2016 um 09:05 Uhr
War/bin mir nicht sicher ob ich vollständige Links einstellen darf !
ersetze xxx mit www
Bitte warten ..
Mitglied: colinardo
LÖSUNG 06.12.2016, aktualisiert 09.12.2016
Servus @atk691,
dazu hatte ich mal vor langer Zeit ein Skript für den EX2010 geschrieben.

In folgendem Skript werden alle aktiven AD-Benutzer ausgelesen und in einen Unterordner des Standard-Kontakte-Ordners namens 'Firmenkontake' jeder aktiven Usermailbox geschrieben. Überprüft wird ob der Ordner schon existiert, wenn nicht wird er angelegt. Dann wird der Inhalt des Ordners einseitig synchronisiert d.h. bereits vorhandene Kontakte werden aktualisiert, neue Angelegt und falls der User in dem Ordner weitere Kontakte anlegt werden diese dort raus gelöscht.

Damit das ganze über die EWS (Exchange Web Services) funktioniert muss man dem User mit dem das Skript ausgeführt wird das Impersonation-Recht erteilen damit dieser Account auf alle Mailboxen zugreifen kann.
Um z.B. dem User 'Administrator' dieses Recht zu erteilen führt man folgenden Befehl in einer EMS aus
Mehr dazu bitte hier nachlesen:
Configuring Exchange Impersonation in Exchange 2010

Benötigt wird für das Script ebenfalls die Microsoft.Exchange.WebServices.dll die Ihr euch ja bei MS herunterladen könnt. Für das folgende Script ist diese DLL in das Verzeichnis des Scripts zu kopieren, außer man passt den Pfad im Skript an.

Hatte das ganze damals mit Exchange 2010 getestet. Sollte eigentlich noch laufen.

In deinem Fall wäre es auch eigentlich ausreichend die Kontakte in eine einzelne Shared-Mailbox zu transferieren, das lässt sich ja leicht anpassen.
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate

edit (08.12.2016 13:00): Anpassung im Skript für die eindeutige Identifizierung der Kontakte über eine Custom Extended Property anstatt des selten genutzten Attributs Generation.
edit (09.12.2016 11:15): Prüfung der Kontakteigenschaften auf Nullwerte
Bitte warten ..
Mitglied: 131381
131381 (Level 2)
06.12.2016, aktualisiert um 19:53 Uhr
@colinardo Cool, das ist mal was richtig nützliches :-) face-smile

Habs gerade mal auf meinem Test-Exchange ausprobiert, läuft echt gut.

Habe sowas ähnliches für einen Kunden zu realisieren, da kommt gleich mal eine Spende zu Dir ;-) face-wink

HERZLICHES DANKE von meiner Seite!

Gruß mikrotik
Bitte warten ..
Mitglied: colinardo
06.12.2016, aktualisiert um 19:59 Uhr
Zitat von @131381:
HERZLICHES DANKE von meiner Seite!
Gerne, keine Ursache :-) face-smile
da kommt gleich mal eine Spende zu Dir
Thanks man :-) face-smile!!

Schönen Abend wünsche ich.
Grüße Uwe
Bitte warten ..
Mitglied: atk691
06.12.2016 um 21:15 Uhr
Wow, mit sowas habe ich nicht gerechnet :-) face-smile
Werde es morgen gleich mal umsetzen. Hoffe ich komme mit den Variablen klar.
Wie ich sehe, wird der Ordner "Firmenkontakte" sogar bereinigt. Somit würden ausgetretene Mitarbeiter auch entfernt - genial !
Ich bedanke mich sehr herzlich bei Dir , Uwe.
Werde nach der Umsetzung sofort berichten und natürlich ebenfalls spenden.
Diese Arbeit muss man schliesslich belohnen ;-) face-wink

Gruss
atk691
Bitte warten ..
Mitglied: atk691
07.12.2016 um 08:44 Uhr
So, habe es mal vorsichtig angetestet.
Allerdings nur bis Zeile 45. Hat Fehlerfrei funktioniert :-) face-smile
hinzugefügt habe ich in Zeile 44 noch die die searchbase (will es nicht direkt ab root laufen lassen)

Das es auf alle Mailboxen zugreift, finde ich inzwischen recht gut.
Allerdings möchte ich schon zu testzwecken erst mal nur in eine Usermailbox schreiben. Das wird wohl in Zeile 47/48 gemacht. Nur wie genau ?

Gruss
atk691
Bitte warten ..
Mitglied: colinardo
LÖSUNG 07.12.2016, aktualisiert um 09:34 Uhr
Zitat von @atk691:
So, habe es mal vorsichtig angetestet.
Wofür gibt's VMs ?! ;-) face-wink
Allerdings nur bis Zeile 45. Hat Fehlerfrei funktioniert :-) face-smile
Bis dahin passiert ja auch nichts weltbewegendes :-) face-smile
Das es auf alle Mailboxen zugreift, finde ich inzwischen recht gut.
Allerdings möchte ich schon zu testzwecken erst mal nur in eine Usermailbox schreiben. Das wird wohl in Zeile 47/48 gemacht. Nur wie genau ?
Einfach eine beliebigen Filter mit WHERE-Objekt dazwischen schalten oder die Mailbox direkt angeben
Es reicht Zeile 57 auf folgendes zu ändern.
Ein Blick in die Doku zu Get-Mailbox hätte dazu eigentlich auch gereicht.
Bitte warten ..
Mitglied: atk691
07.12.2016 um 10:03 Uhr
Zitat von @atk691:
Bis dahin passiert ja auch nichts weltbewegendes :-) face-smile
Nunja, immerhin erfolgen hier die Abfragen. Also Test des Connectors. Das war vorher ja mein Problem.
Ein Blick in die Doku zu Get-Mailbox hätte dazu eigentlich auch gereicht.
Richtig, aber dieses doch recht umfangreiche Script hat mich etwas nervös gemacht :-) face-smile
Da wäre ein Fehler doch unter Umständen fatal.

Habe es jetzt auf meine Box laufen lassen : PERFEKT !

Ohne jetzt schleimen zu wollen:
Man sieht am Code doch gleich den PS -Profi.
Klar und deutlich strukturiert und kommentiert.:-) face-smile:-) face-smile

Nochmals vielen, vielen Dank

Gruss
atk691
Bitte warten ..
Mitglied: atk691
07.12.2016 um 11:17 Uhr
Auf die Gefahr hin, dass man mich für blöd erklärt:

Ich kriege weitere Filter nicht gebacken.
Zeile 44 möchte ich mit filter telephonenumber und mobile erweitern.
So das nur user mit Festanschluss oder Handy berücksichtigt werden.
Dann kann ich das Thema abschliessen :-) face-smile

Dank und Gruss
atk691
Bitte warten ..
Mitglied: Kraemer
07.12.2016 um 11:22 Uhr
Zitat von @atk691:

Auf die Gefahr hin, dass man mich für blöd erklärt:

Ich kriege weitere Filter nicht gebacken.
Zeile 44 möchte ich mit filter telephonenumber und mobile erweitern.
So das nur user mit Festanschluss oder Handy berücksichtigt werden.
Dann kann ich das Thema abschliessen :-) face-smile

Dank und Gruss
atk691
Sorry - aber das ist in meinen Augen schon dreist. Für so etwas bezahlt man üblicherweise Leute...
Bitte warten ..
Mitglied: atk691
07.12.2016, aktualisiert um 11:30 Uhr
Dachte mir schon das sowas kommt, kein Problem, werde den Syntax schon hinkriegen.
Im übrigen, "bezahlt" ist schon erledigt :-) face-smile (wenn auch nur geringfügig)

Gruss
atk691

P.S. "Kraemer:
Du hast dich 2x in diesem Thread gemeldet. Beide mal nicht sonderlich produktiv.;-) face-wink
Aber irgenwie wirst Du ja Level 2 erreicht haben.
Nix für ungut ;-) face-wink
Bitte warten ..
Mitglied: atk691
07.12.2016 um 11:54 Uhr
letzter Kommentar:
-and telephoneNumber -Like"*" -or MobilePhone -Like "*" in Zeile 44 eingefügt und das gewünschte Ergebnis ist da :-) face-smile

Gruss
atk691
Bitte warten ..
Mitglied: Kraemer
07.12.2016 um 12:10 Uhr
Zitat von @atk691:
Du hast dich 2x in diesem Thread gemeldet. Beide mal nicht sonderlich produktiv.;-) face-wink
Aber irgenwie wirst Du ja Level 2 erreicht haben.
Nix für ungut ;-) face-wink
das sagt der richtige. Ist ja viel einfacher sich blöd zu stellen und andere machen zu lassen - naja streng genommen dies zu versuchen. Wie man sieht war es nämlich auch für dich ein leichtes, das Skript anzupassen.
Und wenn du dann mal irgendwann zu einer Lösung beigetragen hast, dann denke ich evtl. auch mal darüber nach, ob ich mich von dir kritisieren lasse...
Nix für ungut
Bitte warten ..
Mitglied: colinardo
LÖSUNG 07.12.2016, aktualisiert um 14:03 Uhr
Zitat von @atk691:

letzter Kommentar:
-and telephoneNumber -Like"*" -or MobilePhone -Like "*" in Zeile 44 eingefügt und das gewünschte Ergebnis ist da :-) face-smile
Richtiger wäre eher:
Oder alternativ auch über den LDAP-Filter:
Und vielen Dank dir ebenfalls für deine Spende. Sie ist soeben einer Krebsstiftung hier vor Ort zu Gute gekommen :-) face-smile

Schöne Restwoche
Grüße Uwe
Bitte warten ..
Mitglied: atk691
07.12.2016 um 15:32 Uhr
Wie gesagt, das übersteigt meinen PS-Horizont :-( face-sad
Habe deine Version eingepflegt - und - wen wunderts? - es läuft einwandfrei :-) face-smile

Das Thema hat mich doch recht stark motiviert mich in PS zu vertiefen.

Vielen Dank Uwe

Gruss
atk691
Bitte warten ..
Mitglied: xbast1x
09.12.2016 um 08:12 Uhr
@colinardo

Wenn ich Benutzer nur aus einer bestimmten OU in die Liste eintragen möchte, wie stelle ich das an? Wird der Filter OU mit in Zeile 83 angehangen?

Gruß xbast1x
Bitte warten ..
Mitglied: colinardo
09.12.2016 um 08:34 Uhr
Zitat von @xbast1x:

@colinardo

Wenn ich Benutzer nur aus einer bestimmten OU in die Liste eintragen möchte, wie stelle ich das an? Wird der Filter OU mit in Zeile 83 angehangen?

In Zeile 50 legst du fest welche Kontakte angelegt werden. Geb dort einfach zusätzlich den Parameter -SearchBase 'OU=Marketing,DC=domain,DC=de' mit dem DN deiner OU an, fertig.

Grüße Uwe
Bitte warten ..
Mitglied: xbast1x
09.12.2016, aktualisiert um 08:40 Uhr
Perfekt, merci ;)

Das gleiche könnte ich auch machen wenn ich nur eine bestimmte OU befüllen möchte. Das wäre dann die Zeile 53 korrekt?

Ich habe dir einen kleinen Obolus überlassen.
Bitte warten ..
Mitglied: colinardo
09.12.2016, aktualisiert um 11:19 Uhr
ACHTUNG an alle die das Script bereits verwenden, es wurde an einigen Stellen auf den aktuellen Stand gebracht.

Anfragen für persönliche Anpassungen nehme ich gegen eine entsprechende Aufwandsentschädigung gerne per PN entgegen.

Danke für euer Verständnis.
Grüße Uwe
Bitte warten ..
Mitglied: colinardo
LÖSUNG 17.12.2016, aktualisiert um 12:49 Uhr
Hier nur noch als Ergänzung eine aktuelle Variante des Scripts welches auch auf Exchange 2013 und 2016 lauffähig ist.
Falls der Beitrag gefällt, freue ich mich immer über eine kleine Spende / If you like my contribution please support me and donate

Wünsche euch allen schon einmal ein frohes Weihnachtsfest.
Grüße Uwe
Bitte warten ..
Mitglied: atk691
20.12.2016 um 10:06 Uhr
Perfekt :-) face-smile
hatte schon die Befürchtung, dass ich die Anpassungen an Exchange 2016 nicht gebacken kriege.

Vielen Dank Uwe

Gruss
atk691
Bitte warten ..
Mitglied: patrickebert
08.11.2017, aktualisiert um 21:14 Uhr
Super Skript Uwe,ich habe das Skript gerade schnell mal durchgelesen.
Doch eine Frage habe ich diesbezüglich
Erstellst du hier erst einen Öffentlichen Kontakte Ordner aus den User Eigenschaften und schreibst ihn dann in den Kontakte Ordner der User?
Die Frage kommt daher, da ich schon einen Öffentlichen Kontakte Ordner habe, welcher über unserer Datenbank abgeglichen wird
Und ich dies dann mit den Userproperties auslesen lassen könnte.

Gruß
Patrick
Bitte warten ..
Mitglied: colinardo
08.11.2017 um 22:29 Uhr
Hallo Patrick,
Erstellst du hier erst einen Öffentlichen Kontakte Ordner aus den User Eigenschaften und schreibst ihn dann in den Kontakte Ordner der User?
Nein, bei diesem Skript wird in jeder Mailbox der User unterhalb deren Default Kontakte Ordners ein weiterer Ordner erstellt in dem die Kontakte dann landen und bei weiteren Durchläufen dann nur noch aktualisiert/ergänzt/gelöscht.

Grüße Uwe
Bitte warten ..
Mitglied: patrickebert
09.11.2017 um 10:44 Uhr
Hey Uwe,
Vielen Dank für deine Info, habe es mir nun, da ich mehr Zeit habe, mal genauer durchgelesen und verstehe eigentlich alles was du machst.
Da ich aber nicht aus der AD auslesen will, sondern von einer Datenbank abfragen will. Ist mir ein Element noch nicht ganz klar, was er da genau macht und daher die Frage kannst du mir den Scriptschnipsel erläutern?
$True und $False sind ja eigentlich Konstanten und es sieht hier so aus als ob du diese neu definierst.
[char]129 ist das Telefonsymbol in AscII
Grüße
Bitte warten ..
Mitglied: colinardo
09.11.2017 um 11:07 Uhr
Das sind Workarounds für die Update-Prozedur bei Kontakten, da ansonsten Fehler beim Update auftreten und leere Felder hier zu Fehlern führen, deswegen das Füllen des Feldes mit einem nicht sichtbaren Zeichen.
Bitte warten ..
Mitglied: RedRocks
23.11.2018 um 09:48 Uhr
Hallo Zusammen,

funkioniert dieser Script auch für den Exchange Online?
Bitte warten ..
Mitglied: colinardo
23.11.2018, aktualisiert um 10:08 Uhr
Zitat von @RedRocks:

Hallo Zusammen,

funkioniert dieser Script auch für den Exchange Online?
Servus.
Ohne Anpassung, nein, dazu sind diverse Änderungen nötig. zumal ja erstens der Exchange aus dem AD ermittelt wird, die User aus dem lokalen AD kommen etc. pp.

Grüße Uwe
Bitte warten ..
Mitglied: WilliWillsWissen19
07.05.2019, aktualisiert um 09:21 Uhr
Moin,

ich habe das soweit bei mir laufen lassen und nur für einen Testaccount in Zeile 71 eingetragen "Get-Mailbox 'Timo Test' | %{".
Leider bekomme ich nach kurzer Laufzeit folgenden Fehler:

Creating connection to Exchange-Server 'Server.Domain.intern' ...
Updating Mailbox 'Timo Test'.
% : Exception calling "FindFolders" with "3" argument(s): "The request failed. The remote server returned an error: (400) Bad Request."
At C:\_Tools\Scripte\Kontakte-in-Useradressbuch.ps1:71 char:27
Get-Mailbox 'timo test' | %{

CategoryInfo : NotSpecified: ( [ForEach-Object], MethodInvocationException
FullyQualifiedErrorId : ServiceRequestException,Microsoft.PowerShell.Commands.ForEachObjectCommand

Wir nutzen Exchange 2016 mit CU 12 (Version 15.1 ‎(Build 1713.5)‎), insgesamt 4 Systeme mit 2 DAG Clustern (2 Server pro Standort in einem DAG)

Danke für einen Gedankenanschubser...

Grüße
Der Willi
Bitte warten ..
Mitglied: atk691
08.05.2019 um 18:53 Uhr
Ohne das sich jetzt dein komplettes script kenne: Daran denken, dass es in der Exchange-shell und mit Adminrechten laufen muss.
Deine Errors sehen schon ein wenig nach Berechtigungspoblemen aus ;-) face-wink

Gruss
atk691
Bitte warten ..
Mitglied: WilliWillsWissen19
09.05.2019 um 08:24 Uhr
@atk691
Danke für den Ratschlag, das habe ich bereits überprüft. :-) face-smile

Die Exchange-Shell ist unter dem Domänen-Administrator über Rechtsklick, als Administrator ausführen gestartet. Soweit sollte es passen. Die erforderlichen Rechte hat der Domänen-Admin auch um im Exchange "arbeiten" zu dürfen.

Wir haben wie gesagt 2 DAG in 2 Standorten. Jeder Standort hat seine eigene DAG.

DAG Standort A:
Exchangeserver1-A
Exchangeserver2-A

DAG Standort B:
Exchangeserver1-B
Exchangeserver2-B

Die Mailbox von "Timo Test" liegt im Standort A. Wenn ich das Skript im Standort B ausführe, kommt der bereits geschriebene Fehler.
In Standort A läuft das Skript zwar etwas weiter, dann kommt aber diese Meldung:

Creating connection to Exchange-Server 'exchangeserver1-a.domäne.intern' ...
Updating Mailbox 'Timo Test'.
Creating the contact folder 'Firmenkontakte' in Mailbox.
Exception calling "Save" with "1" argument(s): "The request failed. The remote server returned an error: (400) Bad Request."

Hier mal das eingesetzte Skript: (es wurden noch Änderungen vorgenommen und entsprechend kommentiert.)
Es scheint als stehe ich auf dem Schlauch..

Grüße
Der Willi
Bitte warten ..
Mitglied: colinardo
23.07.2020, aktualisiert um 16:54 Uhr
Servus,
auch wenn der Thread schon einige Zeit auf dem Buckel hat, nur noch als Ergänzung für die die hier vorbei schlendern und vielleicht etwas leicht abweichendes suchen.

Ein Powershell-Skript aus meiner Feder das einen öffentlichen Ordner in die User-Mailboxen One-Way synchronisiert:

Also Öffentlicher Ordner => Kontakt-Ordner der User-Mailbox (bestehende Kontakte bleiben natürlich erhalten)

https://administrator.de/forum/exchange-%C3%B6ffentliche-order-smartphon ...

Grüße Uwe
Bitte warten ..
Heiß diskutierte Inhalte
Microsoft
STRG + ALT + ENTF
TezzlaVor 1 TagAllgemeinMicrosoft12 Kommentare

Mahlzeit zusammen, wir haben gerade im Kollegenkreis über Sinn und Unsinn der Sperrbildschirmentriegelung STRG + ALT + ENTF unter Win10 diskutiert. Mich würde hierzu ...

Video & Streaming
Streamingplattform mit eigenen Servern
gelöst icegetVor 1 TagFrageVideo & Streaming6 Kommentare

Hallo liebe Community, ich würde gerne via Amazaon AWS (oder andere Cloudanbietern) mehrere Serverinstanzen (Streaming) starten, um z.B. 2000 Personen den selben Stream den ...

Hardware
Outdoor LAN sichern mit oder ohne Fritzbox Verständnis Frage
bluescreenVor 1 TagFrageHardware15 Kommentare

Hallo zusammen, ich habe die letzten Stunden schon viel hier gelesen, stehe aber ein wenig auf dem Schlauch, wie und wo ich weiter suchen ...

Windows Server
Nutzer als lokaler Admin in Windows Server 2019
hanheikVor 1 TagFrageWindows Server6 Kommentare

Hallo, in SBS 2011 konnte ich ganz einfach einen Nutzer als lokalen Admin einstellen. Windows fragte dann, für welchen Rechner; Rechner auswählen; fertig! In ...

Windows Netzwerk
Telefone im Netzwerk bekannt machen
jannik0205Vor 23 StundenFrageWindows Netzwerk13 Kommentare

Hallo Zusammen, In unserem Unternehmen gibt es eine Telefonanlage mit eigenem Telefonienetz (192.168.5.X). Schließe ich ein Telefon an eine Netzwerkdose, bekommt es vom DHCP- ...

Windows 10
Windows 7 pro Lizenz nutzen für Windows 10
lukas0209Vor 18 StundenFrageWindows 1013 Kommentare

Hallo Community, ich versuche seit einigen Wochen unser Netzwerk von Windows Server 2008 R2 Standard auf Windows Server 2016 Essentials um, welches eine städtische ...

Datenschutz
Übergang von "Sorgfaltspflicht" im Datenschutz
ukulele-7Vor 1 TagFrageDatenschutz7 Kommentare

Hallo zusammen, mir ist eine, zugegeben eher juristische, Frage in den Sinn gekommen. In unserer Branche arbeiten wir mit sensiblen, personenbezogenen Daten die natürlich ...

Windows Server
Remotedesktop Lizenzzierungsserver
Leffe69Vor 1 TagFrageWindows Server11 Kommentare

Hallo! Ich habe zwei Win Server ohne AD: Win 2019 Standard - Auf diesem sind die RDS Zugriffslizenzen installiert. Win 2008 R2 - Dieser ...