124611

Powershell Primäresmtpadresse an anderes Postfach übertragen

Guten Morgen,

ich möchte gerne von ausgeschiedenen Benutzern, deren primäre SMTP Emailadresse an ein globales Postfach übertragen.

Das globale Postfach dient dazu über eine out of Office Nachricht den Absender darüber zu informieren, dass es besagte Emailadresse nicht mehr gibt.

Das Problem dabei ist folgendes:

1. Der Benutzer wird deaktiviert im AD oder er gehört z.B. der Gruppe "ausgeschiedene Benutzer an".
2. die primäre Emailadresse des Benutzers muss übertragen werden an das globale Postfach
3. Je nach Firmenzugehörigkeit muss die SMTP Adresse an ein bestimmtes globales Postfach übertragen werden.

Das Ganze wäre toll wenn man dies nun als automatisches Skript laufen lassen könnte.

Ich habe dazu folgendes gefunden:

Get-ADGroupMember “Gruppenname” | Select-Object Name,company,primarysmtpaddress hier kann ich ja schonmal auslesen, welche Benutzer in der Gruppe sind. Aber ich bekomme die Firma und die Email nicht mit face-sad

Ein weiteres Problem wäre wie bekomme ich die SMTP Adresse übertragen?

Hat da jemand eine Idee von Euch?
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 312680

Url: https://administrator.de/forum/powershell-primaeresmtpadresse-an-anderes-postfach-uebertragen-312680.html

Ausgedruckt am: 06.05.2025 um 20:05 Uhr

129813
129813 15.08.2016 aktualisiert um 13:25:45 Uhr
Goto Top
To get the email addresses of a mailbox
Get-Mailbox "username" | fl EMailAddresses  
To add an email address to a mailbox
Set-Mailbox "username" -EMailAddresses @{add="user@domain.com"}  

Take a note that you need to remove the emailaddress from the mailbox before you add it to the global one.

Regards
colinardo
colinardo 15.08.2016 aktualisiert um 14:39:08 Uhr
Goto Top
Hi,
könnte z.B. auf die schnelle so aussehen
(nach Anpassen der Variablen mit ausreichend Rechten für den EXCH-Server auszuführen)
# -------------Variables---------------------
$global_mailbox_name = "myglobalmailbox"  
$group_name = "Ausgeschiedene Benutzer"  
$company_name = "FIRMA XYZ"  
# -------------------------------------------
# Load ActiveDirectory module
Import-Module ActiveDirectory

# determine Exchange server FQDN from AD
$exchange_server = Get-ADObject -LDAPFilter 'objectClass=msExchExchangeServer' -SearchBase (([ADSI]"LDAP://RootDse").configurationNamingContext.ToString()) -Properties networkaddress | select -Expand networkaddress | ?{$_ -match 'ncacn_ip_tcp'} | %{$_.split(":")[1]} | select -First 1  
if (!$exchange_server){Write-Host "Could not determine Exchange Server from AD" -ForegroundColor Red; return}  

# connect to exchange
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://$exchange_server/powershell" -Authentication Kerberos  
Import-PSSession $session -DisableNameChecking -AllowClobber | out-null

# Get global mailbox
$global_mailbox = Get-Mailbox $global_mailbox_name

# iterate over all members of the group
Get-ADGroupMember $group_name | Get-ADUser -Properties Company | %{
    $mbox = Get-Mailbox $_.SamAccountName -ErrorAction SilentlyContinue
    if ($mbox){
        # users primary mail address
        $user_prim_address = $mbox.PrimarySmtpAddress.ToString()
        # check if users mail address is already in global mailbox and if he is member of a specific company
        if ($user_prim_address -notin $global_mailbox.EmailAddresses -and $_.Company -eq $company_name){
            "Disabling mailbox of user '$($_.SamAccountName)' ..."  
            $mbox | Disable-Mailbox -Confirm:$false
            "Adding primary email address '$user_prim_address' to global mailbox."  
            $global_mailbox | Set-Mailbox -EmailAddresses @{Add=$user_prim_address}
        }
    }
}

# close exchange session
Remove-PSSession $session
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
124611
124611 22.08.2016 um 19:59:45 Uhr
Goto Top
Guten Abend Uwe,

sorry für die späte Rückmeldung.

Genau sowas habe ich gesucht vielen Dank.

Frage dazu, gibt es eine Möglichkeit nicht nur die primäre sondern alle SMTP Adresse des Benutzers an das globale Postfach zu übertragen?

Habe es mit "SecondarySmtpAdress" versucht allerdings mit wenig Erfolg.

Auch ist die Frage, ich müsste die übertragene Emailadresse irgendwann auch wieder aus dem globalen Postfach rauslöschen (z.B. nach 6 Monaten).
Kann ich sowas evtl. über eine .ini Datei oder so machen oder lieber mit einer CSV Datei in der für die jeweilige Emailadresse das Eintritts und Austrittsdatum hinterlegt wird?

