tray-park
Goto Top

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

Content-ID: 146493

Url: https://administrator.de/contentid/146493

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

Miyamoto
Miyamoto 09.07.2010 um 14:31:21 Uhr
Goto Top
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.
# 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
tray-park
tray-park 12.07.2010 um 09:34:20 Uhr
Goto Top
Bis auf
    $hdd=gwmi win32_logicaldisk -filter "drivetype=3" | select DeviceID,@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1mb)}}   
versteht sich das Ganze von selbst.

Aber die Schleife muss ich anders setzen, da das Import-Skript ja selbst in einer läuft. D.H. Wenn ich das Import-Skript an der von dir markierten Stelle
$mb=10 
# IMPORT-SKRIPT
For ($x=1; $x -le 5; $x++) # es wird max 5 mal geschaut ob genug freier speicher vorhanden ist
einfüge, kommt es ja nie zur Speicherkapazitätsüberprüfung oder?
Miyamoto
Miyamoto 12.07.2010 um 10:27:59 Uhr
Goto Top
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:
  1. Schleife liest Datei ein (läuft so lange wie Dateien da sind)
  2. Speicher Überprüfungsschleife (läuft max 5 mal durch, pro Datei)
    1. Nicht genug Speicher frei, variable $freespaceok=0, Bereinigung beginnt, noch mal schleife durchlaufen und schauen ob genug Speicher frei ist
    2. Genug Speicher frei, variable $freespaceok=1, Abbruch der "Speicher Überprüfungsschleife"
  3. $freespaceok
    1. $freespaceok=1
      1. genug Speicher frei, Import
    2. $freespaceok=0
      1. nicht genug Speicher frei, kein Import, Abbruch der einlese Schleife

    Gruß Miyamoto
tray-park
tray-park 19.07.2010 um 14:01:14 Uhr
Goto Top
Hi,

das funktioniert prächtig. Ich komm aber immer noch nicht drauf, was hinter
$hdd=gwmi win32_logicaldisk -filter "drivetype=3" | select DeviceID,@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1mb)}}   
steckt.
Miyamoto
Miyamoto 19.07.2010 um 16:21:19 Uhr
Goto Top
Hi,
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 face-smile

Gruß Miyamoto