energise
Goto Top

Powershell: Array mit SMTP Adressen verändern und hinzufügen (op Addition)

Hallo zusammen

ich verzweifle gerade gerade an dem Hinzufügen von Werten in ein Array. Bitte nicht auslachen ich Scripte erst seit ein paar Monaten.

Speziell geht es darum die Emailaddressen neu zu setzen mit

set-mailbox $Mailbox -EmailAddresses $SetAddresses

Allerdings möchte die Mailadressen in $Addresses neu bestimmen. Das Filtern der Adressen ist ja kein Problem, aber wie füge ich denn dem Array welche hinzu ?

Ich habe schon einiges versucht, aber es scheitert anscheinend an dem Type [Microsoft.Exchange.Data.SmtpProxyAddress], das erlaubt keine 'op_Addition'

Ich weiß das jetzt einige sagen mach das doch über die EmailAddressPolicy aber das geht leider nicht da diese aus mehreren Gründen vorerst nicht verändert werden darf.

Generell würde ich gerne wissen wie ich die Objekte systemgetreu in das Array bringe ? Es ist anscheinend ein unterschied wie oder was die Objekte erzeugt hat. Ich hatt auch schon mit Add-member herumgespielt und es ist wahrscheinlich der nächste Weg das GANZE Array mit CustomObjects neuzubauen und mit den nötigen Werten zubefüllen. Aber ich würde dennoch gern verstehen wie man das anders hinbekommt. Get-Member scheint ein mächtiges Werkzeug zu sein, aber umgehen kann ich damit noch nicht.

## Define Mailbox
$UserMailAddress = "max.muster@musterfirma.com"  
$mailbox = get-mailbox $UserMailAddress
$Mailboxuser = get-user $Mailbox

## Get mail addresses
$EmailAddresses = $mailbox.EmailAddresses

## show Emailaddesses
$EmailAddresses 

SmtpAddress        : muster@olddomain.de
AddressString      : muster@olddomain.de
ProxyAddressString : smtp:muster@olddomain.de
Prefix             : SMTP
IsPrimaryAddress   : False
PrefixString       : smtp

SmtpAddress        : max.muster@firma.com
AddressString      : max.muster@firma.com
ProxyAddressString : SMTP:max.muster@firma.com
Prefix             : SMTP
IsPrimaryAddress   : True

## get good addresses
$GoodEmailAddresses = ($EmailAddresses | ? {$_.SmtpAddress -like "*Firma.com*" -or $_.SmtpAddress -like "*onmicrosoft.com*"})  

## show good addresses
$GoodEmailAddresses

SmtpAddress        : max.muster@firma.com
AddressString      : max.muster@firma.com
ProxyAddressString : SMTP:max.muster@firma.com
Prefix             : SMTP
IsPrimaryAddress   : True

## add onmicrosoft addresses
$OnMicrosoftDomain = '@Firma.mail.onmicrosoft.com'  
$MailboxAlias =$Mailbox.alias
$OnMicrosoftSMTPAddress = $MailboxAlias+$OnMicrosoftDomain
$SetAddresses = $GoodEmailAddresses + $OnMicrosoftSMTPAddress

Method invocation failed because [Microsoft.Exchange.Data.SmtpProxyAddress] does not contain a method named 'op_Addition'.  
At bla.bla.ps1:..
+         $SetAddresses = $GoodEmailAddresses + $OnMicrosoftSMTPAddress
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) , RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Content-Key: 448009

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

Printed on: April 25, 2024 at 11:04 o'clock

Member: Daemmerung
Daemmerung May 05, 2019 at 13:21:07 (UTC)
Goto Top
Moin,

schau mal hier, das sollte dir weiterhelfen:
https://docs.microsoft.com/de-de/exchange/recipients-in-exchange-online/ ...

Viele Grüße
Toni
Member: Energise
Energise May 05, 2019 updated at 14:12:41 (UTC)
Goto Top
Danke aber das hilft nicht weiter.

Ich weiß wie Set-Mailbox funktioniert.

