The architecture is as:
Code snippet 1
- Look for all objcts in OU Microsoft Exchange System Objects
- Exclude certain objects from beeing modified
- Traverse all addresses of each object found
- 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
- Set the old primary address as secondary address
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 -appendfor
($memberCount=0; $memberCount -le $anzahl-1; $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.count-1 ;$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 -AppendCode 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 -appendfor
($memberCount=0; $memberCount -le $anzahl-1; $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.count-1 ;$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