Power Shell-Skript zum Exportieren des Postfachs

1067
Paramjot Singh

Ich habe ein Skript, das funktioniert und es ist so programmiert, dass es für jeden Monat ein Backup für jedes Postfach erstellt und es auf einem lokalen freigegebenen Laufwerk speichert. Beim Ausführen des Skripts wird die gesamte Datenbank anstelle des angegebenen Datumsbereichs exportiert. Ich bin kein Programmierer. Ich habe eine Google-Partie gesucht, aber nicht 100% erfolgreich. Ich möchte folgende Modifikationen

  1. Ich möchte, dass das Skript Postfach nur aus einer bestimmten Datenbank und nicht aus allen Datenbanken exportiert. Ich habe "-Datenbank-Datenbankname" im Skript versucht, aber es wird ein Fehler angezeigt.

  2. Das Skript sollte für jeden Monat alle Postfächer aus der oben genannten Datenbank exportieren. Wenn das Skript am 9. Dezember 2015 ausgeführt wird, sollte es vom 9. November bis zum 9. Dezember 2015 exportiert werden. Die Datumsangaben müssen sich je nach Erstellungsdatum automatisch ändern.

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

Dies ist das Skript

$Export = Get-Mailbox  $endDate = Get-Date "00:00:00"  $startDate = $endDate.AddDays(-30)  $month = "" -f [int]$startDate.Month  $year = "" -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 wird ein Fehler angezeigt. Postfächer werden jedoch voll 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. Vielen Dank

4
Paramjot - Gibt es eine Chance, [Antwort annehmen] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) auf eine der folgenden Antworten, wenn Sie eine Chance haben? Pimp Juice IT vor 7 Jahren 0

2 Antworten auf die Frage

2
Pimp Juice IT

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 Postfach nur aus einer bestimmten Datenbank und nicht aus allen Datenbanken exportiert. Ich habe "-Datenbank-Datenbankname" im Skript versucht, aber es wird ein Fehler angezeigt.
  2. Das Skript sollte für jeden Monat alle Postfächer aus der oben genannten Datenbank exportieren. Wenn das Skript am 9. Dezember 2015 ausgeführt wird, sollte es vom 9. November bis zum 9. Dezember 2015 exportiert werden. Die Datumsangaben müssen sich je nach Erstellungsdatum automatisch ändern.
  3. Der untere Teil des Skripts wird nicht dort ausgeführt, wo ExportRequest beginnt.

Für Frage Nr. 1. Anscheinend müssen Sie nur dieGet-Mailbox -Database $ExchangeDBBefehle eingeben und diese dann an den Rest der Logik weiterleiten usw. In diesem Fall müssen Sie eine Variable$ExchangeDBfestlegen und diese auf den Namen der Exchange-Datenbank setzen. Aus irgendeinem Grund müssen Sie diesen Befehl als Variable festlegen und dann weiterleiten, oder es gibt Probleme mit dem gleichzeitigen Pipelining usw.

Für Frage Nr. 2. Es scheint, dass die-ContentFilterDatenvariable aus irgendeinem Grundnicht gut mit demParameter mit der Datumszeichenfolgeübereinstimmt.Dies ist jedoch der Fall, wenn Sie das Datum minus den Tagen in eine Variable setzen und dieses als Teil eines Befehls verketten und dann diesen Befehl verwenden wenn es ausgeführt wird

Für Frage 3. Es hat den Anschein, als hätte David darauf geantwortet, und es könnte nur ein Tippfehler für diesen Teil sein, wenn Sie Probleme haben. Andernfalls testen Sie diese Syntax in Ihrer Schleife, um zu sehen, welche Ergebnisse Sie erhalten, da ich nicht glaube, dass Sie die-Mailbox $ExportTeile im Befehlbenötigen:

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

HINWEISPUNKTE

  • Eine Datumsvariable mit der Anzahl der Tage, die vom aktuellen Datum abgezogen werden soll, $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 dann an die anderen Teile der $DynCMDVariablen [dynamischer Befehl] geleitet werden. Andernfalls tritt ein Problem mit dem gleichzeitigen Pipelining auf.
  • Verwenden Sie BEIDE Received -geund Sent -gemit -orstatt -andmit dem -ContentFilterParameter. Dadurch wird sichergestellt, dass Sie sowohl das Empfangs- als auch das Sendedatum für E-Mail-Elemente in beide Richtungen erhalten.
  • Dies wurde für mich zu einer ziemlichen Aufgabe, also habe ich es am Ende so gemacht, dass es ein PowerShell-Skript mit allen anwendbaren Variablen usw. dynamisch erstellt und dieses Skript anschließend ausführt. Das Skript wird im %temp%Speicherort der Windows-Umgebungsvariablen abgelegt. Wenn es vor der Ausführung vorhanden ist, wird es gelöscht und dann erstellt.

