
124611
15.08.2016
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
Ein weiteres Problem wäre wie bekomme ich die SMTP Adresse übertragen?
Hat da jemand eine Idee von Euch?
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
Ein weiteres Problem wäre wie bekomme ich die SMTP Adresse übertragen?
Hat da jemand eine Idee von Euch?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
15 Kommentare
Neuester Kommentar

To get the email addresses of a mailbox
To add an email address to a mailbox
Take a note that you need to remove the emailaddress from the mailbox before you add it to the global one.
Regards
Get-Mailbox "username" | fl EMailAddresses
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
Hi,
könnte z.B. auf die schnelle so aussehen
(nach Anpassen der Variablen mit ausreichend Rechten für den EXCH-Server auszuführen)
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
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
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
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.Frage dazu, gibt es eine Möglichkeit nicht nur die primäre sondern alle SMTP Adresse des Benutzers an das globale Postfach zu übertragen?
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.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?
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.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?
Alles machbar. Bei Interesse zur Umsetzung, kannst du gerne per PM anklopfen, dann kann ich dir ein Angebot unterbreiten.
Grüße Uwe
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):
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.
# -------------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
}
}
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.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.

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
Regards
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:
alternativ geht auch:
Geht hier auf allen Systemen einwandfrei, sorry, der Fehler muss also bei dir liegen!
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
$user_mail_addresses = $mbox.EmailAddresses -replace '^SMTP:',''

Please mark it solved. Thanks.