Power Shell-Skript zum Exportieren von Postfächern

Power Shell-Skript zum Exportieren von Postfächern

Ich habe ein funktionierendes Skript, das so programmiert ist, dass es einen Monat lang ein Backup aller Postfächer erstellt und auf einem lokalen freigegebenen Laufwerk speichert. Wenn ich das Skript ausführe, exportiert es die gesamte Datenbank statt des angegebenen Datumsbereichs. Ich bin kein Programmierer. Ich habe viel bei Google gesucht, aber nicht 100 % erfolgreich. Ich möchte folgende Änderungen

  1. Ich möchte, dass das Skript Postfächer nur aus bestimmten Datenbanken exportiert, nicht aus allen Datenbanken. Ich habe im Skript „-Database Databasename“ ausprobiert, aber es tritt ein Fehler auf.

  2. Das Skript sollte alle Postfächer aus der oben genannten Datenbank für jeden Monat exportieren. Wenn dieses Skript beispielsweise am 9. Dezember 2015 ausgeführt wird, sollte es vom 9. November bis zum 9. Dezember 2015 exportieren. Die Daten müssen automatisch entsprechend dem Kompilierungsdatum geändert werden.

  3. Der untere Teil des Skripts wird nicht dort ausgeführt, wo ExportRequest startet.

Dies ist das Skript

$Export = Get-Mailbox

$endDate = Get-Date "00:00:00"

$startDate = $endDate.AddDays(-30)

$month = "{0:D2}" -f [int]$startDate.Month

$year = "{0:D4}" -f [int]$startDate.Year

Write-Host -NoNewline "Exporting items between $startDate and $endDate..."

$Export|%{$_|New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -FilePath "\\FileServer\EmailBackups\ExportTest\Test\$($_.alias).pst"}

Write-Host "Done."

Write-Host -NoNewline "Waiting for export to complete..."

Nach diesem Skript tritt ein Fehler auf. Aber Postfächer werden vollständig exportiert

While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))

{

    #Sleep for a  few minutes
    Write-Host -NoNewline "."
    Start-Sleep -s 60
}

Write-Host "Done."

Write-Host -NoNewline "Removing Export Request..."

Get-MailboxExportRequest -Mailbox $Export -Status Completed | Remove-MailboxExportRequest

Write-Host "Done."

Bitte helfen Sie, dieses Skript perfekt zu machen. Danke

Antwort1

Exportieren Sie Exchange-Postfächer aus einer bestimmten Exchange-Datenbank und aus einem bestimmten Datumsbereich mit PowerShell in PST-Dateien mit eindeutigen Namen

  1. Ich möchte, dass das Skript Postfächer nur aus bestimmten Datenbanken exportiert, nicht aus allen Datenbanken. Ich habe im Skript „-Database Databasename“ ausprobiert, aber es tritt ein Fehler auf.
  2. Das Skript sollte alle Postfächer aus der oben genannten Datenbank für jeden Monat exportieren. Wenn dieses Skript beispielsweise am 9. Dezember 2015 ausgeführt wird, sollte es vom 9. November bis zum 9. Dezember 2015 exportieren. Die Daten müssen automatisch entsprechend dem Kompilierungsdatum geändert werden.
  3. Der untere Teil des Skripts wird nicht dort ausgeführt, wo ExportRequest startet.

Zu Frage Nr. 1.Es scheint, dass Sie nur die Befehle eingeben Get-Mailbox -Database $ExchangeDBund diese dann an den Rest der Logik usw. weiterleiten müssen. Hier würden Sie eine Variable festlegen $ExchangeDBund diese auf den Namen Ihrer Exchange-Datenbank setzen. Aus irgendeinem Grund müssen Sie diesen Befehl als Variable festlegen und ihn dann weiterleiten, da es sonst ein Problem mit gleichzeitigem Pipelining usw. gibt.

