Jump to content

Kontakte via Powershell in PublicFolder -> Performance


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Forum,

ich habe mir ein Powershell-Skript geschrieben, welches mir alle Kontakte aus unserer Warenwirtschaft (über den Umweg einer CSV) in diverse öffentliche Ordner importiert.

Nebenbei bemerkt ist diese Skript auch gleich mein erster "Gehversuch" mit Powershell :-)
Ich muss dazu sagen, dass wir momentan noch David.fx von Tobit einsetzen und die Migration auf Exchange 2013 für nächstes Jahr planen, d.h. wir haben nun einen Exchange 2013 in der Domäne laufen und passen unsere selbstprogrammierten Lösungen vor der Migration auf Exchange an. Dementsprechend sind wir auch (noch) nicht so fit im Umgang mit Exchange / Outlook - meine letzten Erfahrungen mit Exchange waren zu 5.5/NT4.0-Zeiten, als ich den MCSE gemacht habe :-)

Nun zu dem Problem:
Grundsätzlich funktioniert das Skript einwandfrei - bis auf die Tatsache, dass der Import (über EWS) nach einer bestimmten Anzahl von importierten Kontakten "einbricht": Die ersten ca. 3000 Kontakten werden 100 Kontakte in ca 6 Sekunden importiert. Nach diesen ersten ca. 3000 Kontakten braucht das Skript plötzlich pro 100 Kontakte 12-16 Sekunden!

Breche ich dann das Skript ab und starte es neu, läuft der Import trotzdem langsam, also ca 100 Kontakte in 12-16 Sekunden.

Warte ich einige Minuten ab und starte das Skript neu, läuft der Import wieder scheller, d.h. ca 100 Kontakte in 6 Sekunden.

Meine Vermutung: Throttling bremst das Skript aus. Ergo habe ich das Skript erweitert, so dass eine neue Policy vor dem Import erstellt und dem Import-Benutzer zugewiesen wird....leider ohne Erfolg, der Import wird wie gehabt ab einer bestimmten Anzahl importierter Kontakte ausgebremst. Defintiv ist die Policy aber für den entsprechenden User aktiv. Eventuell habe auch die Policy nicht korrekt angepasst, ich habe lediglich die Ews*-Parameter auf $null gesetzt…?

Hat jemand einen Tip, wie ich den Import beschleunigen könnte? Geplant ist, dass der Import täglich während der Nachstunden läuft, insofern wäre es egal, wenn der Import 1 oder 2 Stunden läuft - aber schön ist es natürlich nicht, ich würde es dann doch gerne "richtig" machen :-)

Muss eventuell die Policy fest dem User zugewiesen werden und kommt erst nach einer gewissen Karenz/Reolikationszeit zum tragen?


Beim Schreiben fällt mir gleich noch ein weiteres Problem ein:
Ich würde auch gerne das Notizen-Feld zu den Kontakten mit Inhalt füllen…so weit ich es übersehe, werden diese Daten im Message-Body zu dem Kontakt gespeichert.
Leider fehlt mir absolut der Ansatz, wie ich diesen Body via Powershell anlege bzw mit Inhalt fülle. Vielleicht hat ja jemand eine Idee dazu, ich wäre sehr verbunden :-)

 

 

Hier mal der (hoffentlich) relevante Teil des Skripts:

