none
SMTP Adressen aus .txt in eine DistributionGroup importieren RRS feed

  • Frage

  • Hallo Leute,

    überlege, teste und suche schon nach einer weile um Exportierte SMTP's (in .txt File) einer DistributionGroup hinzuzufügen.

    Also es gibt einen .txt mit den SMTP's:

    test1@contoso.com

    test2@contoso.com

    test3@contoso.com

    test4@contoso.com

    Diese SMTPs sollen als secondary mail addresses eine Distribution group hinzugefügt werden.

    Wie stelle ich das an? Die Menge der zu importierenden SMTPs kann unterschiedlich sein. Daher sicherlich eine foreach-Schleife.

    Von der DistributionGroup ist nur die PrimarySMTP bekannt.

    $DistributionGroup = "Group-Test-VT2@contoso.com"
    $SMTPS = Get-Content "C:\Temp\Admin.TB\TestSMTP.txt"
    
    foreach ($SMTP in $SMTPS) {
    
    	Get-DistributionGroup |Where {$_.PrimarySmtpAddress -like $DistributionGroup} |Set-DistributionGroup -EmailAddressPolicyEnabled $false -EmailAddresses $SMTP
    
    }

    Habt ihr eine Idee? Komm hier nicht wirklich weiter.

    VG, Thomas


    • Bearbeitet Digiflex Montag, 30. Juli 2012 13:51
    Montag, 30. Juli 2012 13:46

Antworten

  • Moin,

    wenn Dudie Adressen komplett überschreibst, ist das ganze sehr einfach.

    Die Exchange-Entwickler haben nämlich dafür gesorgt, dass das Array AUTOMATISCH ins richtige Format konvertiert wird:

    $adressen = Get-Content C:\smtp.txt
    Set-DistributionGroup test22 -EmailAddressPolicyEnabled $false -EmailAddresses $adressen

    Das reicht. Foreach ist dann nicht notwendig.

    Es gibt aber dann EINE kleine Voraussetzung:

    Du musst in der Textdatei alle Adressen nach primär und sekundär kennzeichen, aber das muss Du beim Schalter -EmailAddresses sowieso. Du musst eine Adresse als die primäre kennzeichnen.

    Die Textdatei, die ich oben importiere sah wie folgt aus:

    SMTP:test1@contoso.com
    smtp:test2@contoso.com
    smtp:test3@contoso.com
    smtp:test4@contoso.com

    Solltest Du dagegen die Adressen wirklich nur hinzufügen wollen, könnte das so aussehen (Text-Datei wie bei Dir, dann ist keine Kennzeichnung notwendig):

    $DistributionGroup = "Group-Test-VT2@contoso.com"
    $SMTPS = Get-Content "C:\Temp\Admin.TB\TestSMTP.txt"
    
    $old = Get-DistributionGroup |Where {$_.PrimarySmtpAddress -like $DistributionGroup}
    
    foreach ($SMTP in $SMTPS) {
            $old.EmailAddresses.add($SMTP )
    }
    Set-DistributionGroup $old -EmailAddressPolicyEnabled $false -EmailAddresses $old.EmailAddresses

    WICHTIG: Hier werden die Adressen wirklich nur hingefügt. Sollte eine solche Adresse schon in der Auflistung der Verteilergruppe drin sein, knallt es beim "add".


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert Digiflex Mittwoch, 1. August 2012 13:54
    Montag, 30. Juli 2012 16:33

