Diskfree & Diskused mit E-Mail Meldung abfragen

Diskfree & Diskused mit E-Mail Meldung abfragen

Ich wurde nochmals durch einen Kollegen gebeten Ihn zu unterstützen und natürlich möchte ich das hier niemandem vorenthalten.

Was ist zu tun: Der Server läuft aufgrund von fehlendem Monitoring (Warum auch immer und dazu sag ich hier jetzt mal nichts…) immer mal wieder unerkannt voll. Dieses kleine Script soll den Speicherplatz auswerten und ab einem bestimmten Wert eine E-Mail verschicken und vor der drohenden Gefahr warnen.

Das Script kann von jedem angepasst werden. Wer möchte kann hier nicht auf den gefüllten Speicher kontrollieren sondern auf den Freien Speicher oder eben auf den Prozentwert der selbigen. Hierzu gebe ich dann einen Hinweis an der entsprechenden Stelle.

Fangen wir einfach mal an mit dem Befehl „Get-PSDrive“. Dieser liefert eine Übersicht aller Laufwerke (samt Netzlaufwerke) und ein paar kleine Informationen dazu.

PowerShell
PS C:\Users\Fbn351> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                          CurrentLocation
----           ---------     --------- --------      ----                          ---------------
A                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\Aus...
Alias                                  Alias
B                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\Bes...
C                 188,27         44,09 FileSystem    C:\                                 Users\XXX
Cert                                   Certificate   \
D                 763,54        167,97 FileSystem    D:\
Env                                    Environment
F                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\Fir...
Function                               Function
G                                      FileSystem    G:\
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
I                                      FileSystem    I:\
J                                      FileSystem    J:\
K                                      FileSystem    K:\
M                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\Mus...
O                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\PRI...
P                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\PRI...
S                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\Sca...
Variable                               Variable
W                2069,03       1503,13 FileSystem    \\192.XXX.XXX.XXX\Web
WSMan                                  WSMan
X                 226,18       1603,06 FileSystem    \\192.XXX.XXX.XXX\Hom...
Y                 226,18       1603,06 FileSystem    \\192.XXX.XXX.XXX\Pri...

Ich setze dann einfach meinen Fokus auf den Laufwerksbuchstaben meiner Wahl. Hier z.B. C:\

PowerShell
Name           Used (GB)     Free (GB) Provider      Root                          CurrentLocation
----           ---------     --------- --------      ----                          ---------------
C                 188,27         44,09 FileSystem    C:\                                 Users\XXX

Jetzt habe ich aber ein Problem. Erweitere ich meinen Fokus auf Used oder Free erhalte ich lediglich eine Zahl die in Bytes dargestellt ist z.B.

PowerShell
PS C:\Users\Fbn351> Get-PSDrive C | Select-Object -Property Free

       Free
       ----
47344922624

#bzw.

PS C:\Users\Fbn351> Get-PSDrive C | Select-Object -Property Used

        Used
        ----
202149482496

Das ist aber soweti erstmal nicht schlimm da ich für die Berechnung erstmal die Rohzahlen verwende. Hierzu setze ich beide Werte in eine Variable und berechne diese zusammen um meine Festplattenkapazität zu erhalten die sog. „Maximumsize“. Hierzu kürze ich den Befehl auch direkt ab und beziehe mir nur den gewünschten Wert aus dem Befehl. (BEFEHL).WERT

PowerShell
$FreeSpace = (Get-PSDrive C).Free
$UsedSpace = (Get-PSDrive C).Used
$Maximumsize = $UsedSpace+$FreeSpace

Als nächstes nehme ich einen der beiden Werte und teile Ihn durch die Maximalgröße und nehme diesen Wert dann noch mal 100 um auf den Prozentualen Anteil zu kommen.

PowerShell
$PercentageUsedSpace = ($UsedSpace/$Maximumsize)*100

Hier könnt ihr entscheiden wonach Ihr prüfen wollt

Wer den freien Speicher prüfen will nimmt hier: ($FreeSpace/$Maximumsize)*100
Und wer auf Belegten Speicher prüfen will nimmt:
($UsedSpace/$Maximumsize)*100

Jetzt werden alle Angaben in GB umgerechnet und auf zwei Stellen gekürzt. Da ich hier den einfachen Weg nehme und die Variable in einem String umwandle kann eine Berechnung danach nicht mehr erfolgen. Der Wert wird dann im String auf zwei Dezimalstellen gekürzt.

PowerShell
$FreeSpace = ($FreeSpace /1GB) | % {$_.ToString("#.##")}
$UsedSpace = ($UsedSpace /1GB) | % {$_.ToString("#.##")}
$Maximumsize = ($Maximumsize /1GB) | % {$_.ToString("#.##")}

% in Powershell

Das % was ich hier nach der Pipe | benutze ist eine gekürzte Variante von Foreach-Object – wir Menschen sind einfach nur zu faul zu schreiben

Daraufhin folgt lediglich noch die IF-Abfrage die man je nachdem ob man FreeSpace oder UsedSpace gewählt man anwenden muss.

PowerShell
#Variante Belegter Speicher ist groesser als 80%
if ($PercentageUsedSpace -ge 80) {
Write-Host "80% Erreicht!!!!! Wir saufen ab" -ForegroundColor "RED"
}
else{
Write-Host "Es ist noch Platz wir sind erst bei $PercentageUsedSpace %" -ForegroundColor "GREEN"
}


#Variante Freier Speicher ist groesser als 20%
if ($PercentageFreeSpace -ge 20) {
Write-Host "Es ist noch Platz wir sind noch bei $PercentageFreeSpace %" -ForegroundColor "GREEN"
}
else{
Write-Host "20% Unterschritten!!!!! Wir saufen ab" -ForegroundColor "RED"
}

Hier kann man dann auch eine Funktion aufrufen die dann eine E-Mail mit den entsprechenden Parametern versendet.

Ich hoffe es hat euch gefallen. Hier noch das Script einmal vollständig.

PowerShell
$FreeSpace = (Get-PSDrive C).Free
$UsedSpace = (Get-PSDrive C).Used
$Maximumsize = $UsedSpace+$FreeSpace

$PercentageUsedSpace = ($UsedSpace/$Maximumsize)*100
$PercentageFreeSpace = ($FreeSpace/$Maximumsize)*100

$FreeSpace = ($FreeSpace /1GB) | % {$_.ToString("#.##")}
$UsedSpace = ($UsedSpace /1GB) | % {$_.ToString("#.##")}
$Maximumsize = ($Maximumsize /1GB) | % {$_.ToString("#.##")}

#Variante Belegter Speicher ist kleiner als 80%
if ($PercentageUsedSpace -ge 80) {
   Write-Host "80% Erreicht!!!!! Wir saufen ab" -ForegroundColor "RED"
}
else{
   Write-Host "Es ist noch Platz wir sind erst bei $PercentageUsedSpace %" -ForegroundColor "GREEN"
}


#Variante Freier Speicher ist groesser als 20%
if ($PercentageFreeSpace -ge 20) {
   Write-Host "Es ist noch Platz wir sind noch bei $PercentageFreeSpace %" -ForegroundColor "GREEN"
}
else{
   Write-Host "20% Unterschritten!!!!! Wir saufen ab" -ForegroundColor "RED"
}



Write-Host "FreeSpace = $FreeSpace"
Write-Host "UsedSpace = $UsedSpace"
Write-Host "Maximumsize = $Maximumsize"
Write-Host "PercentageUsedSpace = $PercentageUsedSpace"
Write-Host "PercentageFreeSpace = $PercentageFreeSpace"