Festlegen von Warnungen zu geringem Speicherplatz unter Windows Server 2008

29

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, eine E-Mail-Warnung unter Windows Server 2008 auszulösen, wenn auf logischen Datenträgern nur noch wenig Speicherplatz zur Verfügung steht. Ich habe 2 SQL-Server, die wegen der DB-Protokolldateien fast keinen Speicherplatz mehr haben.

Danke, Ryan

rmwetmore
quelle
1
Wenn Sie die vollständigen Protokolle nicht über einen längeren Zeitraum aufbewahren müssen, setzen Sie die Datenbanken mit den größten Protokollen in den Sicherungsmodus "Einfach" und lassen Sie sie von Ihrem Wartungsplan sofort nach Abschluss einer vollständigen Sicherung kürzen. Dies beantwortet Ihre Frage natürlich nicht, kann aber dazu beitragen, dass das Laufwerk erst gar nicht voll wird, wenn es Ihre Situation zulässt.
Justin Scott
Danke für die Information. Ich habe einen zusätzlichen Sicherungsjob implementiert, um die SQL-Protokolldateien zu kürzen und zu verhindern, dass sie größer werden. Aber ich möchte für alle Fälle eine Art Alarm auslösen. Vielen Dank.
rmwetmore
Wir verwenden Spiceworks, um uns über zu wenig Speicherplatz auf allen Clients und Servern zu informieren.

Antworten:

37

Eine einfache Möglichkeit, Windows Server 2008 zum Senden von E-Mail-Benachrichtigungen über zu wenig Speicherplatz zu veranlassen, ist die Verwendung des Taskplaners und des Systemprotokolls. Wenn der freie Speicherplatz unter den in HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold angegebenen Prozentsatz fällt, wird im Systemprotokoll ein Ereignis aufgezeichnet, das eine Aufgabe zum Senden einer E-Mail-Nachricht auslösen kann.

  1. Öffnen Sie den Taskplaner und erstellen Sie eine neue Aufgabe.
  2. Geben Sie einen Namen für die Aufgabe ein, wählen Sie "Ausführen, ob Benutzer angemeldet ist oder nicht" und aktivieren Sie "Kennwort nicht speichern".
  3. Fügen Sie auf der Registerkarte "Trigger" einen neuen Trigger hinzu.
  4. Wählen Sie "Bei einem Ereignis" im Feld "Aufgabe starten".
  5. Setzen Sie Protokoll auf "System", Quelle auf "srv" und Ereignis-ID auf "2013".
  6. Fügen Sie auf der Registerkarte Aktionen eine neue Aktion hinzu.
  7. Stellen Sie "Aktion" auf "E-Mail senden" und füllen Sie die restlichen Einstellungen entsprechend aus.
  8. Öffnen Sie den Registrierungseditor, navigieren Sie zu HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters, und fügen Sie einen DWORD-Wert mit dem Namen "DiskSpaceThreshold" hinzu, um zu konfigurieren, wann das Ereignis mit geringem Speicherplatz im Systemprotokoll aufgezeichnet wird. Wenn der Eintrag nicht vorhanden ist, ist der Standardwert 10.
Mark Pettibone
quelle
6
Triggert dies nur für das Systemlaufwerk (normalerweise das Laufwerk C)? Was ist, wenn ich 2-3 Treiber habe und für jeden einen Alarm einrichten möchte?
Ved
Ereignis 2013 wird für jede Partition protokolliert, die den festgelegten Schwellenwert unterschreitet. Beachten Sie, dass es nur einmal pro Partition protokolliert wird, es sei denn, der Speicherplatz steigt wieder über den Schwellenwert an oder der Server wird neu gestartet. support.microsoft.com/kb/112509
paulH
2
In neueren Versionen von Windows Server ist die Aktion "E-Mail senden" veraltet. Stattdessen können Sie die Aktion "Programm starten" verwenden, powershelldas Programm -command &{send-mailmessage -from [email protected] -to [email protected] -subject 'Alert from Task Scheduler' -body 'This is an automated message from a task scheduled on the server. Testing powershell email.' -smtpserver x.x.x.x}
eingeben
1