Ausgabehinweis

(Ich dachte, das Invoke-Commandwürde funktionieren, aber ich hatte keine Zeit mehr, daher war es einfacher und viel zeitiger, alles an ein PowerShell-Skript mit allen anwendbaren Variablen zu leiten, die gemäß den Kriterien festgelegt wurden, und es anschließend auszuführen. Das Invoke-Commandhat Probleme mit Variablen Verkettet mit anderen Variablen und integrierten dynamischen Befehlen, so war dies einfach und erwies sich als erwartet, um Ihre Probleme zu lösen, mit Ausnahme von # 3, wobei ich mir immer noch nicht hundertprozentig sicher bin, dass das Problem genau da ist es sei denn, die von mir zur Verfügung gestellte Syntax für Frage Nr. 3 wurde aufgelöst .)


POWERSHELL BEISPIELSCHRIFT (PIPELINE LOOP)

(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.)

ANMERKUNG: Sie müssen zwei Variablen in diesem Skript ändern, um darauf hinzuweisen, was in Ihrer Umgebung mit dem Exchange-DB-Namen [ und dem UNC-Pfad, unter dem die PST-Dateien exportiert werden sollen ] [ ] konfiguriert ist, sodass diese beiden Variablen geändert werden müssen. Sobald diese geändert wurden, führen Sie das Fenster der Exchange Server PowerShell-Befehlskonsole aus. Ich habe es getestet und bestätigt, dass es wie erwartet funktioniert.1. $ExchangeDB = "<Exchange_DB_Name>"2. $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"

$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 BEISPIELSCHRIFT (FOREACH LOOP)

$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" 

Bildschirmdruck Exchange Management Console und PowerShell Console

enter image description here


Testlauf

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

Von dort aus sehen Sie, ob die PS1Datei benannt wurde, 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 mir nicht sicher, ob ein Problem vorliegt, das nicht in den Windows Temp-Ordner für Umgebungsvariablen wechselt, wenn die Datei nicht vorhanden ist oder die PS-Konsole keinen Zugriff darauf hat, um sie von dort aus auszuführen, oder wenn Ihre Version von Exchange keine Version hat Beginnen Sie also mit diesen Befehlen und schauen wir uns an, was bei der Fehlerbehebung passiert.

Das folgende Skript schließt den & "$TempPSScript"Teil aus, so dass das dynamisch erstellte und vervollständigte %temp%\TempMBExport.ps1Skript NICHT ausgeführt wird. Wenn Sie also bestätigen, dass sich das Skript in der Position befindet und ob diese Logik in der Exchange PS-Verwaltungskonsole ausgeführt wird, ist dies ein guter nächster Schritt, um das Problem zu ermitteln.

Es ist schwierig, Fehler ohne Zugriff oder Fernunterstützung schriftlich zu beheben. Daher bin ich hier ein wenig eingeschränkt und muss einige leider spekulieren. Sie sind sich nicht sicher, welche weiteren Optionen Sie haben, aber dies 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-Gerät wie oben erwähnt ausführte und es mit dem Notizblock öffne, um die Logik zu sehen, wird es in diesem Format mit diesem Sytax erstellt. Versuchen Sie es daher in Ihrer Exchange-PS-Verwaltungsshell, um zu sehen, welche Ergebnisse Sie erhalten. Wenn dies auf diese Weise funktioniert, hat das Problem etwas mit der Skriptausführung zu tun, aber es werden keine Fehler angezeigt, aber möglicherweise wird auch das Thema beleuchtet.

$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"} 
1
DavidPostill

Danach gibt das Skript einen Fehler aus

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

Es sieht so aus, als hätten Sie einen Schreibfehler.

Ersetzen $Exprotdurch $Export:

While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed)) 
Zumindest konnte ich den ** offensichtlichen ** Fehler beheben. Ich kenne PS wirklich nicht sehr gut. Also kann ich deine anderen Fehler nicht beheben. DavidPostill vor 8 Jahren 0