Und zu guter letzt ist die Frage die globalen Postfächern von denen es ja 2 Stück gibt, wollte ich gerne weitere Unterfirmen zuordnen.
Hier ist die Frage, trage ich die Firmen alle in das Script direkt ein oder lege ich dazu eine ini Datei an?

Hast du dazu auch nochmal eine Idee?

vg und schönen Abend face-smile
colinardo
colinardo 22.08.2016 aktualisiert um 22:08:06 Uhr
Goto Top
Zitat von @124611:
Frage dazu, gibt es eine Möglichkeit nicht nur die primäre sondern alle SMTP Adresse des Benutzers an das globale Postfach zu übertragen?
Ja, kannst du, Zeile 31 kann man auch ein Array aus Adressen übergeben.
Auch ist die Frage, ich müsste die übertragene Emailadresse irgendwann auch wieder aus dem globalen Postfach rauslöschen (z.B. nach 6 Monaten).
Kann ich sowas evtl. über eine .ini Datei oder so machen oder lieber mit einer CSV Datei in der für die jeweilige Emailadresse das Eintritts und Austrittsdatum hinterlegt wird?
CSV ist einfach umzusetzen. Liest du dann mit Import-CSV ein und filterst das Objekt dann nach Datum.
Die Adressen die übrig bleiben löschst du dann aus dem Postfach wie in Zeile 31 nur mit dem Verb "Remove".
Diese Infos könnte man alternativ auch direkt im AD-Userobjekt hinterlegen und dort aus einem benutzerdefinierten Attribut auslesen. Hier sind einem keine Grenzen gesetzt.

Und zu guter letzt ist die Frage die globalen Postfächern von denen es ja 2 Stück gibt, wollte ich gerne weitere Unterfirmen zuordnen.
Hier ist die Frage, trage ich die Firmen alle in das Script direkt ein oder lege ich dazu eine ini Datei an?

Hast du dazu auch nochmal eine Idee?
Kannst du auch in eine CSV legen mit 2 Spalten und zugeordneten globalen Postfächern, und dann im Skript einfach das Array per where-object filtern.

Alles machbar. Bei Interesse zur Umsetzung, kannst du gerne per PM anklopfen, dann kann ich dir ein Angebot unterbreiten.

Grüße Uwe
colinardo
colinardo 02.09.2016, aktualisiert am 07.09.2016 um 17:55:46 Uhr
Goto Top
Da es kein großer Aufwand ist mach ich mal eine Ausnahme. Für all die die selbe Aufgabenstellung haben sollten welche der letzte Kommentar des TO fordert (Kommentare s. Code):
# -------------Variablen---------------------
# Gruppe in der die ausgeschiedenen Mitarbeiter gesammelt werden
$group_name = "Ausgeschiedene Benutzer"  
# Zuordnung der Firmen zu globalen Postfächern
$company_mapping = @{
    "DemoFirma" = "myglobalmailbox1"  
    "DemoFirma2" = "myglobalmailbox2"  
    "DemoFirma3" = "myglobalmailbox2"  
}
# Pfad für die CSV-Datei die den Status (Datum) der Mailadressen aufzeichnet 
# um sie nach X Monaten entfernen zu können
$mail_expiration_file = 'C:\mail_expiration.csv'  
# Entferne E-Mail Adressen nach Ablauf von X Monaten aus den globalen Postfächern
$mail_expiration_months = 6
# -------------------------------------------
# Load ActiveDirectory module
Import-Module ActiveDirectory

# Load Exchange environment
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

# iterate over all members of the group
Get-ADGroupMember $group_name | Get-ADUser -Properties Company | %{
    $mbox = Get-Mailbox $_.SamAccountName -ErrorAction SilentlyContinue
    if ($mbox){
        # Get global mailbox
        $global_mailbox = Get-Mailbox $company_mapping[$_.Company] -EA SilentlyContinue
        if ($global_mailbox){
            # save users mail addresses into an array
            $user_mail_addresses = $mbox.EmailAddresses.SmtpAddress
        
            "Disabling mailbox of user '$($_.SamAccountName)' ..."  
            $mbox | Disable-Mailbox -Confirm:$false
            "Adding email addresses '$($user_mail_addresses -join ',')' to global mailbox '$($global_mailbox.Alias)'"  
            $global_mailbox | Set-Mailbox -EmailAddresses @{Add=$user_mail_addresses}
            # Exporting mail addresses to csv file
            $user_mail_addresses | %{[pscustomobject] @{Date=(get-date -F 'd');'EMail'=$_;'GlobalMailbox'=$global_mailbox.Alias}} | export-csv $mail_expiration_file -Delimiter ';' -NoType -Encoding UTF8 -Append  
        }else{
            Write-Error "The specified global mailbox for '$($_.Company)' does not exist."  
        }
    }
}