Das Problem ist auch nicht die Ausführung des Befehls sondern das Setzen Emailaddressen in einem Rutsch.

1. Ich lese die vorhanden aus und speichere Sie in $EmailAddresses
2. Ich filtere nicht benötigten weg und speicher diese in $GoodEmailAddresses

3. Ich füge die OnMicrosoft Addresse zu $GoodEmailAddresses hinzu (Geht nicht)
oder
3. Ich füge erst die $GoodEmailAddresses hinzu und im zweiten Rutsch die OnMicrosoft (will ich nicht)
oder
3. Ich nutze den Befehl Set-Mailbox so:
Set-Mailbox $Mailbox -emailaddresses SMTP:max.muster@firma.com,muster@Firma.mail.onmicrosoft.com,....
Nur wie baue ich das auf wenn ich doch nicht weiß... wieviele Mailaddressen der User noch so drin hat die ja nicht verloren gehen dürfen ?

User 1: hat vielleicht noch nur zwei Adressen aber User 2 hat vielleicht 5. Daher wollte ich die wegfiltern die nicht dürfen, aber die ürbigen mitnehmen und die OnMicrosoft dazunehmen und das ganze dann in einem Rutsch setzen.
Member: colinardo
Solution colinardo May 05, 2019 updated at 16:43:10 (UTC)
Goto Top
Servus,
dein Problem hier ist, dass wenn das Ergebnis des Filters nur eine einzige Adresse ergibt, du keine Collection mehr hast sondern ein Object in dieser Form:
IsPublic IsSerial Name                                     BaseType                                                                                       
-------- -------- ----                                     --------                                                                                       
True     True     SmtpProxyAddress                         Microsoft.Exchange.Data.ProxyAddress     
und das besitzt nun mal keine Methode zum hinzufügen einer weiteren Adresse, verständlich.

Also mach zwingend ein Array aus der Variablen.
Den Filter demnach so schreiben:
[Microsoft.Exchange.Data.ProxyAddress[]]$GoodEmailAddresses = $mailbox.EmailAddresses | ? {$_.SmtpAddress -like "*Firma.com*" -or $_.SmtpAddress -like "*onmicrosoft.com*"}  
es geht auch in dieser Form
$GoodEmailAddresses = @($mailbox.EmailAddresses | ? {$_.SmtpAddress -like "*Firma.com*" -or $_.SmtpAddress -like "*onmicrosoft.com*"})  
und Zeile 41 einfacherweise noch hierdurch ersetzen
$GoodEmailAddresses += $OnMicrosoftSMTPAddress
und dann mit
Set-Mailbox $mailbox -EmailAddresses $GoodEMailAddresses
die Adressen neu setzen.

Oder du machst es stattdessen so ohne Zwischenspeicher (aber dann mehreren Aufrufen).
$mailbox.EmailAddresses | ? {$_.SmtpAddress -notlike "*Firma.com*" -and $_.SmtpAddress -notlike "*onmicrosoft.com*"} | %{Set-Mailbox $mailbox -EMailAddresses @{Remove=$_.SmtpAddress}}  
Set-Mailbox $mailbox -EmailAddresses @{Add=$OnMicrosoftSMTPAddress}
Denk aber bitte an die primäre Adresse wenn du die mit obigem Filter ausfilterst! Die wird entweder jene die als erstes in der Collection steht (wenn kein Type definiert wurde), oder jene bei der SMTP in Großbuchstaben als Typ vor der Adresse angegeben ist. Also besser zur Sicherheit noch einen Check für die Primäre (Property prüfen) einbauen.

Grüße Uwe
Member: Energise
Energise May 05, 2019 updated at 16:58:32 (UTC)
Goto Top
Danke das war die Lösung!

$GoodEmailAddresses = @($mailbox.EmailAddresses | ? {$_.SmtpAddress -like "*Firma.com*" -or $_.SmtpAddress -like "*onmicrosoft.com*"})  

Wegen der primären SMTP Adresse wollte ich eben nicht auf das Zwischenspeichern verzichten.

Vielen Dank Uwe