Zu Frage Nr. 2.Aus irgendeinem Grund scheint die Datenvariable nicht gut mit dem -ContentFilterParameter mit der Datumszeichenfolge zu funktionieren. Dies funktioniert jedoch, wenn Sie das Datum abzüglich der Tage in eine Variable einfügen, diese als Teil eines Befehls verketten und diesen Befehl dann bei der Ausführung verwenden.

Zu Frage Nr. 3.Es scheint, dass David dies beantwortet hat und dass Sie in diesem Teil, wo Sie Probleme haben, vielleicht nur einen Tippfehler haben. Andernfalls können Sie diese Syntax gerne in Ihrer Schleife testen, um zu sehen, welche Ergebnisse Sie erhalten, da ich nicht glaube, dass Sie die -Mailbox $ExportTeile im Befehl benötigen:

Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false

Anmerkungen zum Drehbuch

  • Eine Datumsvariable mit der Anzahl der Tage, die vom aktuellen Datum abgezogen werden sollen, $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")da Sie die Daten von diesem Datum bis zum aktuellen Datum erhalten.
  • Der Get-Mailbox -Database $ExchangeDBBefehl muss als Variable festgelegt und diese Variable dann an die anderen Teile der $DynCMDVariable [dynamischer Befehl] weitergeleitet werden, andernfalls liegt ein Problem mit der gleichzeitigen Pipelining vor.
  • Verwenden Sie BOTH Received -geund Sent -gemit -orstatt -andmit dem -ContentFilterParameter – dies stellt sicher, dass Sie für E-Mail-Elemente in beide Richtungen sowohl das Empfangs- als auch das Sendedatum erhalten.
  • Das war für mich eine ziemliche Aufgabe, also habe ich es so gemacht, dass es dynamisch ein PowerShell-Skript mit allen anwendbaren Variablen usw. erstellt und dieses Skript anschließend ausführt. Das Skript wird an den %temp%Speicherort der Umgebungsvariablen des Windows-Betriebssystems gestellt. Wenn es vor der Ausführung vorhanden ist, wird es gelöscht und dann erstellt.

Hinweis zum Problem

(Ich dachte, das Invoke-Commandwürde funktionieren, aber mir ging die Zeit aus, also war es einfacher und zeitsparender für mich, alles in ein PowerShell-Skript zu leiten, in dem alle anwendbaren Variablen gemäß den Kriterien festgelegt sind, und es anschließend einfach auszuführen. Das Invoke-Commandhat Probleme mit Variablen, die mit anderen Variablen verknüpft sind, und dynamischen Befehlen, also war dies einfach und hat sich als erwartungsgemäß funktionierend erwiesen, um Ihre Probleme zu lösen, mit Ausnahme von Nr. 3, bei dem ich mir immer noch nicht 100 % sicher bin, was das Problem genau ist, also gehe ich von dem Tippfehler aus, wie David vorgeschlagen hat, es sei denn, dasZu Frage Nr. 3.die von mir angegebene Syntax wird aufgelöst.)


POWERSHELL-BEISPIELSKRIPT (PIPELINE-SCHLEIFE)

(Exportieren Sie alle Exchange-Postfächer aus einer bestimmten Exchange-Datenbank in eine Dateifreigabe in PST-Dateien, wobei der Dateiname der Aliasname des Postfachkontos ist.)