Ich habe meiner (separaten) Nagios-Instanz die Speicherplatzüberwachung über snmp hinzugefügt.

David Mackintosh
quelle
Wir haben Festplattenüberwachung als Teil unseres allgemeinen Überwachungspakets, obwohl wir IPMonitor verwenden, der die Festplatten alle paar Minuten überprüft.
Justin Scott
Im Moment schaue ich nach einem separaten Überwachungssystem (wie IPMonitor), aber ich möchte in der Zwischenzeit etwas auf den Servern einrichten, um mich zu warnen. Vielen Dank.
rmwetmore
1

Warum führen Sie nicht jeden Tag ein Powershell-Skript als Zeitplanaufgabe aus? Wenn das Skript feststellt, dass der freie Speicherplatz auf der Festplatte weniger als 10% beträgt, erhalten Sie eine E-Mail oder eine Benachrichtigung.

Hier ist ein Beispielcode zum Überprüfen des freien Speicherplatzes der Festplatten:

Get-Content für jedes Objekt {$ ; Get-WMIObject-Computername $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}

sky100
quelle
1
Dieses Skript funktioniert nicht. Ich erhalte die Fehlermeldung, dass kein Positionsparameter eingestellt ist.
Raffael Luthiger
1

Beide Beispiele funktionieren aufgrund falscher PowerShell-Syntax nicht. Der folgende Code listet die Volume-Größen des aktuellen Hosts auf (mit PowerShell 5.0):

Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }

Der folgende Code listet die Volumengrößen der in server.txt aufgelisteten Hosts auf :

Get-Content server.txt | %{ Get-WMIObject –computername $_ Win32_LogicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB } }

Randnotiz

Beachten Sie, dass der äußere Platzhalter $_die Serveradressen auflistet, während der innere Platzhalter $_die Geräte auflistet. Dies ist ein häufiges Problem für PowerShell-Neulinge. Wenn Sie die Serveradresse in der inneren Schleife verwenden möchten, müssen Sie sie in der äußeren Schleife einer neuen Variablen zuweisen.

Die hier verwendete Forensoftware ist fehlerhaft. In der Post-Vorschau wird sie $_korrekt als $_gerade angezeigt , wenn sie nicht als Code maskiert ist. Im letzten Beitrag wird jedoch der Unterstrich entfernt, wodurch die PowerShell-Beispiele fehlerhaft werden.