Alle Antworten

  • Moin,

    wenn Dudie Adressen komplett überschreibst, ist das ganze sehr einfach.

    Die Exchange-Entwickler haben nämlich dafür gesorgt, dass das Array AUTOMATISCH ins richtige Format konvertiert wird:

    $adressen = Get-Content C:\smtp.txt
    Set-DistributionGroup test22 -EmailAddressPolicyEnabled $false -EmailAddresses $adressen

    Das reicht. Foreach ist dann nicht notwendig.

    Es gibt aber dann EINE kleine Voraussetzung:

    Du musst in der Textdatei alle Adressen nach primär und sekundär kennzeichen, aber das muss Du beim Schalter -EmailAddresses sowieso. Du musst eine Adresse als die primäre kennzeichnen.

    Die Textdatei, die ich oben importiere sah wie folgt aus:

    SMTP:test1@contoso.com
    smtp:test2@contoso.com
    smtp:test3@contoso.com
    smtp:test4@contoso.com

    Solltest Du dagegen die Adressen wirklich nur hinzufügen wollen, könnte das so aussehen (Text-Datei wie bei Dir, dann ist keine Kennzeichnung notwendig):

    $DistributionGroup = "Group-Test-VT2@contoso.com"
    $SMTPS = Get-Content "C:\Temp\Admin.TB\TestSMTP.txt"
    
    $old = Get-DistributionGroup |Where {$_.PrimarySmtpAddress -like $DistributionGroup}
    
    foreach ($SMTP in $SMTPS) {
            $old.EmailAddresses.add($SMTP )
    }
    Set-DistributionGroup $old -EmailAddressPolicyEnabled $false -EmailAddresses $old.EmailAddresses

    WICHTIG: Hier werden die Adressen wirklich nur hingefügt. Sollte eine solche Adresse schon in der Auflistung der Verteilergruppe drin sein, knallt es beim "add".


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert Digiflex Mittwoch, 1. August 2012 13:54
    Montag, 30. Juli 2012 16:33
  • Hallo Robert,

    danke für dein Beitrag und die ausführliche Erklärung.
    Um es mir einfach zu machen und deinen erste und vermutlich einfachste Möglichkeit zu nutzen, würde ich jetzt die SMTPs immer wie folgt auslesen.

    Get-Mailbox Test.User | select EmailAddresses | foreach {
    	$_.EmailAddresses | foreach {
     		if($_.SmtpAddress){
     			if($_.IsPrimaryAddress){
     				"$_" |Out-File $user_smtpFile
     			} else {
     				"$_" |Out-File $user_smtpFile -Append
     					}
    				}
    		}
    	}

    Damit sollte ich nun das passende Format haben und kann deinen Code nutzen:

    $adressen = Get-Content C:\smtp.txt
    Set-DistributionGroup test22 -EmailAddressPolicyEnabled $false -EmailAddresses $adressen

    Das scheint mir am Besten! Ich werde es ertsmal Testen und nochmal eine Info geben. ;)

    Beste Grüße aus Leipzig
    Thomas


    • Bearbeitet Digiflex Dienstag, 31. Juli 2012 09:15
    Dienstag, 31. Juli 2012 09:14
  • Hallo Thomas,

    na ja, wie heißt es so schön: Es gibt keine guten oder schlechten Programme, nur funktionieren und nicht funktionierende.

    Und Deine Lösung wird sicher funktionieren, auch wenn der Umweg über eine temporäre Datei nicht notwendig wäre, einfaches Array würde auch reichen.

    Aber eine kleine Anmerkung:

                if($_.IsPrimaryAddress){
                    "$_" |Out-File $user_smtpFile
                } else {
                    "$_" |Out-File $user_smtpFile -Append
                        }
                   }
           }

    Ich weiß aus dem Kopf nicht, ob sichergestellt ist, dass die primäre Adresse auch wirklich verbindlich die erste Adresse ist. Wenn sie irgendwann mal als dritte Adresse aufschlägt, dann würde die Datei die bereits bestehende einfach überschreiben und die beiden ersten Adressen wären weg.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Dienstag, 31. Juli 2012 09:22
  • Deine Anmerkung ist berechtigt. Ich habe es gerade mal bei 5 User versucht und bei einem kam die Primary SMTP an zweiter Stelle. Das ist natürlich mist1 :(
    Der Grund warum ich die SMTP in eine Outfile schreibe ist folgender:

    -> existierende Mailbox soll abgeschalten
    -> Vorab DistributionGroup erstellen
    -> SMTPs von Mailbox wird in File geschrieben
    -> Mailbox wird disabled
    -> SMTPs in erstellte DistributionGroup importiern

    Also werde ich kein Array mehr machen können, da die Mailbox nicht mehr exestiert. Deshalb bleibt mir nur übrig vorab die SMTPs in ein File zu sichern.

    Was kann ich tun damit das Ergebnis sauber ist?

    Gruß
    Thomas

    Dienstag, 31. Juli 2012 11:12
  • Deine Anmerkung ist berechtigt. Ich habe es gerade mal bei 5 User versucht und bei einem kam die Primary SMTP an zweiter Stelle. Das ist natürlich mist1 :(

    Ok, habe ich befürchtet. Als Programmierer darf man sich halt nie auf den Input verlessen.

    Der Grund warum ich die SMTP in eine Outfile schreibe ist folgender:

    -> existierende Mailbox soll abgeschalten
    -> Vorab DistributionGroup erstellen
    -> SMTPs von Mailbox wird in File geschrieben
    -> Mailbox wird disabled
    -> SMTPs in erstellte DistributionGroup importiern

    Also machst Du das eigentlich in zwei Scripten? Man könnte das auch alles in einem machen. Aber vermutlich würde ich das auch in eine Datei schreiben. Sonst wären die Informationen nach dem Löschen der Mailbox verloren, wenn dann ein Script fehler auftritt. So hat man wenigstens noch die Mail-Adressen übrig.

    Was kann ich tun damit das Ergebnis sauber ist?

    Du kannst bei Out-File den Schalter -append immer angeben. Wenn die Datei nicht existiert, wird sie neu erzeugt.

    Wenn Du sicher gehen willst, dass keine "alte" Datei da ist, dann lösch sie halt vorher mit remove-item.

    Dann musst Du nur sicherstellen, dass zwischen den zwei Scripten niemand anders was mit der Datei macht, z.B. das erste Script zweimal ausführt.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Dienstag, 31. Juli 2012 11:30
  • Hallo,

    als erstes müsstest du die PrimarySMTP und die proxyAdresses aus der Mailbox auslesen und in verschiedene Variablen speichern. Wichtig ist hier auch, den x500 (LegasyExchangeDN eintrag zu speichern, damit die Adresse später auch noch erreicht werden kann, wenn man auf Mails der alten Mailbox antwortet.

    du musst die neue DL in 2 Schritten anlegen: 

    1. New-DistributionGroup -Name() -OrganizationalUnit($OUPath) -DisplayName() -SamAccountName($Alias) -PrimarySmtpAddress($)
                                
                            
     2. Set-DistributionGroup -id(Name von oben) -SendOofMessageToOriginatorEnabled:$false -RequireSenderAuthenticationEnabled:$false -EmailAddresses @{Add=$X500,$smtp1,$smtp2}

    hier werden dann die zusätzlichen Adressen und die X500 eingetragen.

    Gruß

    Uwe

    Mittwoch, 1. August 2012 07:37
  • > -EmailAddresses @{Add=$X500,$smtp1,$smtp2}

    das ist auch schicke, kannte ich noch nicht.

    Gleich notiert, danke!


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Mittwoch, 1. August 2012 08:42
  • > -EmailAddresses @{Add=$X500,$smtp1,$smtp2}

    das ist auch schicke, kannte ich noch nicht.

    Gleich notiert, danke!


    Grüße aus Berlin schickt Robert
    MVP Exchange Server

    geht meines wissen nach aber erst ab Exchange 2010 :-)
    Mittwoch, 1. August 2012 08:45
  • Hallo Uwe,

    Danke für deinen Beitrag! Sollte es in jeder Mailbox immer eine x500 Adresse geben? Denn dies ist in meinem Szenario nicht immer der Fall! Teilweise haben manche eine x400 Adresse.

    - Für was steht der Parameter "-SendOofMessageToOriginatorEnabled:$false "?
    - Wo werden die Variablen $X500,$smtp1,$smtp2 definiert und was steckt im einzelnen hinter $smtp1,$smtp2?

    Sorry für die vielen Fragen aber ich tappe noch etwas im dunkeln :-/

    Gruß
    Thomas

    Mittwoch, 1. August 2012 09:00
  • Hallo Thomas,

    die X500 Adresse wird standardmäßig nicht angezeigt, die bekommst du raus wenn du ADSIEditor startest und auf das Attribut LegacyExchangeDN gehst, oder Get-Mailbox username | select LegacyExchangeDN

    wenn ich dich richtig verstanden hast, hast du in der zu löschenden Mailbox neben der PrimarySMTP noch weitere SMTP Adressen; hier musst du separieren

    1. PrimarySMTP Address

    2. ProxyAddresses (findest du auch, wenn du ADSIEditor aufrufst, oder | slect proxyaddresses

    du hast natürlich die möglichkeit die proxyaddresses in ein Array zu spreichern, leider funktioniert dann der Aufruf -EmailAddresses @{Add=$X500,$array} nicht da das Array nicht richtig abgearbeitet wird, zumindest habe ich es nicht hinbekommen an dieser Stelle. Also habe ich für jede ProxyAddress eine eigene Variable genommen. Das ganze habe ich aus einer .csv Datei auslesen lassen.

    3. der Parameter "-SendOofMessageToOriginatorEnabled:$false  steht dafür, dass keine Abwesenheitsnotiz (Oof) gesendet wird.

    Nur Fragen bringen ein weiter :-)

    Gruß

    Uwe

    Mittwoch, 1. August 2012 09:41
  • ergänzt zu Uwe:

    Danke für deinen Beitrag! Sollte es in jeder Mailbox immer eine x500 Adresse geben? Denn dies ist in meinem Szenario nicht immer der Fall! Teilweise haben manche eine x400 Adresse.

    Nicht die beiden verwechseln, nur weil sie sehr ähnlich klingen.

    Uwe meint das LegasyExchangeDN.

    Technische gesehen musst Du Dir darum keine Gedanken machen. Exchange legt die selbst an und verwaltet sie auch intern. Ein "normaler" Admin kommt eigentlich nur an zwei Stellen damit in Berührung: Wenn er ein getrenntes Postfach wiederverbinden will findet die Console den original Benutzer über den LegasyExchangeDN.

    Und wenn Anwender auf eine Mail antworten und sich der LegasyExchangeDN geändert hat. Outlook hat sich den nämlich auch gemerkt und benutzt in Wirklichkeit diesen UND nicht die Mail-Adresse (bei internen).

    Wenn Dir der zweite Punkt wichtig ist, musst Du den LegasyExchangeDN retten. Ansonsten kann es zumindest nichts schaden, ihn zu retten.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Mittwoch, 1. August 2012 11:49
  • >3. der Parameter "-Send*Oof*MessageToOriginatorEnabled:$false  steht dafür, dass keine Abwesenheitsnotiz (Oof) gesendet wird.

    Das klingt missverständlich. Genauer: dass Abwesenheitsnachrichten eines Teilnehmers der Liste nicht an den Orginalabsender der Mail geschickt werden - der weiß nämlich i.d.R. nicht, dass das eine Verteilerliste ist und wundert sich sonst, warum er an "info@" schickt und von "meyer@" eine OOF-Nachricht bekommt.

    Aber das Setzen ist eigentlich nciht erforderliche, der Standardwert ist $false.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Mittwoch, 1. August 2012 11:55
  • Hallo Robert,

    Danke für deine Ergänzug, so ist es tatsälich besser zu verstehen :-)

    Ich persönlich rette immer den X500 Eintrag, denn wenn der (interne) Anwender auf alte Mails der gelöschten Mailbox antwortet und dieser Eintrag nicht mehr da ist, bekommt der Anwender einen NDR zurück, dass die Mailadresse nicht mehr vorhanden ist und du bekommst unter umständen einen haufen anfragen warum die Adresse nicht mehr angeschrieben werden kann.

    Gruß

    Uwe

    Mittwoch, 1. August 2012 12:07