Modify the primary SMTP address of a Public Folder – Powershell Script

1 Jan

The two scripts introduce in how to change the primary address of a Public Folder in Exchange using Powershell.

The architecture is as:

Code snippet 1

  1. Look for all objcts in OU Microsoft Exchange System Objects
  2. Exclude certain objects from beeing modified
  3. Traverse all addresses of each object found
  4. if you find a address by type “SMTP:” and a certain domain
    take the syntax of this entry and create a new entry using the new domain name.

Code snippet 2

  1. Set the old primary address as secondary address

Download Script code here:

ModifyPublicFolderSMTP.txt


SetPrimarySMTPasSecondaryinPublicFolders.txt 

 

Code Snippet 1:

# Autor: Hans Willi Kremer, NETsec GmbH & Co. KG, www.netsec.de

# Datum: 2010-01-01

# Ziel: Hinzufügen einer neuen primären SMTP-Proxyadresse von benutzerdefinierten Öffentlichen Ordnern

# Dabei wird der Name der bisherigen primären Adresse zur Bildung der neuen genutzt

# System: Exchange 2000

# Verwendet: Powershell, .NET 3.1, Quest Power GUI mit Active Roles Management Shell for Active Directory

# Hinweis: Im Script ist keine Fehlerbahndlung eingebaut

# Beginn

$OldPrimarySMTP = “root.domain$”

$NewPrimarySMTP = “bgetem.de$”

$Logfile=“c:\ModifyPublicFolder.log”

“Start” | out-file -filepath $Logfile -encoding default -Append

# Durchsuche die Objekte in folgender Organisationseinheit. Dort sind unter anderem

# alle mail-aktivierten Öffentlichen Ordner aufgeführt.

$object=get-QADObject -SearchRoot ‘root.domain/Microsoft Exchange System Objects’

$anzahl=$object.Count

“$anzahl Objekte in der OU Microsoft Exchange System Objects gefunden” | out-file -filepath $Logfile -encoding default -append

for ($memberCount=0; $memberCount -le $anzahl1; $memberCount++)

{

$PublicFolderName=$object[$memberCount]

“$PublicFolderName wurde gefunden” | out-file -filepath $Logfile -encoding default -append

# Folgende Objekte sollen nicht überprüft werden

# die Liste kann beliebig erweitert werden

switch -wildcard ($PublicFolderName.name)

{

‘Default*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘internal*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘Schedule+ Free Busy*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘Offline Address Book*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘schema-root*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘globalevents*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘exchangeV1*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘microsoft*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘OWAScratchPad*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘SystemMailbox*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘Exchange Install*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘StoreEvents*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

default

{

# ansonsten Referenz auf das Objekt vornehmen

$PublicFolder=[ADSI]“LDAP://$PublicFolderName”

$PublicFolderEmail=$PublicFolder.proxyAddresses

“$PublicFolderName mit Pfad: $PublicFolder und Adressen: $PublicFolderEmail wird laut Regeln bearbeitet” | out-file -filepath $Logfile -encoding default -append

# alle ProxyAdressen des Öffentlichen Ordners durchlaufen

for ($adrCount=0; $adrCount -le $PublicFolderEmail.count1 ;$adrCount++)

{

# Vollständige Adressierung (“SMTP:foo@ar.com”)

$fulladdress=$PublicFolderEmail[$adrCount]

# Email-Typ-Teil (z.B.SMTP, X400 etc.)

$typ=$fulladdress.substring(0,5)

# Ermitteln des Adressteiles (z.B.foo@bar.com)

$address=$fulladdress.substring(5)

# Alte primäre Adresse ermitteln und als neue primäre SMTP mit neuer Domäne speichern

if ($typ -ceq “SMTP:” -and $address -match $OldPrimarySMTP)

{

$newaddress = $address.Replace($OldPrimarySMTP.Substring(0, $OldPrimarySMTP.Length 1) , $NewPrimarySMTP.Substring(0, $NewPrimarySMTP.Length 1))

$newaddress = $newaddress.ToLower()

“neue Adresse: $newaddress” | out-file -filepath $Logfile -encoding default -append

$PublicFolder.proxyAddresses += “SMTP:$newaddress”

#Änderungen wegschreiben / save modifications

if ($PublicFolder -ne $null){$PublicFolder.setinfo()}

#”Adresse: $fulladdress wurde geändert” | out-file -filepath $Logfile -encoding default -append

}

}

}

}

}

