Definindo alertas de pouco espaço em disco no Windows Server 2008

29

Eu queria saber se existe uma maneira fácil de acionar um alerta de email no Windows Server 2008 quando qualquer partição de disco lógico ficar com pouco espaço. Eu tenho 2 servidores SQL que estão quase sem espaço em disco devido aos arquivos de log do banco de dados.

Obrigado Ryan

rmwetmore
fonte
1
Se você não precisar manter os logs completos por um período de tempo significativo, configure os bancos de dados com os maiores logs para o modo de backup 'Simples' e faça com que seu plano de manutenção os trunque imediatamente após a conclusão de um backup completo. Isso não responde à sua pergunta, é claro, mas pode ajudar a impedir que a unidade fique cheia em primeiro lugar, se sua situação permitir.
Justin Scott
Obrigado pela informação. Eu implementei uma tarefa de backup extra para ajudar a truncar os arquivos de log SQL e impedir que eles aumentassem. Mas eu gostaria de colocar algum tipo de alerta para o caso. Obrigado.
precisa saber é o seguinte
Usamos o Spiceworks para nos alertar sobre o pouco espaço em disco em todos os clientes e servidores.

Respostas:

37

Uma maneira simples de fazer com que o Windows Server 2008 envie alertas por email com pouco espaço em disco é usar o Agendador de Tarefas e o Log do Sistema. Se o espaço livre ficar abaixo da porcentagem especificada em HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , um evento será registrado no log do sistema que pode acionar uma tarefa para enviar uma mensagem de email.

  1. Abra o Agendador de tarefas e crie uma nova tarefa.
  2. Digite um nome para a tarefa, selecione "Executar se o usuário estiver conectado ou não" e marque "Não armazenar senha".
  3. Adicione um novo gatilho na guia Triggers.
  4. Selecione "Em um evento" na caixa "Iniciar a tarefa".
  5. Defina Log como "Sistema", Origem como "srv" e Identificação do evento como "2013".
  6. Adicione uma nova ação na guia Ações.
  7. Defina Ação como "Enviar um email" e preencha o restante das configurações adequadamente.
  8. Para configurar quando o evento com pouco espaço em disco é registrado no log do sistema, abra o Editor do Registro, navegue até HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters e adicione um valor DWORD chamado “DiskSpaceThreshold”, configurando-o para a porcentagem desejada. Quando a entrada não existe, o valor padrão é 10.
Mark Pettibone
fonte
6
Isso é acionado apenas para a unidade do sistema (geralmente a unidade C)? E se eu tiver 2-3 drivers e desejar configurar o alerta em cada um deles.
Ved
O evento 2013 é registrado para qualquer partição que fica abaixo do limite definido - observe que ele é registrado apenas uma vez por partição, a menos que o espaço em disco volte a aumentar acima do limite ou o servidor seja reinicializado. support.microsoft.com/kb/112509
PaulH
2
Nas versões mais recentes do servidor Windows, a ação "Enviar um email" foi preterida. Em vez disso, você pode usar a ação "Iniciar um programa", preencher powershello programa e o seguinte para obter argumentos:-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}
Baodad
1

Adicionei monitoramento de espaço em disco via snmp à minha instância (separada) do nagios.

David Mackintosh
fonte
Também temos o monitoramento de disco como parte de nosso pacote de monitoramento geral, embora utilizemos o IPMonitor, que elimina os discos a cada poucos minutos.
23810 Justin Scott
No momento, estou procurando um sistema de monitoramento separado (como o IPMonitor), mas gostaria de colocar algo nos servidores para me alertar enquanto isso. Obrigado.
precisa saber é o seguinte
1

Por que você não executa um script do PowerShell como uma tarefa de agendamento todos os dias? Se o script descobrir que o espaço livre do disco é inferior a 10%, ele enviará um email ou notificação.

Aqui está um código de exemplo para verificar o espaço livre dos discos:

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

sky100
fonte
1
Este script não funciona. Recebo a mensagem de erro de que nenhum parâmetro de posição está definido.
Raffael Luthiger
1

Ambos os exemplos não funcionam devido à sintaxe incorreta do PowerShell. O código a seguir lista os tamanhos de volume do host atual (usando o PowerShell 5.0):

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

O código a seguir lista os tamanhos de volume dos hosts listados em server.txt :

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

Nota

Observe que o espaço reservado externo $_enumera os endereços do servidor, enquanto o espaço reservado interno $_enumera os dispositivos. Essa é uma tarefa frequente para iniciantes no PowerShell. Se você quiser usar o endereço do servidor no loop interno, precisará atribuí-lo a uma nova variável no loop externo.

O software do fórum usado aqui é falho. Nas pré-visualizações de post, ele é exibido $_corretamente como um $_código mesmo que não seja escapado. Mas a postagem final remove o sublinhado, tornando os exemplos do PowerShell incorretos.

Frank Heimes
fonte
Consigo ver o espaço restante na unidade usando o primeiro comando: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }mas sendo um novato em PS, não entendo bem qual seria o próximo passo para automatizar isso (exemplo: como tirar a saída do primeiro comando e se o comando a unidade estava abaixo de algum limite de espaço, conecte um comando PS para enviar e enviar por e-mail.Vejo que o e-mail pode ser enviado de uma postagem pelo boadad acima usando, -command &{send-mailmessage ...mas sem saber como conectar o seu à lógica que determina que o espaço é baixo, o e-mail precisa ser enviado Thx.
Jeff Mergler
0

Você pode usar esse script para enviar um email usando seu servidor de email. Apenas substitua o nome do servidor smtp pelo nome do seu servidor. Se na mesma máquina, use "localhost" (o servidor smtp deve estar funcional). O script também se encontra aqui: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Depois que o script é salvo na unidade local, ele pode ser executado facilmente usando o powershell e testado. Quando o script parece funcionar bem, pode ser agendado para ser executado todos os dias ou a cada hora, com base nos requisitos, usando o agendador de tarefas do Windows. Este artigo explica como executar um script usando o agendador de tarefas. 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
fonte
-1

Eu corrigi o script. Basta criar um arquivo de texto chamado por exemplo server.txt e incluir o endereço IP ou servernames e, em seguida, você pode executar o seguinte script

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

Atenciosamente, Luis.

Luis Guzman
fonte
Esta não é realmente uma resposta para a postagem original, mas uma correção para uma resposta. Além disso, você está usando um endereço IP fixo no código, em vez do valor extraído do arquivo server.txt.
John aka hot2use
-1

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

Tilak Pawar
fonte
Eu não entendo.
precisa saber é o seguinte