# check for expired mails in csv
if ((Test-Path $mail_expiration_file)){
    $csv = Import-CSV $mail_expiration_file -Delimiter ";"  
    $expired_mails = $csv | ?{(get-date $_.Date) -lt (get-date).Date.AddMonths(-$mail_expiration_months)}
    # if there are expired mail addresses
    if ($expired_mails){
        # remove expired addresses from their corresponding global mailbox
        $expired_mails | group GlobalMailbox | %{
            "Removing expired addresses '$($_.Group.EMail -join ',')' from global mailbox '$($_.Name)'"  
            Set-Mailbox $_.Name -EmailAddresses @{Remove=$_.Group.EMail}
        }
        # remove expired mails from csv
        $csv | ?{$_.EMail -notin $expired_mails.EMail} | export-csv $mail_expiration_file -Delimiter ';' -NoType -Encoding UTF8  
    }
}
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

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
colinardo
colinardo 06.09.2016 um 17:01:30 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
124611
124611 07.09.2016 um 13:59:15 Uhr
Goto Top
hi,
sorry für die späte Rückmeldung und vielen herzlichen Dank für deine Mühe.

Leider wird mir beim ausführen des Skripte folgender Fehler ausgegeben.

Anbei mal ein Screenshot.

Hast du eine Idee woran das liegen mag?

Wäre ja super wenn das Teil jetzt auch laufen würde und deine Arbeit perfekt funktioniert face-smile

vg
colinardo
colinardo 07.09.2016 aktualisiert um 14:20:35 Uhr
Goto Top
Hast du eine Idee woran das liegen mag?
Ja, der User hat entweder keine SmtpAddresse, oder du verwendest eine alte Powershell. Welche Powershell-Version verwendest du ?
Skript funktioniert bei aktueller PS Version hier soweit einwandfrei.

Mehr Support gibt's per Cash.
124611
124611 07.09.2016 um 15:06:46 Uhr
Goto Top
habe nene ganz frischen Server 2012 r2 als Testsystem aufgesetzt mit Exchange 2013 cu13.

Die Testbenutzer haben sowohl eine primäre als auch eine sekundäre Emailadresse.

Egal ob ich es mit der Exchangeshell oder mit der ISE mache der Fehler bleibt der gleiche.

In der Ausgabe findet er den User (Zuordnung zur Gruppe funktioniert)

Dann kommt adding email adresses ' ' to global Mailbox 'FIRMENNAME'

Und dann kommt die Fehlermeldung
129813
129813 07.09.2016 aktualisiert um 15:34:19 Uhr
Goto Top
Did a test, here it works too Ex2013 and Ex2016. No error message at all. Something in your environment must be not OK. That your addresses are of type "hashtable", is not normal. This should be only an array of strings.

Regards
colinardo
colinardo 07.09.2016 aktualisiert um 16:32:24 Uhr
Goto Top
Habe noch eine kleine Korrektur oben vorgenommen welche in deiner Umgebung eventuell zum Tragen kommt.
124611
124611 08.09.2016 um 15:29:42 Uhr
Goto Top
Es tut mir leid aber ich weiß nicht wie das Script bei Euch laufen kann.

Jetzt bekomme ich eine Meldung "WARNUNG: Die primäre SMTP-Adresse konnte nicht aktualisiert werden, weil für dieses Postfach die Verwendung einer E-Mail-Adressrichtlinie konfiguriert ist. Um die E-Mail-Adressrichtlinie für dieses Postfach zu deaktivieren, f
ühren Sie den Befehl mit dem Wert '$false' für den Parameter 'EmailAddressPolicyEnabled' aus."

Nehme ich nun den Hacken beim globalen Postfach raus kommt die Meldung, dass bereits eine primäre SMTP Adresse vorhanden ist.

Was ist bei Euch anders als bei mir?
colinardo
Lösung colinardo 08.09.2016 aktualisiert um 15:58:34 Uhr
Goto Top
Führst du das remote oder direkt auf dem Exchange-Server aus? Denn per Remote werden die Objekte serialisiert, und da gehen manche Eigenschaften flöten und die Objekte werden als Strings serialisiert.

Hast du wirklich den Code richtig kopiert? Denn die Fehlermeldung kommt nur wenn die E-MailAdressen mit einem SMTP: geprefixt sind. Die Zeile 30 sollte so aussehen:
$user_mail_addresses = $mbox.EmailAddresses.SmtpAddress 
alternativ geht auch:
$user_mail_addresses = $mbox.EmailAddresses -replace '^SMTP:',''
Geht hier auf allen Systemen einwandfrei, sorry, der Fehler muss also bei dir liegen!
124611
124611 09.09.2016 um 13:10:34 Uhr
Goto Top
das ist ja nen Ding. Genau dieser Eintrag fehlte.

Echt klasse vielen Dank
129813
Lösung 129813 09.09.2016 um 14:14:52 Uhr
Goto Top
Please mark it solved. Thanks.