Définition des alertes d'espace disque faible sur Windows Server 2008


29

Je me demandais s'il y avait un moyen facile de déclencher une alerte par e-mail sur Windows Server 2008 lorsque les partitions de disque logique manquent d'espace. J'ai 2 serveurs SQL qui ont failli manquer d'espace disque à cause des fichiers journaux DB.

Merci, Ryan


1
Si vous n'avez pas besoin de conserver les journaux complets pendant une période de temps significative, définissez les bases de données avec les plus grands journaux en mode de sauvegarde `` Simple '' et demandez à votre plan de maintenance de les tronquer immédiatement après une sauvegarde complète. Cela ne répond pas à votre question, bien sûr, mais peut aider à empêcher le lecteur de saturer en premier lieu si votre situation le permet.
Justin Scott

Merci pour l'info. J'ai mis en œuvre un travail de sauvegarde supplémentaire pour aider à tronquer les fichiers journaux SQL et à les empêcher de s'agrandir. Mais je voudrais mettre une sorte d'alerte en place au cas où. Merci.
rmwetmore

Nous utilisons Spiceworks pour nous alerter de l'espace disque insuffisant sur tous les clients et serveurs.

Réponses:


37

Un moyen simple pour que Windows Server 2008 envoie des alertes par courrier électronique à faible espace disque consiste à utiliser le Planificateur de tâches et le journal système. Si l'espace libre tombe en dessous du pourcentage spécifié dans HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , un événement est enregistré dans le journal système qui peut déclencher une tâche pour envoyer un message électronique.

  1. Ouvrez le Planificateur de tâches et créez une nouvelle tâche.
  2. Saisissez un nom pour la tâche, sélectionnez «Exécuter si l'utilisateur est connecté ou non» et cochez «Ne pas stocker le mot de passe».
  3. Ajoutez un nouveau déclencheur dans l'onglet Déclencheurs.
  4. Sélectionnez "Sur un événement" dans la case "Commencer la tâche".
  5. Définissez le journal sur "Système", la source sur "srv" et l'ID d'événement sur "2013".
  6. Ajoutez une nouvelle action dans l'onglet Actions.
  7. Réglez Action sur "Envoyer un e-mail" et remplissez correctement les autres paramètres.
  8. Pour configurer le moment où l'événement d'espace disque faible est enregistré dans le journal système, ouvrez l'Éditeur du Registre, accédez à HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters et ajoutez une valeur DWORD nommée «DiskSpaceThreshold», en la définissant sur le pourcentage souhaité. Lorsque l'entrée n'existe pas, la valeur par défaut est 10.

6
Est-ce que cela se déclenche uniquement pour le lecteur système (généralement le lecteur C)? Que faire si j'ai 2-3 pilotes et que je veux configurer une alerte sur chacun d'eux.
Ved

L'événement 2013 est enregistré pour toute partition qui tombe en dessous du seuil défini - notez qu'il n'est enregistré qu'une fois par partition, sauf si l'espace disque repasse au-dessus du seuil ou si le serveur est redémarré. support.microsoft.com/kb/112509
paulH

2
Dans les versions plus récentes de Windows Server, l'action "Envoyer un e-mail" est déconseillée. Au lieu de cela, vous pouvez utiliser l'action "Démarrer un programme", remplissez powershellle programme et les éléments suivants pour les arguments:-command &{send-mailmessage -from server@domain.org -to notify@domain.com -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}
Baodad

1

J'ai ajouté la surveillance de l'espace disque via snmp à mon instance (séparée) de nagios.


Nous avons également la surveillance des disques dans le cadre de notre package de surveillance générale, bien que nous utilisions IPMonitor qui vérifie les disques toutes les quelques minutes.
Justin Scott

En ce moment, je cherche un système de surveillance séparé (comme IPMonitor), mais je voudrais mettre quelque chose en place sur les serveurs pour m'alerter en attendant. Merci.
rmwetmore

1

Pourquoi n'exécutez-vous pas un script powershell comme tâche de planification tous les jours? Si le script trouve que l'espace libre du disque est inférieur à 10%, il vous enverra un e-mail ou une notification.

voici un exemple de code pour vérifier l'espace libre des disques:

Get-Content ForEach-Object {$ ; Get-WMIObject –nomordinateur $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}


1
Ce script ne fonctionne pas. J'obtiens le message d'erreur qu'aucun paramètre de position n'est défini.
Raffael Luthiger

1

Les deux exemples ne fonctionnent pas en raison d'une syntaxe PowerShell incorrecte. Le code suivant répertorie les tailles de volume de l'hôte actuel (à l'aide de PowerShell 5.0):

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

Le code suivant répertorie les tailles de volume des hôtes répertoriés dans server.txt :

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

Sidenote

Notez que l'espace $_réservé externe énumère les adresses de serveur tandis que l'espace $_réservé interne énumère les périphériques. C'est un piège fréquent pour les débutants PowerShell. Si vous souhaitez utiliser l'adresse du serveur dans la boucle interne, vous devez l'assigner à une nouvelle variable dans la boucle externe.

Le logiciel de forum utilisé ici est défectueux. Dans les aperçus de publication, il s'affiche $_correctement comme un $_code, même s'il n'est pas échappé. Mais la publication finale supprime le trait de soulignement, ce qui rend les exemples PowerShell incorrects.


Je peux voir l'espace disque restant à l'aide de la première commande: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }mais étant un débutant PS, je ne comprends pas très bien quelle serait la prochaine étape pour automatiser cela (par exemple, comment prendrait-on la sortie de la première commande et si le le lecteur était en dessous d'un certain seuil d'espace, connectez une commande PS pour envoyer et envoyer un courrier électronique. Je vois que le courrier électronique peut être envoyé à partir d'un message par boadad ci-dessus en utilisant, -command &{send-mailmessage ...mais je ne sais pas comment câbler le vôtre avec une logique qui dicte que l'espace est faible, le courrier doit être envoyé Thx.
Jeff Mergler

0

Vous pouvez utiliser ce script pour envoyer un e-mail à l'aide de votre serveur de messagerie. Remplacez simplement le nom du serveur smtp par celui de votre serveur. Si sur la même machine, utilisez "localhost" (le serveur smtp doit être fonctionnel). Le script se trouve également ici: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Une fois le script enregistré sur le disque local, il peut être facilement exécuté à l'aide de PowerShell et testé. Une fois que le script semble fonctionner correctement, il peut être planifié pour s'exécuter tous les jours ou toutes les heures en fonction des besoins à l'aide du planificateur de tâches Windows. Cet article explique comment exécuter un script à l'aide du planificateur de tâches. 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 = "YourDistrolist@company.com" 
    #$users = "You@company.com" # I use this for testing by uing my email address. 
  #$users = "you@company.com", "manager@company.com", "etc@company.com";  # 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 = "myself@company.com" 
  $msg.Subject = "Environment DiskSpace Report for $titledate" 
        $msg.IsBodyHTML = $true 
        $msg.Body = get-content $diskReport 
  $smtp.Send($msg) 
        $body = "" 
    } 
  } 

-1

J'ai corrigé le script. Il suffit de créer un fichier texte nommé par exemple server.txt et d'inclure l'adresse IP ou les noms de serveurs et vous pouvez ensuite exécuter le script suivant

Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName 192.168.22.208 win32_logicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}

Cordialement, Luis.


Ce n'est pas vraiment une réponse à la publication d'origine, mais une correction à une réponse. En outre, vous utilisez une adresse IP fixe dans le code au lieu de la valeur extraite du fichier server.txt.
John aka hot2use

-1

Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}


Je ne comprends pas.
Pierre.Vriens
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.