PowerShell - Postfach-Datenbank bereinigen
Ich möchte die Postfach-Datenbank auf einem Exchange 2010 mit hilfe eines PowerShell Skripts bereinigen.
Hi,
ich habe ein Skript, welches automatisiert PST-Dateien in ein Postfach importiert.
Es erstellt ein Postfach und importiert die Mails aus der PST.
Dann werden die Mails mit einem Fremdprogramm aus dem Postfach archiviert und das Postfach wird wieder deaktiviert.
Deaktiviert wird es, damit das Posfach beim Aktivieren wieder leer ist.
(ich nenne es hier mal "Import-Skript")
Das funktioniert auch soweit sehr gut (Dank der großartigen Hilfe von Miyamoto).
Nun ist das Problem aufgetreten, dass mir die Festplattenkapazität nicht ausreicht um mit dem Import-Vorgang fortfahren zu können.
Ist ja auch logisch, da das Postfach beim deaktivierten als getrenntes Postfach weiter besteht, somit aber unnötig Speicher einnimt.
Nun habe ich ein kleines Skript geschrieben (ich nenne es hier mal "Bereinigungs-Skript") , welches
- das Postfach, in welches die PST-Dateien geladen werden, deaktiviert,
- die Postfachdatenbankbereitstellung aufhebt,
- die Datenbank-Datei samt übergeordnetem Ordner löscht
- eine neue Datenbank erstellt
- diese dann bereit stellt
- und das Postfach wieder aktiviert.
Dann gibt es noch ein kleines Skript, welches die getrennten Postfächer aus der Liste der "Getrennten Postfächer" entfernt
Sehr elegant ist diese Variante allerdings nicht, Speicherplatz zu schaffen. Da es auch etwas zeitaufwendig und umständlich ist.
Hat jemand eine Idee, wie dies ... sagen wir mal "professioneller" geschehen kann?
Und / oder . . . .
Es wäre auch schön, wenn man in das Import-Skript etwas einbauen könnte, was sobald die Platte voll ist, das Bereinigungs-Skript ausführt, ohne, dass der Import-Vorgang abgebrochen wird.
Das einfachste wäre natürlich, eine riesige Platte einzubauen und die Postfach-Datenbank dort bereit zu stellen. Aber leider steht das momentan nicht als Option zur Verfügung.
Freue mich über jede Rückmeldung.
Grüße
Tray
Hi,
ich habe ein Skript, welches automatisiert PST-Dateien in ein Postfach importiert.
Es erstellt ein Postfach und importiert die Mails aus der PST.
Dann werden die Mails mit einem Fremdprogramm aus dem Postfach archiviert und das Postfach wird wieder deaktiviert.
Deaktiviert wird es, damit das Posfach beim Aktivieren wieder leer ist.
(ich nenne es hier mal "Import-Skript")
Das funktioniert auch soweit sehr gut (Dank der großartigen Hilfe von Miyamoto).
Nun ist das Problem aufgetreten, dass mir die Festplattenkapazität nicht ausreicht um mit dem Import-Vorgang fortfahren zu können.
Ist ja auch logisch, da das Postfach beim deaktivierten als getrenntes Postfach weiter besteht, somit aber unnötig Speicher einnimt.
Nun habe ich ein kleines Skript geschrieben (ich nenne es hier mal "Bereinigungs-Skript") , welches
- das Postfach, in welches die PST-Dateien geladen werden, deaktiviert,
- die Postfachdatenbankbereitstellung aufhebt,
- die Datenbank-Datei samt übergeordnetem Ordner löscht
- eine neue Datenbank erstellt
- diese dann bereit stellt
- und das Postfach wieder aktiviert.
$user="Migration"
$dbExt=".edb"
$dbAlt="Migration"
$dbNeu="Migration"
$dbPath="D:\Microsoft\Exchange Server\V14\Mailbox\"
$dbServ="Server"
Disable-Mailbox -Identity $user -Confirm:$false
Remove-MailboxDatabase $dbAlt -Confirm:$false
Remove-Item -Path $dbPath$dbAlt -recurse -Confirm:$false
New-MailboxDatabase -Name $dbNeu -EdbFilePath $dbPath$dbNeu"\"$dbNeu$dbExt -LogFolderPath $dbPath$dbNeu -Server $dbServ
Write-Host "| Datenbank $dbneu erstellt |" -ForegroundColor Yellow
Mount-Database $dbNeu
Write-Host "| Datenbank $dbneu bereit |" -ForegroundColor Yellow
Enable-Mailbox -Identity $user -Confirm:$false -Database $dbNeu
Dann gibt es noch ein kleines Skript, welches die getrennten Postfächer aus der Liste der "Getrennten Postfächer" entfernt
$db = "mailbox"
Get-MailboxStatistics -database $db | where {$_.disconnectdate -ne $null} | foreach {Remove-mailbox -database $_.database -storemailboxidentity $_.mailboxguid -Confirm:$false}
Sehr elegant ist diese Variante allerdings nicht, Speicherplatz zu schaffen. Da es auch etwas zeitaufwendig und umständlich ist.
Hat jemand eine Idee, wie dies ... sagen wir mal "professioneller" geschehen kann?
Und / oder . . . .
Es wäre auch schön, wenn man in das Import-Skript etwas einbauen könnte, was sobald die Platte voll ist, das Bereinigungs-Skript ausführt, ohne, dass der Import-Vorgang abgebrochen wird.
Das einfachste wäre natürlich, eine riesige Platte einzubauen und die Postfach-Datenbank dort bereit zu stellen. Aber leider steht das momentan nicht als Option zur Verfügung.
Freue mich über jede Rückmeldung.
Grüße
Tray
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 146493
Url: https://administrator.de/contentid/146493
Ausgedruckt am: 08.11.2024 um 09:11 Uhr
5 Kommentare
Neuester Kommentar
Hi,
was kannst du machen kannst ist z.B. eine schleife durchlaufen lassen die immer schaut ob genug freier Speicher vorhanden ist.
In dem Beispiel musst du allerdings wissen wie viel freien Speicher du so ca. brauchst.
ich hoffe es ist einiger maßen verständlich ^^
Gruß Miyamoto
was kannst du machen kannst ist z.B. eine schleife durchlaufen lassen die immer schaut ob genug freier Speicher vorhanden ist.
In dem Beispiel musst du allerdings wissen wie viel freien Speicher du so ca. brauchst.
# hier die Festplatte auswählen, die man über prüfen möchte
$my_hdd="D:"
# 0 = nicht genug speicher frei
$freespaceok=0
# es muss mindestens so viel MB frei sein
$mb=10
# vor dieser zeile muss deine Schleife herum, die die Dateien einliest ___Anfang der schleife
For ($x=1; $x -le 5; $x++) # es wird max 5 mal geschaut ob genug freier speicher vorhanden ist
{
$hdd=gwmi win32_logicaldisk -filter "drivetype=3" | select DeviceID,@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1mb)}}
foreach ($i in $hdd){
if ($i.DeviceID -eq $my_hdd) {
if ($i.FreeSpace -le $mb) {
Write-Host "es ist nicht genug platz"
Write-Host $i.DeviceID $i.FreeSpace
$freespaceok=0
# hier muss dein "Bereinigungs-Skript" hinein
} ElseIf ($i.FreeSpace -ge $mb) {
$freespaceok=1
$x=10
}
}
}
}
if ($freespaceok -eq 1) {
# hier muss dein import rein
Write-Host "starte import"
} ElseIf ($freespaceok -eq 0) {
Write-Host "Die Festplatte ist voll!!!"
# abruchbedingung deiner schleife, die du noch ein bauen must
}
$freespaceok=0
# nach dieser zeile muss deine Schleife enden ___Ende der schleife
ich hoffe es ist einiger maßen verständlich ^^
Gruß Miyamoto
Hi,
ich meinte damit das du das Import Skript auseinander bauen musst.
in deinem Import Skript liest du doch die pst Dateien mit einer schleife ein oder???
Diese Schleife muss in Zeile 9 beginnen und endet in Zeile 44
Das was du innerhalb der schleife machst (Import Skript) kommt in Zeile 36
Dein Bereinigungsskript kommt in Zeile 24
Der Ablauf sollte den der folgende sein:
ich meinte damit das du das Import Skript auseinander bauen musst.
in deinem Import Skript liest du doch die pst Dateien mit einer schleife ein oder???
Diese Schleife muss in Zeile 9 beginnen und endet in Zeile 44
Das was du innerhalb der schleife machst (Import Skript) kommt in Zeile 36
Dein Bereinigungsskript kommt in Zeile 24
Der Ablauf sollte den der folgende sein:
- Schleife liest Datei ein (läuft so lange wie Dateien da sind)
- Speicher Überprüfungsschleife (läuft max 5 mal durch, pro Datei)
- Nicht genug Speicher frei, variable $freespaceok=0, Bereinigung beginnt, noch mal schleife durchlaufen und schauen ob genug Speicher frei ist
- Genug Speicher frei, variable $freespaceok=1, Abbruch der "Speicher Überprüfungsschleife"
- $freespaceok
- $freespaceok=1
- genug Speicher frei, Import
- $freespaceok=0
- nicht genug Speicher frei, kein Import, Abbruch der einlese Schleife
Gruß Miyamoto
Hi,
also
ich hoffe es ist einigermaßen verständlich
Gruß Miyamoto
also
Code | Beschreibung |
---|---|
$hdd | ist eine Variable |
gwmi | Get-WmiObject |
gwmi win32_logicaldisk | Zur Anzeige lokaler Laufwerks Informationen |
-filter "drivetype=3" | mit dem Filter werden nur noch Lokale Festplatten angezeigt, nicht mehr CD/DVD Laufwerk und so |
| | pipe-Zeichen |
select | hiermit kann man die Ausgabe noch weiter Einschränken die man übergeben bekommen hat von der pipe |
DeviceID | Laufwerksbustaube |
@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1mb)}} | hiermit wird die freie Größe in MB angegeben |
ich hoffe es ist einigermaßen verständlich
Gruß Miyamoto