Forum Discussion
StefanoC66
Jun 28, 2024Iron Contributor
Modify users addresses via powershell
I need to make the following: - from a list of domains to be removed from email addresses in a csv file load them. - for each user compare all his email addresses and if anyone is from the list of ...
- Jul 01, 2024Hi StefanoC66 please check this:
# Path to the CSV file containing the domains to be removed
$domainsCsvPath = "C:\path\to\domains.csv"
# Load the domains to be removed
$domainsToRemove = Import-Csv -Path $domainsCsvPath | Select-Object -ExpandProperty domain
# Get all mailboxes
$mailboxes = Get-Mailbox -ResultSize Unlimited
foreach ($mailbox in $mailboxes) {
# Get all email addresses for the mailbox
$emailAddresses = $mailbox.EmailAddresses | Where-Object { $_ -like 'SMTP:*' } | ForEach-Object { $_.SmtpAddress }
# Filter out the email addresses that belong to the domains to be removed
$filteredEmailAddresses = $emailAddresses | Where-Object {
$domain = $_.Split("@")[-1]
-not ($domainsToRemove -contains $domain)
}
# Update the mailbox with the filtered email addresses
if ($filteredEmailAddresses.Count -ne $emailAddresses.Count) {
Set-Mailbox -Identity $mailbox.Identity -EmailAddresses ($filteredEmailAddresses -join ",")
Write-Host "Updated email addresses for mailbox: $($mailbox.Identity)"
}
}
StefanoC66
Jul 01, 2024Iron Contributor
Hi chrisslroth
Actually is failing setting back the email addresses
Set-Mailbox : Cannot convert 'ccci@xx.local,email address removed for privacy reasons' to the type 'Microsoft.Exchange.Data.ProxyAddressCollection' required by parameter
'EmailAddresses'. The address xx@xxx.local,email address removed for privacy reasons' is invalid: "xx@xxx.local,email address removed for privacy reasons" isn't a valid SMTP address. The domain name can't contain spaces and it has to have a prefix and a suffix, such as example.com.
At line:28 char:57
+ ... $mailbox.Identity -EmailAddresses ($filteredEmailAddresses -join ",")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Mailbox], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.Exchange.Management.RecipientTasks.SetMailbox
Actually is failing setting back the email addresses
Set-Mailbox : Cannot convert 'ccci@xx.local,email address removed for privacy reasons' to the type 'Microsoft.Exchange.Data.ProxyAddressCollection' required by parameter
'EmailAddresses'. The address xx@xxx.local,email address removed for privacy reasons' is invalid: "xx@xxx.local,email address removed for privacy reasons" isn't a valid SMTP address. The domain name can't contain spaces and it has to have a prefix and a suffix, such as example.com.
At line:28 char:57
+ ... $mailbox.Identity -EmailAddresses ($filteredEmailAddresses -join ",")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Mailbox], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.Exchange.Management.RecipientTasks.SetMailbox
chrisslroth
Jul 02, 2024Copper Contributor
Hi StefanoC66,
try this in your script, to convert the addresses separated by comma in a ProxyAddressCollection:
# Create a ProxyAddressCollection from the filtered email addresses
$newEmailAddresses = New-Object Microsoft.Exchange.Data.ProxyAddressCollection
foreach ($address in $filteredEmailAddresses) {
$proxyAddress = New-Object Microsoft.Exchange.Data.SmtpProxyAddress($address, $true)
$newEmailAddresses.Add($proxyAddress)
}
try this in your script, to convert the addresses separated by comma in a ProxyAddressCollection:
# Create a ProxyAddressCollection from the filtered email addresses
$newEmailAddresses = New-Object Microsoft.Exchange.Data.ProxyAddressCollection
foreach ($address in $filteredEmailAddresses) {
$proxyAddress = New-Object Microsoft.Exchange.Data.SmtpProxyAddress($address, $true)
$newEmailAddresses.Add($proxyAddress)
}
- StefanoC66Jul 02, 2024Iron Contributor
Thanks for your continuous support.
I'm facing this issue right now.
In the script I'm testing if the new filtered list of email addresses we created with your code does include the original primary smtp address, which could have been removed if was in the domains to be removed.
In the case the old primary was removed we have to set the new primary being like "oldname@newdefaultdomain"
So I tried the following
$OldPrimary = $mailbox.PrimarySmtpAddress.Address
if($filteredEmailAddresses -notcontains $OldPrimary){
"MIssing primary"
$NewPrimary="SMTP:"+$OldPrimary.Split("@")[0]+"@newdomain.com"
$proxyAddress = New-Object Microsoft.Exchange.Data.SmtpProxyAddress($NewPrimary, $true)
$filteredEmailAddresses.Add($proxyAddress)}
however i got this error
New-Object : Exception calling ".ctor" with "2" argument(s): "Specified argument was out of the range of valid values.
Parameter name: The address 'SMTP:email address removed for privacy reasons' is not a valid SMTP address."
At D:\Scripts\\Test-AliasModify2-NEW.ps1:42 char:21
+ ... xyAddress = New-Object Microsoft.Exchange.Data.SmtpProxyAddress($NewP ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommandMethod invocation failed because [Microsoft.Exchange.Data.SmtpProxyAddress] does not contain a method named 'Add'.
At D:\Scripts\Test-AliasModify2-NEW.ps1:43 char:5
+ $filteredEmailAddresses.Add($proxyAddress)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound - chrisslrothJul 02, 2024Copper ContributorWith this you set the mailaddresses:
# Update the mailbox with the filtered email addresses
if ($newEmailAddresses.Count -ne $emailAddresses.Count) {
Set-Mailbox -Identity $mailbox.Identity -EmailAddresses $newEmailAddresses
Write-Host "Updated email addresses for mailbox: $($mailbox.Identity)"
}