124611
Goto Top

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?

Content-Key: 312680

Url: https://administrator.de/contentid/312680

Printed on: May 9, 2024 at 02:05 o'clock

Mitglied: 129813
129813 Aug 15, 2016 updated at 11:25:45 (UTC)
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
Member: colinardo
colinardo Aug 15, 2016 updated at 12:39:08 (UTC)
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
Mitglied: 124611
124611 Aug 22, 2016 at 17:59:45 (UTC)
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
Member: colinardo
colinardo Aug 22, 2016 updated at 20:08:06 (UTC)
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
Member: colinardo
colinardo Sep 02, 2016, updated at Sep 07, 2016 at 15:55:46 (UTC)
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.
Member: colinardo
colinardo Sep 06, 2016 at 15:01:30 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Mitglied: 124611
124611 Sep 07, 2016 at 11:59:15 (UTC)
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
Member: colinardo
colinardo Sep 07, 2016 updated at 12:20:35 (UTC)
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.
Mitglied: 124611
124611 Sep 07, 2016 at 13:06:46 (UTC)
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
Mitglied: 129813
129813 Sep 07, 2016 updated at 13:34:19 (UTC)
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
Member: colinardo
colinardo Sep 07, 2016 updated at 14:32:24 (UTC)
Goto Top
Habe noch eine kleine Korrektur oben vorgenommen welche in deiner Umgebung eventuell zum Tragen kommt.
Mitglied: 124611
124611 Sep 08, 2016 at 13:29:42 (UTC)
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?
Member: colinardo
Solution colinardo Sep 08, 2016 updated at 13:58:34 (UTC)
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!
Mitglied: 124611
124611 Sep 09, 2016 at 11:10:34 (UTC)
Goto Top
das ist ja nen Ding. Genau dieser Eintrag fehlte.

Echt klasse vielen Dank
Mitglied: 129813
Solution 129813 Sep 09, 2016 at 12:14:52 (UTC)
Goto Top
Please mark it solved. Thanks.