PowerShell: avíseme cuando el espacio en disco se esté agotando en mis servidores Windows (notificación por correo electrónico)
Sin duda, debes vigilar el espacio en disco de tus servidores. He visto muchos servidores fallar debido a la pérdida de espacio en disco con el tiempo, al guardar más y más archivos y datos o debido a las actualizaciones de Windows. Ejecutaban Exchange, SQL, AD y todos eran servidores importantes con software crucial. Si actualmente no está monitoreando los espacios libres en disco y no tiene a mano una herramienta empresarial como SCCM, entonces este artículo es para usted. Todo lo hacemos con PowerShell, ¿qué más? Entremos.
Como se mencionó, el objetivo es implementar una solución de monitoreo para monitorear todos los servidores Windows. Para lograr esto, necesitamos un par de cosas:
- Todo Windows Server por nombre (mejor con un entorno de Active Directory limpio, sin cuentas de computadora huérfanas)
- Un bucle foreach con Get-WmiObject win32_logicdisk para obtener espacio libre en disco de todos los servidores
- Una declaración if en el bucle para recibir notificaciones solo de servidores con poco espacio en disco
- Configuración de correo electrónico (tal vez con una contraseña, asegúrese de que me ocuparé de este problema y le brindaré una solución)
La meta
Definir el objetivo es fácil. Queremos recibir un correo electrónico cuando uno de los servidores se esté ejecutando con poco espacio en el disco. El correo electrónico debería verse así:
La secuencia de comandos
El siguiente script le avisa si uno de sus servidores tiene menos del 10 % de espacio en disco.
### Getting all domain-joined Server by Names
$servers=(Get-ADComputer -Filter 'operatingsystem -like "*server*"').Name
### Get only DriveType 3 (Local Disks) foreach Server
ForEach ($s in $servers)
{$Report=Get-WmiObject win32_logicaldisk -ComputerName $s -Filter "Drivetype=3" -ErrorAction SilentlyContinue | Where-Object {($_.freespace/$_.size) -le '0.1'}
$View=($Report.DeviceID -join ",").Replace(":","")
### Send Mail if $Report (<=10%) is true
If ($Report)
{
$EmailTo = "p.gruenauer@domain.xy"
$EmailFrom = "alert@domain.xy"
$user = 'p.gruenauer@domain.xy'
$password = Unprotect-CmsMessage -Path C:\Temp\pw.txt
$Subject = "Alert: PowerShell Storage Report of $s"
$Body = "Server $s storage space has dropped to less than 10 % on $View"
$SMTPServer = "smtp.domain.xy"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($user, $password)
$SMTPClient.Send($SMTPMessage)
}
}
Tienes que editar las líneas 17,18,19,20 y 23 según tus necesidades.
La línea 20 es muy interesante. Para enviar un correo electrónico, normalmente deberá autenticar su cuenta en el servidor de correo electrónico. Esto también significa que la contraseña debe guardarse en su secuencia de comandos. Para evitar esto, cifre el archivo de contraseña como se describe aquí PowerShell: cifrar y descifrar datos mediante certificados (clave pública/clave privada)
Unprotect-CmsMessage descifra el contenido del archivo. Recuerde que, con suerte, usted es el único que tiene la clave privada y, por lo tanto, es el único en este planeta que puede descifrar el archivo de contraseña.
Si le gusta, cópielo en su sesión de PowerShell ISE y guárdelo como C:\PowerShell\alert_diskspace.ps1.
Crear una tarea programada
Finalmente, resumiremos nuestro script en una tarea programada que se ejecuta todos los días.
Las líneas siguientes crean una tarea programada que ejecuta C:\PowerShell\alert_diskspace.ps1 una vez al día (08:00 a. m.).
Es posible que desee editar la ruta del archivo en la línea 1 y deba modificar el ID de usuario en la línea 4.
$Action=New-ScheduledTaskAction -Execute "powershell" -Argument "C:\PowerShell\alert_diskspace.ps1"
$Trigger=New-ScheduledTaskTrigger -Daily -At 08am
$Set=New-ScheduledTaskSettingsSet
$Principal=New-ScheduledTaskPrincipal -UserId "sid-500\patrick" -LogonType S4U
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Set -Principal $Principal -Description "Checks free disk space on all Servers. Sends an E-Mail notification if storage drops below 10%"
Register-ScheduledTask -TaskName "Free Disk Space Check" -InputObject $Task -User "sid-500\patrick" -Password (Read-Host 'Enter Password') -Force
Eso es todo. Sus servidores están monitoreados.
¡Nos vemos la próxima vez con PowerShell nuevamente!
