Mailbox-Datenbank leer räumen

Es gibt unterschiedliche Szenarien in denen eine Datenbank ausgedient hat:

  • Volume ist voll
  • Änderung der Namenskonvention
  • Änderung der Struktur wie z.B. eine DB pro Abteilung oder Standort

Seit Exchange 2010 ist es auf alle Fälle möglich ein Postfach in eine andere Datenbank zu verschieben, ohne dass der Benutzer gestört wird.

Ein Verschieben der Datenbank ist ohne Down-Time nicht möglich. Daher empfehle stat desse nimmer eine neue DB zu erstellen und die Mailboxen zu verschieben.

Mit den folgenden 3 Zeilen PowerShell-Code werden alle Postfächer von einer DB in eine andere geschoben.

Das ganze ist als Beispiel gedacht!

Die alte DB heisst „Mailbox Database 1507976970“

Die neue DB hat den Namen „Mail-01“

Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox | New-MoveRequest -TargetDatabase Mail-01
Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox -Archiv | New-MoveRequest -TargetDatabase Mail-01
Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox -Arbitration | New-MoveRequest -TargetDatabase Mail-01

 

 

eMail-Adressen exportieren

Zur Spam-Bekämpfung ist es von großem Vorteil, wenn die erste Instanz der MailRoute alle gültigen eMailadressen kennt.

Bei mir ist das ein PostFix welches auf einem Ubuntu-Server läuft.

Folgendes Script wird nun zyklisch per Task-Scheduler auf dem Exchange-Server aufgerufen. Es erstellt ein Text-File und legt dies in „wwwroot“ ab.

Auf dem Linux-Server läuft ein Cron-Job der das File vom Exchange läd, mit dem vorhergehenden vergleicht und PostFix, wenn nötig, durchstartet.

#--------------------------------------------------------------------------------------------------
#
# Skript zum exportieren der aktuell gültigen eMail-Adressen für die SMTP1 (vormals SV10)
# Autor Robert R. 25.01.2012
#--------------------------------------------------------------------------------------------------
# Historie:
# 11.12.2012	Robert R. Accepted-Domains und CustomAttribute6 zum Filtern verwenden
#
#--------------------------------------------------------------------------------------------------
# Variablen und Parameter
#--------------------------------------------------------------------------------------------------

param
	(
	[string]$MailTo = "admin@powershell.local",
	[string]$MailFrom = "admin@powershell.local",
	[string]$File = "C:\inetpub\wwwroot\email.txt",
	[switch]$Sendmail,
	[switch]$Debug,
	[switch]$NoOut
	)

#$NoMailGroup = "MAIL_ALL_NoExternalMails"
$NoMailToAlias = "team-group","root","extest_7133eae530fc4"
$UnwantedDomains = "powershell.local"

#--------------------------------------------------------------------------------------------------
# Module und Pugins
#--------------------------------------------------------------------------------------------------

	$a = (Get-PSSnapin | where {$_.Name -ilike "Microsoft.Exchange.Management.*"} | measure).Count
if ( $a -eq 0 )
	{
	if ( $Debug ) {write-host "Exchange-Plugin loading..."}
	Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
	}
Import-Module activedirectory

#--------------------------------------------------------------------------------------------------

Set-ADServerSettings -ViewEntireForest $true

# Akzeptierte Domänen in Array kopieren
if ( $DEBUG ) { write-host "Get Accepted Domains" }
$DOMAINs = @()
Get-AcceptedDomain | select DomainName | foreach { $DOMAINs += $_.DomainName.SmtpDomain.tostring() }

# Alle Recipients einsammeln 
if ( $DEBUG ) { write-host "Get Recipients" }
$RCPs = Get-Recipient -resultsize unlimited | select Alias, RecipientTypeDetails, EmailAddresses, GUID, CustomAttribute6

# GUID der Mitglieder aus der Gruppe <$NoMailGroup> in ein Array speichern um diese später zu filtern
#if ( $DEBUG ) { write-host "Get NoMailGroup" }
#$NoMail = @()
#Get-ADGroupMember $NoMailGroup -Recursive | foreach { $NoMail += $_.objectGUID.tostring() }

# Filter-Array umwandeln in Kleinbuchstaben. $attachment wird als temp-Variable verwendet
$attachment = @()
$NoMailToAlias | foreach { $attachment += $_.tolower() }
$NoMailToAlias = $attachment

# Alle eMailadressen werden in dem Array $attachment gespeichert
if ( $DEBUG ) { write-host "Filter List of Recipients" }
$attachment = @()
foreach ( $RCP in $RCPs )
	{
#	Ausfiltern von eMailadressen die nicht extern errichbar sein sollen
	if ( $RCP.RecipientTypeDetails.tostring().tolower() -eq "discoverymailbox" )	{ continue }
	if ( $NoMailToAlias -contains $RCP.Alias.tolower() )							{ continue }
	if ( $RCP.Alias -like "publicfolder*" )											{ continue }
	if ( $RCP.Alias -like "acl_mbx_*" )												{ continue }
#	if ( $NoMail -contains $RCP.GUID )												{ continue }
#	if ( $RCP.Alias.tolower() -eq "MAIL_ALL_NoExternalMails" )						{ continue }
#	if ( $RCP.CustomAttribute6 -ne "" )												{ continue }
	
	
	# eMailadressen des Emängers in die Liste schreiben
	foreach ( $email in $RCP.EmailAddresses )
		{
		$emaildomain = $email.ProxyAddressString.tolower().split("@")[1]
		if ( $email.Prefix -ilike "SMTP" -and $DOMAINs -contains $emaildomain -and
			-not ($UnwantedDomains -contains $emaildomain) )
			{
			if ( $DEBUG ) { Write-Host -NoNewline "." }
			$attachment += $email.SmtpAddress.tolower() + "`tx"
			#$attachment += $email.ProxyAddressString
			}
		elseif ( $DEBUG -and $email.Prefix -ilike "SMTP" ) { Write-Host -NoNewline "!" }
		}
	}

Write-Host ""

if ( -not $Debug )
	{
	remove-item $File
	$attachment | Sort-Object | out-file $File -Encoding ASCII
	}
	

if ( $Sendmail -and -not $Debug)
	{
	Send-MailMessage -To $MailTo -From $MailFrom -subject "email-smtp-adressen" -Body "das sind die emails smtp-adressen" -SmtpServer mailcas-c -Attachments $File
	}
elseif ( -not $NoOut )
	{
	$attachment | Sort-Object
	}