none
Bug im Programm Fehler abfangen RRS feed

  • Frage

  • Guten Abend,

    ich habe ein kleines Skript geschrieben, welches MailKontakte mit Name,PrimarySmtpAdress,ExchangeLegacyDN ausliest und in eine CSV Datei schreibt.

    Diese Datei möchte ich dann in einem weiteren Skript benutzen, um die PrimarySmtpAdress,ExchangeLegacyDN in die vorhandenen Mailkonten einzutragen und den Kontakt danach löschen.

    Der Bug ist, wenn kein Mailkonto gefunden wird, wird der MailKontakt trotzdem gelöscht. Ist natürlich nicht schön und ich würde das gerne irgendwie abfangen. Beschäftige mich erst seit ein paar Tagen mit der Powershell und bin wahrlich kein Programmierer und würde mich über Tipps freuen.

    Warum das Skript? Der Kunde migriert gerade.

    Hier das Skript für den Export in die CSV Datei:

    ### Diese Skript exportier alle Mailkontakte inklusive X500 Addresse in eine
    ### CSV Datei und speichert diese unter C:\powershell\exportcontacts.csv ab.
    ### 
    Write-Host ""
    write-Host -ForegroundColor Green "Diese Skript exportier alle Mailkontakte inklusive X500 Addresse in eine"
    write-Host -ForegroundColor Green "CSV Datei und speichert diese unter C:\powershell\expcontacts.csv ab."
    write-host ""
    
    ####Eingabe ob Programm gestartet werden darf ja/nein ####
    $argument = Read-Host "Möchten Sie forfahren: ja/nein"
    if ($argument -eq "ja") {
    write-host""
    write-host -ForegroundColor Green "Sie haben mit Ja geantwortet, Programm wird ausgeführt"
    get-mailcontact | select name,PrimarysmtpAddress,LegacyExchangeDN | export-csv c:\powershell\exportcontacts.csv
    write-host""
    Write-Host -ForegroundColor Green "Datei expcontatcts.csv wurde erfolgreich erstellt."
    }
    if ($argument -eq "nein") { 
    write-host""
    write-host -ForegroundColor red "Sie haben mit Nein geantwortet, das Programm wird beendet."
    write-host""
    			  }

    Hier der Import und das Löschen der Mailkontakte:

    ### Diese Skript liest die zu löschenden Mail Kontakte aus einer CSV Datei aus und löscht diese.
    ### Danach werden die E-Mail Adresse und die X500 Adresse aus der CSV Datei zu den entsprechenden
    ### Postfächern hinzugefügt.
    ###
    ###	Anwendung:
    ###
    ###	Erstellen Sie ein Verzeichnis C:\Powershell
    ###	Erzeugen Sie eine Datei mit dem Namen importcontacts.csv
    ###	Die CSV Datei muss folgende Formatierung haben: 
    ###
    ###	"name","mail","mail2"
    ###	"Netmail Archive","netmailx500@sitaas.de","netmailar@sitaas.de"
    ###	"Test Test","testx500@sitaas.de","Test12@sitaas.de"
    ###
    ###	Und kann mit folgendem Powershell Befehl erzeugt werden:
    ###
    ###	get-mailcontact | select displayName, PrimarySMTPAddress, @{Name="Emailaddresses";expression={$
    ###	_.Emailaddresses | where {$_ -like "*X500:*"}}} | export-csv C:\powershell\exportcontacts.csv -Notype
    ###
    ###     Nach dem Export muss die csv Datei noch angepasst werden. Displayname wird durch name, PrimarySmtpAddress wird
    ###     durch mail1 und Emailaddresses wird durch mail2 ersetzt. Dies ist ein Sicherheitsfeature, damit nicht gleich
    ###     alle Dateien überschrieben werden.
    
    #### Was macht das Programm ####
    
    write-host ""
    write-host -ForegroundColor Green "Diese Skript liest die zu löschenden Mail Kontakte aus einer CSV Datei aus und löscht diese."
    write-host -ForegroundColor Green "Danach werden die E-Mail Adresse und die X500 Adresse aus der CSV Datei zu den entsprechenden"
    write-host -ForegroundColor Green "Postfächern hinzugefügt."
    write-host ""
    
    ####Eingabe ob Programm gestartet werden darf ja/nein ####
    
    $argument = Read-Host "Möchten Sie forfahren: ja/nein"
    
    write-host""
    
    if ($argument -eq "ja") {
    write-host""
    write-host -ForegroundColor Green "Sie haben mit Ja geantwortet, Programm wird ausgeführt"
    write-host""
    
    #### Einlesen der CSV Datei ####
    
    $mail = Import-csv C:\Powershell\importcontacts.csv
    
    #### Hier werden die Änderungen getätigt, Kontakte werden gelöscht und die Adressen in die Dateien geschrieben. ####
    
    $mail | ForEach {Remove-MailContact -Identity $_.name -Confirm:$false ; Set-Mailbox $_.name -EMailAddresses @{Add=($_.PrimarySmtpAddress),("X500:"+$_.LegacyExchangeDN)}}
    write-host -ForegroundColor Green "Programm wurde erfolgreich ausgeführt."
    			}
    if ($argument -eq "nein") { 
    write-host""
    write-host -ForegroundColor red "Sie haben mit Nein geantwortet, das Programm wird beendet."
    write-host""
    			  }
    		

    Dienstag, 30. Oktober 2012 17:46

Antworten

  • Moin,

    sehe ich das richtig, die einzige echte Zeile, die was tut, ist diese hier:

    $mail | ForEach {Remove-MailContact -Identity $_.name -Confirm:$false ; Set-Mailbox $_.name -EMailAddresses @{Add=($_.PrimarySmtpAddress),("X500:"+$_.LegacyExchangeDN)}}

    Für Dein Problem gäbe es zwei Lösungen:

    1. Die schöne: Frage mit Get-MailContact -Identity $_.name ab, ob es den Kontakt gibt und lösche ihn nur dann, wenn es ihn gibt (if).
    2. Die schnelle: Unterdrücke die Fehlermeldung mit "-erroraction SilentlyContinue".

    :)

    Und noch ein technischer Hinweis: Exchange wird mit der Zeile vermutlich ein Problem haben. Zum einen musst Du die AD-Replikation abwarten, bevor Du die Adresse wieder benutzen kannst. Ein kleiner Workaround wäre es, mit dem Schalter "-domaincontroller" einen DC direkt anzugeben. Den müsstest Du dann in beiden CMDLETs verwenden. Eventuell brauchst Du zwischen Remove- und Set- auch eine Pause, mit "start-sleep".

    Und wenn es ganz hart kommt, muss zwischen den beiden Schritten die GAL aktualsiert werden. Das übersteigt dann aber vermutlich das Forum


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Dienstag, 30. Oktober 2012 17:57

Alle Antworten