# CSV öffnen
    $contactfile = Import-CSV $rawfile -Delimiter ";" -Encoding OEM

    # Counter auf 0 setzen
    $counter=0

    #Benchmark
    $startdate=get-date
    

    # zeilenweise einlesen und zaubern :)
    ForEach ($contact in $contactfile) 
    {
        #inkre Counter
        $counter++

        # Read all attributes from CSV
	    $CSV_Firma=$contact.ADR_FIRMA
	    $CSV_Fax=$contact.ADR_FAX
	    $CSV_EMail=$contact.ADR_EMAIL
	    $CSV_Strasse=$contact.ADR_STRASSE
	    $CSV_Ort=$contact.ADR_ORT
	    $CSV_PLZ=$contact.ADR_PLZ
	    $CSV_Tel_G=$contact.ADR_TEL_GESCHAEFTLICH
	    $CSV_Tel_M=$contact.ADR_TEL_MOBIL
	    $CSV_Land=$contact.ADR_LAND
            $CSV_KdNr=$contact.ADR_NR
            $CSV_Website=$contact.ADR_HTTP

      
        # Create New Contact
        $item = New-Object Microsoft.Exchange.WebServices.Data.Contact($ews) 
        
        # Angezeigter Name
        $item.DisplayName = $CSV_Firma

        # Anzeigen als:
        $item.Subject = $CSV_Firma
        
        # Firmenbezeichung + KdNR
        $item.CompanyName = $CSV_Firma+" ["+$CSV_KdNr+"]"
        
        # WebSite
        $item.BusinessHomePage = $CSV_Website

        # Speichern unter
        $item.fileas = $CSV_Firma

        if($CSV_EMail -ne "")
        {
           # Email-Adresse
           $item.EmailAddresses[[Microsoft.Exchange.WebServices.Data.EmailAddressKey]::EmailAddress1] = $CSV_EMail
        }

        # Telefon-Nummer 
        $item.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::BusinessPhone] = $CSV_Tel_G

        # Telefon-Nummer mobil
        $item.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::MobilePhone] = $CSV_Tel_M

        # Fax-Nummer
        $item.PhoneNumbers[[Microsoft.Exchange.WebServices.Data.PhoneNumberKey]::BusinessFax] = $CSV_Fax


        # Adresse
        $itemAddress = New-Object Microsoft.Exchange.WebServices.Data.PhysicalAddressEntry 
        $itemAddress.Street = $CSV_Strasse
        $itemAddress.City = $CSV_Ort
        $itemAddress.CountryOrRegion = $CSV_Land 
        $itemAddress.PostalCode = $CSV_PLZ
        $item.PhysicalAddresses[[Microsoft.Exchange.WebServices.Data.PhysicalAddressKey]::Business] = $itemAddress 
        $item.PostalAddressIndex = [Microsoft.Exchange.WebServices.Data.PhysicalAddressIndex]::Business
        $item.Body=New-Object Microsoft.Exchange.WebServices.Data.MessageBody
        $item.Body="Notizen"

        # Kontakt speichern
        $item.Save($folder.Id) 
        
     
        # Zeit für den Import von 100 Kontakten ermitteln (Statistik ist halt was schönes :-))
        if(!($counter%100)) 
        {
        $tmp=$counter-100
        $stopdate=get-date
        $benchtime=($stopdate-$startdate).totalseconds
        $startdate=get-date
        LogWrite "Datensatz $tmp bis $Counter in $benchtime Sekunden importiert."
        }
 } 

 

Link zu diesem Kommentar

Moin,

das Ganze läuft direkt auf dem Exchange-Server. Vor 3 Wochen installiert, Exchange 2013 als auf einem ESX 5.1, die VM hat 16 GB RAM und 4 Cores. OS ist 2008R2.

Wenn ich da in den Taskmanager schaue, langweilt sich die Maschine, CPU-Auslastung ist minimal auf max 5%.

RAM ist auch noch ne Menge frei.

 

Habe heute mal das Skript auf meiner Entwicklungsmaschine gestartet - ebenfalls eine VM, allerdings auf einem anderen Host. Die VM läuft mit 2008 Server und hat lediglich 4 GB RAM...dort läuft es quasi genauso schnell.

Dann muss doch der Flaschenhals eher beim Exchange-Server sein, oder?

Ich kann morgen das Skript ansonsten auch noch mal auf meinem Win8-Client starten (keine VM), denke aber nicht, dass es da schneller laufen wird...

 

/edit:

Gibt es denn deinerseits Erfahrungswerte, wie schnell der Import "Pi mal Daumen" laufen sollte?