NOTIZ:Sie müssen zwei Variablen in diesem Skript ändern, um darauf zu verweisen, wie Ihre Umgebung konfiguriert ist1. der Exchange-DB-Name[ $ExchangeDB = "<Exchange_DB_Name>"Und2. der UNC-Pfad, in den die PST-Dateien exportiert werden sollen[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"] also müssen diese beiden Variablen geändert werden. Sobald diese geändert sind, führen Sie sie aus dem Exchange Server PowerShell-Eingabeaufforderungsfenster aus. So habe ich es getestet und bestätigt, dass es wie erwartet funktioniert.

$TempDir      = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB   = "Mail04-Original"
$ExportDir    = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate     = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD       = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'

If (Test-Path $TempPSScript){
    Remove-Item $TempPSScript
}

'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"

 & "$TempPSScript"

POWERSHELL-BEISPIELSKRIPT (FOREACH-SCHLEIFE)

$TempDir      = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB   = "Mail04-Original"
$ExportDir    = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate     = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD1      = 'ForEach ($u in (Get-Mailbox -database ' + $ExchangeDB + ')) {'
$DynCMD2      = 'New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -Mailbox $u -FilePath "' + $ExportDir + '\$($u.alias).pst"}'

If (Test-Path $TempPSScript){
    Remove-Item $TempPSScript
}

$DynCMD1 | Out-File -Append -Force "$TempPSScript"
$DynCMD2 | Out-File -Append -Force "$TempPSScript"

 & "$TempPSScript"

Screen Print Exchange-Verwaltungskonsole und PowerShell-Konsole

Bildbeschreibung hier eingeben


Testlauf

Nachfolgend finden Sie, was Sie in die Exchange PowerShell-Verwaltungskonsole einfügen können, um das temporäre Windows-PowerShell-Skript dynamisch pro Lauf zu erstellen (bei Erfüllung der Kriterien). Sobald dies in der Exchange PowerShell-Verwaltungsshell auf dem Exchange-Server, aber nicht in PS, ausgeführt wird, gehen Sie zu Start--> Run-->, geben Sie ein %Temp%und drücken Sie Enter.

Überprüfen Sie dort, ob die PS1Datei mit dem Namen erstellt wird TempMBExport.ps1, öffnen Sie sie mit Notepad und sehen Sie sich die Logik an. Sehen Sie, was passiert, wenn Sie den Inhalt dieses Skripts in die Exchange PowerShell-Verwaltungskonsole kopieren und drücken Enter.

Ich bin nicht sicher, ob es ein Problem damit gibt, dass die Datei nicht in den temporären Umgebungsvariablenordner von Windows geht, wenn sie nicht existiert, oder dass die PS-Konsole keinen Zugriff hat, um sie von dort aus auszuführen, oder dass Ihre Exchange-Version einen dieser Befehle nicht mag. Beginnen wir also damit und schauen wir, was zur Fehlerbehebung passiert.

Das folgende Skript schließt den & "$TempPSScript"Teil aus, sodass es das dynamisch erstellte und kompilierte Skript NICHT ausführt. %temp%\TempMBExport.ps1Ein guter nächster Schritt zur Ermittlung des Problems besteht daher darin, zu bestätigen, dass es sich am Speicherort befindet und ob diese Logik in der Exchange PS-Verwaltungskonsole ausgeführt wird oder nicht.

Es ist schwierig, Fehler schriftlich zu beheben, ohne Zugriff oder Remote-Support zu haben. Daher bin ich hier etwas eingeschränkt und muss leider spekulieren. Ich bin mir nicht sicher, welche weiteren Optionen Sie hätten, aber das sind einige schnelle Gedanken.

$TempDir      = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB   = "Mail04-Original"
$ExportDir    = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate     = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD       = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'

If (Test-Path $TempPSScript){
    Remove-Item $TempPSScript
}

'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"

ZULETZT

Wenn ich das PS wie oben beschrieben ausführe und es mit Notepad öffne, nur um die Logik zu sehen, wird es in diesem Format mit dieser Syntax erstellt. Versuchen Sie also vielleicht, es in Ihrer Exchange PS-Verwaltungsshell auszuführen und sehen Sie, welche Ergebnisse Sie erhalten. Wenn es so funktioniert, hat das Problem etwas mit der Skriptausführung zu tun, aber Sie erhalten keine Fehler, aber vielleicht bringt dies auch etwas Licht in das Thema.

$GetMBCMD = Get-Mailbox -Database Mail04-Original
$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "11/12/2015 00:00:00") -or (Sent -ge "11/12/2015 00:00:00")} -FilePath "\\FileServer\Emailbackups\ExportTest\MonthTest2\$($_.alias).pst"}

Antwort2

Danach gibt das Skript einen Fehler aus

While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))

Es sieht so aus, als ob Sie einen Rechtschreibfehler haben.

Ersetzen $Exprotmit $Export:

While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))

verwandte Informationen