“Ende” | out-file -filepath $Logfile -encoding default -Append

 

Code Snippet 2:

 

# Autor: Hans Willi Kremer, NETsec GmbH & Co. KG, www.netsec.de

# Datum: 2010-01-01

# Ziel: Setzen einer ausgewählten primären SMTP-Proxyadresse von benutzerdefinierten Öffentlichen Ordnern auf sekundär

# Dabei wird der Name der bisherigen primären Adresse zur Bildung der neuen genutzt

# System: Exchange 2000

# Verwendet: Powershell, .NET 3.1, Quest Power GUI mit Active Roles Management Shell for Active Directory

# Hinweis: Im Script ist keine Fehlerbahndlung eingebaut

# Beginn

$SMTPAddressToModify = “bgetem.de$”

$Logfile=“c:\ModifySecondaryPublicFolder.log”

“Start” | out-file -filepath $Logfile -encoding default -Append

# Durchsuche die Objekte in folgender Organisationseinheit. Dort sind unter anderem

# alle mail-aktivierten Öffentlichen Ordner aufgeführt.

$object=get-QADObject -SearchRoot ‘root.domain/Microsoft Exchange System Objects’

$anzahl=$object.Count

“$anzahl Objekte in der OU Microsoft Exchange System Objects gefunden” | out-file -filepath $Logfile -encoding default -append

for ($memberCount=0; $memberCount -le $anzahl1; $memberCount++)

{

$PublicFolderName=$object[$memberCount]

“$PublicFolderName wurde gefunden” | out-file -filepath $Logfile -encoding default -append

# Folgende Objekte sollen nicht überprüft werden

# die Liste kann beliebig erweitert werden

switch -wildcard ($PublicFolderName.name)

{

‘Default*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘internal*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘Schedule+ Free Busy*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘Offline Address Book*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘schema-root*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘globalevents*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘exchangeV1*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘microsoft*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘OWAScratchPad*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘SystemMailbox*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘Exchange Install*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

‘StoreEvents*’ {“$PublicFolderName wird laut Regeln nicht bearbeitet” | out-file -filepath $Logfile -encoding default -append}

default

{

# ansonsten Referenz auf das Objekt vornehmen

$PublicFolder=[ADSI]“LDAP://$PublicFolderName”

$PublicFolderEmail=$PublicFolder.proxyAddresses

“$PublicFolderName mit Pfad: $PublicFolder und Adressen: $PublicFolderEmail wird laut Regeln bearbeitet” | out-file -filepath $Logfile -encoding default -append

# alle ProxyAdressen des Öffentlichen Ordners durchlaufen

for ($adrCount=0; $adrCount -le $PublicFolderEmail.count1 ;$adrCount++)

{

# Vollständige Adressierung (“SMTP:foo@ar.com”)

$fulladdress=$PublicFolderEmail[$adrCount]

# Email-Typ-Teil (z.B.SMTP, X400 etc.)

$typ=$fulladdress.substring(0,5)

# Ermitteln des Adressteiles (z.B.foo@bar.com)

$address=$fulladdress.substring(5)

# Adresse ermitteln und auf sekundäre SMTP-Adresse umstellen

if ($typ -ceq “SMTP:” -and $address -match $SMTPAddressToModify)

{

$modifiedFullAddress = “smtp:” + $address.ToLower()

$PublicFolderEmail[$adrCount] = $modifiedFullAddress

#Änderungen wegschreiben / save modifications

if ($PublicFolder -ne $null){$PublicFolder.setinfo()}

“Adresse wurde geändert” | out-file -filepath $Logfile -encoding default -append

}

}

}

}

}

“Ende” | out-file -filepath $Logfile -encoding default -Append

Leave a Reply

Your email address will not be published. Required fields are marked *