bearbeitet von Winnie75
Link zu diesem Kommentar

Nabend,

 

nee, da sind die Rahmenbedingungen immer zu unterschiedlich. Aber ich denke 6 Sekunden pro 100 Kontakte sind ein super Benchmark.

Halt alles ohne Last, aber das iss okay.

Aber gut, wenn das direkt auf der Maschine läuft, dann geht dann ist das eigentlich optimal.

 

Wieviel importierst du denn insgesamt, wenn bei 3000 der Performanceeinbruch kommt?

 

Was mir noch auffällt: du weißt oben die Werte deinen Variablen zu. Warum? Überspringe den Punkt und nimm direkte die Werte des Objektes:

# Angezeigter Name
$item.DisplayName = $contact.ADR_FIRMA

Bei so vielen durchläufen macht sich das bestimmt bemerkbar.

Zudem vermeidest du folgenden Fehler: wenn ein Wert von einem Datensatz nicht gefüllt ist, dann schreibt dein Script den Inhalt von dem letzten Datensatz in deinen Kontakt, was ja falsch wäre.

 

Zudem durchläuft dein Script immer die if-Klausel. Nimm die auch ma raus.

 

Dann zu den Notes. Leg mal einen Kontakt mit Notes an und ließ diese aus. Dann solltest du auch relativ schnell sehen, wie du diese Füllen kannst.

 

Zudem gibt es noch das cmdlet New-MailContact (http://technet.microsoft.com/en-us/library/bb124519%28v=exchg.150%29.aspx), weiß aber nich, ob das in einen öffentlichen Ordner schreiben kann. Musst mal schauen.

 

Schönen Abend noch!

Link zu diesem Kommentar

Insgesamt sind es ca 11.000 Kontakte...aber gut, wenn Du sagst der Speed passt so, dann bin ich zufrieden.

 

Danke für den Tip bzgl direkt die Werte aus dem Objekt zu nehmen, werde ich morgen gleich mal umsetzen!

 

Mit der If-Klausel meinst du vermutlich die Stelle, bei der geprüft wird, ob die Mail-Adresse einen Wert enthält? Stimmt, die ist mehr aus "historischen" Gründen drin, kann ich dann wohl auch besser mal rausnehmen.

 

Ich werde mich morgen mal damit beschäftigen und melde mich dann nochmal - erstmal vielen Dank für deine konstruktive Hilfe!

Link zu diesem Kommentar

Die If-Klausel hab ich gar nich gesehen ;)

Ich meinte die ganz unten.

 

Ach so - die werde ich wohl später rausnehmen, momentan ist es ganz hilfreich, in der Log-Datei ein wenig Statistik zu haben.

 

Ansonsten habe ich jetzt die von Dir vorgeschlagenen Änderungen vorgenommen.

Die Sache mit dem Notizfeld habe ich auch gelöst bekommen:

 

# Notizfeld
$CR="`n"
$BodyText ="ERP Adress-Nummer: "+$contact.ADR_NR+$CR
$BodyText +="ERP Adress-Gruppe: "+$contact.ADR_ART+$CR+$CR
$BodyText +="Letzte Aktualisierung: "+$startdate

$item.Body=New-Object Microsoft.Exchange.WebServices.Data.MessageBody
$item.Body.BodyType=[Microsoft.Exchange.WebServices.Data.BodyType]::Text
$item.Body.Text=$BodyText 

Ist zwar Plaintext, d.h. keine Formatierung usw...aber was zählt, sind die Informationen, nicht die Form :-)

 

Ich mache nun grad mal eine Test-Import der 11.000 Kontakte, diesmal wird das Skript nach 5600 importierten Kontakten ausgebremst - anfangs ca 6-10 Sekunden/100 Kontakte, dann 17-19 Sekunden / 100 Kontakte.

 

Ich denke aber, mit der Geschwindigkeit kann ich leben.

 

Danke für die Hilfe!

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...