Configuración de alertas de poco espacio en disco en Windows Server 2008


29

Me preguntaba si hay una manera fácil de activar una alerta de correo electrónico en Windows Server 2008 cuando las particiones de disco lógico tienen poco espacio. Tengo 2 servidores SQL que están a punto de quedarse sin espacio en disco debido a los archivos de registro de la base de datos.

Gracias Ryan


1
Si no necesita mantener los registros completos durante un período de tiempo significativo, configure las bases de datos con los registros más grandes en el modo de copia de seguridad 'Simple' y haga que su plan de mantenimiento las trunca inmediatamente después de que se realice una copia de seguridad completa. Esto no responde a su pregunta, por supuesto, pero puede ayudar a evitar que la unidad se llene en primer lugar si su situación lo permite.
Justin Scott

Gracias por la info. Implementé un trabajo de copia de seguridad adicional para ayudar a truncar los archivos de registro SQL y evitar que crezcan más. Pero me gustaría poner algún tipo de alerta por si acaso. Gracias.
rmwetmore

Utilizamos Spiceworks para alertarnos de poco espacio en disco en todos los clientes y servidores.

Respuestas:


37

Una forma sencilla de hacer que Windows Server 2008 envíe alertas de correo electrónico con poco espacio en disco es usar el Programador de tareas y el Registro del sistema. Si el espacio libre cae por debajo del porcentaje especificado en HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , se registra un evento en el registro del sistema que puede activar una tarea para enviar un mensaje de correo electrónico.

  1. Abra el Programador de tareas y cree una nueva tarea.
  2. Ingrese un nombre para la tarea, seleccione "Ejecutar si el usuario inició sesión o no", y marque "No almacenar contraseña".
  3. Agregue un nuevo activador en la pestaña Activadores.
  4. Seleccione "En un evento" en el cuadro "Comenzar la tarea".
  5. Establezca Registro en "Sistema", Origen en "srv" e ID de evento en "2013".
  6. Agregue una nueva acción en la pestaña Acciones.
  7. Establezca Acción en "Enviar un correo electrónico" y complete el resto de la configuración de manera adecuada.
  8. Para configurar cuándo se registra el evento de poco espacio en disco en el Registro del sistema, abra el Editor del registro, navegue a HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters y agregue un valor DWORD llamado "DiskSpaceThreshold", configurándolo en el porcentaje deseado. Cuando la entrada no existe, el valor predeterminado es 10.

66
¿Esto solo se dispara para la unidad del sistema (generalmente la unidad C)? ¿Qué pasa si tengo un controlador 2-3 y quiero configurar la alerta en cada uno de ellos?
Ved

El evento 2013 se registra para cualquier partición que esté por debajo del umbral definido; tenga en cuenta que solo se registra una vez por partición, a menos que el espacio en disco vuelva a aumentar por encima del umbral o se reinicie el servidor. support.microsoft.com/kb/112509
paulH

2
En las versiones más recientes del servidor de Windows, la acción "Enviar un correo electrónico" está en desuso. En su lugar, puede utilizar la acción "Iniciar un programa", completar powershellel programa y lo siguiente para los argumentos:-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

Agregué monitoreo de espacio en disco a través de snmp a mi instancia de nagios (separada).


También tenemos monitoreo de disco como parte de nuestro paquete de monitoreo general, aunque usamos IPMonitor que revisa los discos cada pocos minutos.
Justin Scott

En este momento estoy buscando un sistema de monitoreo separado (como IPMonitor), pero me gustaría poner algo en los servidores para alertarme mientras tanto. Gracias.
rmwetmore

1

¿Por qué no ejecuta un script de PowerShell como una tarea programada todos los días? Si el script encuentra que el espacio libre del disco es inferior al 10%, le enviará un correo electrónico o una notificación.

Aquí hay un código de ejemplo para verificar el espacio libre de los discos:

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


1
Este script no funciona. Recibo el mensaje de error de que no hay ningún parámetro de posición establecido
Raffael Luthiger

1

Ambos ejemplos no funcionan debido a la sintaxis incorrecta de PowerShell. El siguiente código enumera los tamaños de volumen del host actual (usando PowerShell 5.0):

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

El siguiente código enumera los tamaños de volumen de los hosts enumerados en server.txt :

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

Nota al margen

Tenga en cuenta que el marcador de lugar externo $_enumera las direcciones del servidor, mientras que el marcador de lugar interno $_enumera los dispositivos. Ese es un problema frecuente para los novatos de PowerShell. Si desea utilizar la dirección del servidor en el bucle interno, debe asignarla a una nueva variable en el bucle externo.

El software del foro utilizado aquí es defectuoso. En las vistas previas de las publicaciones, se muestra $_correctamente como un $_código aunque no se haya escapado. Pero la publicación final elimina el guión bajo, lo que hace que los ejemplos de PowerShell sean incorrectos.


Puedo ver el espacio de la unidad restante usando el primer comando: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }pero como soy un novato de PS, no entiendo cuál sería el siguiente paso para automatizar esto (ejemplo, cómo tomaría la salida del primer comando y si el la unidad estaba por debajo de un umbral de espacio, conecte un comando PS para enviar y enviar un correo electrónico. Veo que Boadad puede enviar un correo electrónico desde una publicación anterior, -command &{send-mailmessage ...pero no estoy seguro de cómo conectar el suyo con una lógica que dicta que el espacio es bajo. Thx.
Jeff Mergler

0

Puede usar este script para enviar un correo electrónico utilizando su servidor de correo electrónico. Simplemente reemplace el nombre del servidor smtp con el de su servidor. Si está en la misma máquina, utilice "localhost" (el servidor smtp debe ser funcional). El script también se encuentra aquí: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Una vez que el script se guarda en la unidad local, se puede ejecutar fácilmente con PowerShell y probarlo. Una vez que el script parece funcionar bien, se puede programar para que se ejecute todos los días o cada hora, según los requisitos, utilizando el programador de tareas de Windows. Este artículo explica cómo ejecutar un script usando el programador de tareas. 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

He arreglado el guión. Simplemente cree un archivo de texto llamado por ejemplo server.txt e incluya la dirección IP o los nombres de servidor y luego puede ejecutar el siguiente script

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

Saludos, Luis.


Esto no es realmente una respuesta a la publicación original, sino una corrección a una respuesta. Además, está utilizando una dirección IP fija en el código en lugar del valor extraído del archivo 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}}


No lo entiendo
Pierre.Vriens
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.