Frank Heimes
quelle
Mit dem ersten Befehl Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }kann ich den verbleibenden Speicherplatz auf dem Laufwerk anzeigen. Als PS - Neuling verstehe ich den nächsten Schritt zur Automatisierung nicht ganz Laufwerk war unter einem bestimmten Speicherplatzgrenzwert, verbinden Sie einen PS-Befehl zum Senden und E-Mailen. Ich sehe, dass E-Mail von einem Post mit boadad oben gesendet werden kann, weiß -command &{send-mailmessage ...aber nicht, wie Sie Ihre mit Logik verbinden, die vorgibt, dass wenig Speicherplatz zum Senden von E- Mail erforderlich ist Thx.
Jeff Mergler
0

Mit diesem Skript können Sie eine E-Mail über Ihren E-Mail-Server senden. Ersetzen Sie einfach den Namen des SMTP-Servers durch den Namen Ihres Servers. Wenn Sie sich auf demselben Computer befinden, verwenden Sie "localhost" (der SMTP-Server muss funktionsfähig sein). Das Skript finden Sie auch hier: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Nachdem das Skript auf dem lokalen Laufwerk gespeichert wurde, kann es problemlos mit Powershell ausgeführt und getestet werden. Sobald das Skript einwandfrei zu funktionieren scheint, kann es mit dem Windows-Taskplaner je nach Bedarf für die tägliche oder stündliche Ausführung geplant werden. In diesem Artikel wird erläutert, wie Sie ein Skript mit dem Taskplaner ausführen. https://www.metalogix.com/help/Content%20Matrix%20Console/SharePoint%20Edition/002_HowTo/004_SharePointActions/012_SchedulingPowerShell.htm

############################################################################# 
#                                                                                                                                                     # 
#  Check disk space and send an HTML report as the body of an email.                                                   # 
#  Reports only disks on computers that have low disk space.                                                                 # 
#  Author: Mike Carmody                                                                                                                   # 
#  Some ideas extracted from Thiyagu's Exchange DiskspaceHTMLReport module.                                  # 
#  Date: 8/10/2011                                                          # 
#  I have not added any error checking into this script yet.                # 
#                                                                           # 
#                                                                           # 
############################################################################# 
# Continue even if there are errors 
$ErrorActionPreference = "Continue"; 

######################################################################################### 
# Items to change to make it work for you. 
# 
# EMAIL PROPERTIES 
#  - the $users that this report will be sent to. 
#  - near the end of the script the smtpserver, From and Subject. 

# REPORT PROPERTIES 
#  - you can edit the report path and report name of the html file that is the report.  
######################################################################################### 

# Set your warning and critical thresholds 
$percentWarning = 15; 
$percentCritcal = 10; 

# EMAIL PROPERTIES 
 # Set the recipients of the report. 
  $users = "[email protected]" 
    #$users = "[email protected]" # I use this for testing by uing my email address. 
  #$users = "[email protected]", "[email protected]", "[email protected]";  # can be sent to individuals. 


# REPORT PROPERTIES 
 # Path to the report 
  $reportPath = "D:\Jobs\DiskSpaceQuery\Reports\"; 

 # Report name 
  $reportName = "DiskSpaceRpt_$(get-date -format ddMMyyyy).html"; 

# Path and Report name together 
$diskReport = $reportPath + $reportName 

#Set colors for table cell backgrounds 
$redColor = "#FF0000" 
$orangeColor = "#FBB917" 
$whiteColor = "#FFFFFF" 

# Count if any computers have low disk space.  Do not send report if less than 1. 
$i = 0; 

# Get computer list to check disk space 
$computers = Get-Content "servers_c.txt"; 
$datetime = Get-Date -Format "MM-dd-yyyy_HHmmss"; 

# Remove the report if it has already been run today so it does not append to the existing report 
If (Test-Path $diskReport) 
    { 
        Remove-Item $diskReport 
    } 

# Cleanup old files.. 
$Daysback = "-7" 
$CurrentDate = Get-Date; 
$DateToDelete = $CurrentDate.AddDays($Daysback); 
Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item; 

# Create and write HTML Header of report 
$titleDate = get-date -uformat "%m-%d-%Y - %A" 
$header = " 
  <html> 
  <head> 
  <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> 
  <title>DiskSpace Report</title> 
  <STYLE TYPE='text/css'> 
  <!-- 
  td { 
   font-family: Tahoma; 
   font-size: 11px; 
   border-top: 1px solid #999999; 
   border-right: 1px solid #999999; 
   border-bottom: 1px solid #999999; 
   border-left: 1px solid #999999; 
   padding-top: 0px; 
   padding-right: 0px; 
   padding-bottom: 0px; 
   padding-left: 0px; 
  } 
  body { 
   margin-left: 5px; 
   margin-top: 5px; 
   margin-right: 0px; 
   margin-bottom: 10px; 
   table { 
   border: thin solid #000000; 
  } 
  --> 
  </style> 
  </head> 
  <body> 
  <table width='100%'> 
  <tr bgcolor='#CCCCCC'> 
  <td colspan='7' height='25' align='center'> 
  <font face='tahoma' color='#003399' size='4'><strong>AEM Environment DiskSpace Report for $titledate</strong></font> 
  </td> 
  </tr> 
  </table> 
" 
 Add-Content $diskReport $header 

# Create and write Table header for report 
 $tableHeader = " 
 <table width='100%'><tbody> 
 <tr bgcolor=#CCCCCC> 
    <td width='10%' align='center'>Server</td> 
 <td width='5%' align='center'>Drive</td> 
 <td width='15%' align='center'>Drive Label</td> 
 <td width='10%' align='center'>Total Capacity(GB)</td> 
 <td width='10%' align='center'>Used Capacity(GB)</td> 
 <td width='10%' align='center'>Free Space(GB)</td> 
 <td width='5%' align='center'>Freespace %</td> 
 </tr> 
" 
Add-Content $diskReport $tableHeader 

# Start processing disk space reports against a list of servers 
  foreach($computer in $computers) 
 {  
 $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" 
 $computer = $computer.toupper() 
  foreach($disk in $disks) 
 {         
  $deviceID = $disk.DeviceID; 
        $volName = $disk.VolumeName; 
  [float]$size = $disk.Size; 
  [float]$freespace = $disk.FreeSpace;  
  $percentFree = [Math]::Round(($freespace / $size) * 100, 2); 
  $sizeGB = [Math]::Round($size / 1073741824, 2); 
  $freeSpaceGB = [Math]::Round($freespace / 1073741824, 2); 
        $usedSpaceGB = $sizeGB - $freeSpaceGB; 
        $color = $whiteColor; 

# Set background color to Orange if just a warning 
 if($percentFree -lt $percentWarning)       
  { 
    $color = $orangeColor  

# Set background color to Orange if space is Critical 
      if($percentFree -lt $percentCritcal) 
        { 
        $color = $redColor 
       }         

 # Create table data rows  
    $dataRow = " 
  <tr> 
        <td width='10%'>$computer</td> 
  <td width='5%' align='center'>$deviceID</td> 
  <td width='15%' >$volName</td> 
  <td width='10%' align='center'>$sizeGB</td> 
  <td width='10%' align='center'>$usedSpaceGB</td> 
  <td width='10%' align='center'>$freeSpaceGB</td> 
  <td width='5%' bgcolor=`'$color`' align='center'>$percentFree</td> 
  </tr> 
" 
Add-Content $diskReport $dataRow; 
Write-Host -ForegroundColor DarkYellow "$computer $deviceID percentage free space = $percentFree"; 
    $i++   
  } 
 } 
} 

# Create table at end of report showing legend of colors for the critical and warning 
 $tableDescription = " 
 </table><br><table width='20%'> 
 <tr bgcolor='White'> 
    <td width='10%' align='center' bgcolor='#FBB917'>Warning less than 15% free space</td> 
 <td width='10%' align='center' bgcolor='#FF0000'>Critical less than 10% free space</td> 
 </tr> 
" 
  Add-Content $diskReport $tableDescription 
 Add-Content $diskReport "</body></html>" 

# Send Notification if alert $i is greater then 0 
if ($i -gt 0) 
{ 
    foreach ($user in $users) 
{ 
        Write-Host "Sending Email notification to $user" 

  $smtpServer = "MySMTPServer" 
  $smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
  $msg = New-Object Net.Mail.MailMessage 
  $msg.To.Add($user) 
        $msg.From = "[email protected]" 
  $msg.Subject = "Environment DiskSpace Report for $titledate" 
        $msg.IsBodyHTML = $true 
        $msg.Body = get-content $diskReport 
  $smtp.Send($msg) 
        $body = "" 
    } 
  } 
Sameeksha Kumari
quelle
-1

Ich habe das Skript repariert. Erstellen Sie einfach eine Textdatei mit dem Namen server.txt und geben Sie die IP-Adresse oder die Servernamen an. Anschließend können Sie das folgende Skript ausführen

Get-Content server.txt | für jedes Objekt {Get-WmiObject -ComputerName 192.168.22.208 win32_logicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}

Grüße, Luis.

Luis Guzman
quelle
Dies ist nicht wirklich eine Antwort auf den ursprünglichen Beitrag, sondern eine Korrektur für eine Antwort. Außerdem verwenden Sie im Code eine feste IP-Adresse anstelle des Werts, der aus der Datei server.txt extrahiert wurde.
John aka hot2use
-1

Get-Content server.txt | für jedes Objekt {Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}

Tilak Pawar
quelle
Ich verstehe es nicht.
Pierre.Vriens