Manchmal müssen die Postfächer per PST-Import migriert werden.

Mit diesem Script ist dies voll automatisiert möglich!

Am besten erstellt man eine Datenbank die keine Limits hat und nur für die Migration verwendet wird

Dann erstellt man 2 weitere DBs und nur auf diesen DBs lässt man Autoprovisioniering zu!

Jetzt benötigt man noch einen Benutzer der Import-Export-Rechte auf Exchange und lokale Adminrechte hat und einen Mailbox-Server mit genug Platz und den AD-PS-Modulen. Der Server sollte unter Windows 2012R2 laufen…

Das Script benötigt ein Verzeichnis welches per UNC erreichbar ist. Darin erstellt es sich die benötigten Arbeitsverzeichnisse und auch LOG-Files. Es läuft nach dem Aufruf in einer Endlosschleiffe und prüft ob in dem Verzeichnis PST-Files auftauchen.

Die PST-Files müssen als Namen den Postfachinhaber haben!!!  Also „<Username>.pst“

param
	(
	[String]$Directory = "\\chr-exc-mxb01\f$\pstmigrate",
	[int]$Sleep = 60, #Wartezeit in Sekunden
	[int]$FileAge = 30, #Zeit in Sekunden seit letztem Schreibzugriff auf Datei
	[String]$MigrateDB = "Migration"
	)
 
if ( -not (test-path $Directory -PathType Container))
	{
	write-error "Der Pfad '$Directory' wurde nicht gefunden!"
	exit
	}
 
$ERRDir = Join-Path -Path $Directory -ChildPath "Error"
$DoneDir = Join-Path -Path $Directory -ChildPath "Done"
$WorkDir = Join-Path -Path $Directory -ChildPath "Work"
$ErrLog = Join-Path -Path $ERRDir -ChildPath "Error.log"
$Log = Join-Path -Path $Directory -ChildPath "Migrate.log"
 
#Arbeitsverzeichnisse anlegen, wenn noch nicht vorhanden.
$Error.clear()
if ( -not (test-path $ERRDir -PathType Container))
	{
	new-item $ERRDir -ItemType Container | out-null
	}
if ( -not (test-path $DoneDir -PathType Container))
	{
	new-item $DoneDir -ItemType Container | out-null
	}
if ( -not (test-path $WorkDir -PathType Container))
	{
	new-item $WorkDir -ItemType Container | out-null
	}
 
if ( $Error.count -ne 0 )
	{
	write-Error "Fehler beim Anlegen der Arbeitsverzeichnisse unter $($Directory)"
	exit
	}
 
function WriteLog
	{
	param
		(
		[String]$File,
		[String]$Message
		)
	$Date = (get-date -UFormat "%x %T").tostring()
	write-output "$Date`: $Message" | out-file -FilePath $File -append -Encoding UTF8
	write-output "$Date`: $Message"
	}
 
if ( (Get-PSSnapin | where {$_.Name -ilike "Microsoft.Exchange.Management.*"} | measure).Count -eq 0 ) # Exchange SnapIn laden
	{
	Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
	}
 
while ( $true )
	{
	$Files = Get-ChildItem $Directory -File *.pst
	foreach ( $File in $Files )
		{
		If ( ((Get-Date) - $File.LastWriteTime).TotalSeconds -le $FileAge )
			{
			WriteLog $Log "Datei zu jung: $($File.Name)"
			continue
			}
		$User = $File.Name.Substring(0, $File.Name.Length -4)
		$UserID = (get-aduser $User -ErrorAction SilentlyContinue ).UserPrincipalName
		if ( -not $UserID )
			{
			Move-Item -Path $File.VersionInfo.FileName -Destination $ERRDir
			WriteLog $Log "FEHLER: Benutzer $($User) nicht im AD gefunden"
			WriteLog $ErrLog "Benutzer $($User) nicht im AD gefunden"
			continue
			}
		$UserMBX = Get-Mailbox $UserID -ErrorAction SilentlyContinue
		$Error.clear()
		if ( -not $UserMBX )
			{
			Enable-Mailbox $UserID -Database $MigrateDB | out-null
			WriteLog $Log "Mailbox erstellt $($UserID)"
			continue # Aus Zeitgründen erst im nächsten durchgang importieren!
			}
		if ( $Error.Count -ne 0 )
			{
			WriteLog $Log "FEHLER: Mailbox erstellen fehlgeschalgen $($UserID)"
			WriteLog $ERRLog "Mailbox erstellen fehlgeschalgen $($UserID)"
			}
		Move-Item -Path $File.VersionInfo.FileName -Destination $WorkDir
		if ($Error.Count -ne 0)
			{
			WriteLog $Log "FEHLER: File-Move bei $($File.Name) fehlgeschalgen."
			continue
			}
		$FileName = Join-Path -Path $WorkDir -ChildPath $File.Name
		WriteLog $Log "Starte Import $($UserID)"
		New-MailboxImportRequest -Mailbox $UserID -FilePath $FileName -AsJob:$false -BatchName $UserID
		#Get-MailboxImportRequest
		if ( $Error.count -eq 0 )
			{
			WriteLog $Log "ImportRequest $($UserID) erfolgreich eingereicht"
			}
		else
			{
			WriteLog $Log "FEHLER: Import $($UserID) fehlgeschlagen"
			WriteLog $ERRLog "Import $($UserID) fehlgeschlagen"
			Move-Item -Path $FileName -Destination $ERRDir
			}
		  
		}
	$Imports = Get-MailboxImportRequest | where { $_.Status -eq "Completed" }
	foreach ( $Import in $Imports )
		{
		$MBX = $(get-mailbox $Import.Mailbox).database.name
		if ( $MBX -eq $MigrateDB )
			{
			$MBX
			$MigrateDB
			#$Import | fl
			New-MoveRequest -Identity $Import.Mailbox | out-null
			}
		WriteLog $Log "Import $($Import.BatchName) erfolgreich abgeschlossen"
		Move-Item -Path $Import.FilePath -Destination $DoneDir
		Remove-MailboxImportRequest $Import -confirm:$false
		}
	#exit
	sleep -Seconds $Sleep
	}

 

 

 

PST-Migration

Das könnte dir auch gefallen

Schreibe einen Kommentar