Настройка предупреждений о недостаточном дисковом пространстве в Windows Server 2008

29

Мне было интересно, есть ли простой способ вызвать оповещение по электронной почте в Windows Server 2008, когда на любом разделе логического диска становится мало места. У меня есть 2 сервера SQL, которые почти закончили из-за файлов журнала БД.

Спасибо Райан

rmwetmore
источник
1
Если вам не нужно хранить полные журналы в течение какого-либо значительного периода времени, установите для баз данных с самыми большими журналами режим «Простое» резервное копирование, и ваш план обслуживания урезает их сразу после завершения полного резервного копирования. Конечно, это не отвечает на ваш вопрос, но может помочь в первую очередь предотвратить переполнение диска, если ваша ситуация это позволяет.
Джастин Скотт
Спасибо за информацию. Я реализовал дополнительное задание резервного копирования, чтобы помочь обрезать файлы журнала SQL и не допустить их увеличения. Но я бы хотел поставить какое-то предупреждение на всякий случай. Спасибо.
rmwetmore
Мы используем Spiceworks, чтобы предупредить нас о нехватке дискового пространства на всех клиентах и ​​серверах.

Ответы:

37

Один простой способ заставить Windows Server 2008 отправлять оповещения по электронной почте о нехватке места на диске - это использовать планировщик задач и системный журнал. Если свободное пространство падает ниже процента, указанного в HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , в системном журнале записывается событие, которое может вызвать задачу для отправки сообщения электронной почты.

  1. Откройте планировщик заданий и создайте новое задание.
  2. Введите имя для задачи, выберите «Запускать независимо от того, вошел пользователь в систему или нет» и установите флажок «Не хранить пароль».
  3. Добавьте новый триггер на вкладке Триггеры.
  4. Выберите «По событию» в поле «Начать задачу».
  5. Установите для журнала значение «Система», для источника значение «srv» и для идентификатора события «2013».
  6. Добавьте новое действие на вкладке Действия.
  7. Установите для параметра «Отправить сообщение» и заполните остальные параметры соответствующим образом.
  8. Чтобы настроить, когда событие о нехватке места на диске записывается в системном журнале, откройте редактор реестра, перейдите к HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters и добавьте значение DWORD с именем «DiskSpaceThreshold», задав для него желаемый процент. Если запись не существует, значением по умолчанию является 10.
Марк Петтибон
источник
6
Это срабатывает только для системного диска (обычно диска C)? Что делать, если у меня 2-3 драйвера, и я хочу настроить оповещение для каждого из них.
Вед
Событие 2013 регистрируется для любого раздела, который падает ниже определенного порогового значения. Обратите внимание, что оно регистрируется только один раз для каждого раздела, если только дисковое пространство не превысило пороговое значение или сервер не был перезагружен. support.microsoft.com/kb/112509
Пол
2
В более новых версиях Windows Server действие «Отправить электронную почту» устарело. Вместо этого вы можете использовать действие «Запустить программу», заполнить powershellпрограмму и -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}
указать
1

Я добавил мониторинг дискового пространства через snmp в мой (отдельный) экземпляр nagios.

Дэвид Макинтош
источник
Мониторинг дисков также входит в наш общий пакет мониторинга, хотя мы используем IPMonitor, который проверяет диски каждые несколько минут.
Джастин Скотт
Прямо сейчас я изучаю отдельную систему мониторинга (например, IPMonitor), но я хотел бы разместить что-то на серверах, чтобы предупредить меня. Спасибо.
rmwetmore
1

Почему бы вам не запускать скрипт powershell как задачу по расписанию каждый день? Если скрипт обнаружит, что свободное место на диске меньше 10%, он отправит вам электронное письмо или уведомление.

Вот пример кода для проверки свободного места на дисках:

Get-Content ForEach-Object {$ ; Get-WMIObject - имя_компьютера $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}

sky100
источник
1
Этот скрипт не работает. Я получаю сообщение об ошибке, что параметр позиции не установлен.
Раффаэль Лютигер
1

Оба примера не работают из-за неправильного синтаксиса PowerShell. В следующем коде перечислены размеры томов текущего хоста (с помощью PowerShell 5.0):

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

В следующем коде перечислены размеры томов хостов, перечисленных в server.txt :

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

Примечание

Обратите внимание, что внешний заполнитель $_перечисляет адреса сервера, тогда как внутренний заполнитель $_перечисляет устройства. Это частая ошибка для новичков в PowerShell. Если вы хотите использовать адрес сервера во внутреннем цикле, вам нужно будет присвоить его новой переменной во внешнем цикле.

Программное обеспечение форума, используемое здесь, имеет недостатки. В предварительном просмотре он отображается $_правильно, $_даже если не экранирован как код. Но последний пост удаляет подчеркивание, что делает примеры PowerShell некорректными.

Фрэнк Хаймс
источник
Я могу видеть, как остается свободное место на диске, используя первую команду: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }но, будучи новичком PS, я не совсем понимаю, каким будет следующий шаг, чтобы автоматизировать это (например, как взять вывод из первой команды, и если диск был ниже некоторого пробела, подключите команду PS для отправки и отправки электронной почты. Я вижу, что электронная почта может быть отправлена ​​с поста вышеупомянутым boadad, используя, -command &{send-mailmessage ...но не знаю, как связать вашу логику, которая требует, чтобы места было мало, нужно отправлять почту Thx.
Джефф Мерглер
0

Вы можете использовать этот скрипт, чтобы отправить электронное письмо на ваш почтовый сервер. Просто замените имя сервера SMTP на имя вашего сервера. Если на той же машине используется localhost (сервер smtp должен быть работоспособен). Сценарий также находится здесь: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

После сохранения сценария на локальном диске его можно легко запустить с помощью powershell и протестировать. Если сценарий работает нормально, его можно запускать каждый день или каждый час в зависимости от требований с помощью планировщика задач Windows. В этой статье объясняется, как запустить скрипт с помощью планировщика задач. 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

Я исправил сценарий. Просто создайте текстовый файл с именем, например, server.txt и включите IP-адрес или имя сервера, а затем вы можете выполнить следующий скрипт

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

С уважением, Луис.

Луис Гусман
источник
На самом деле это не ответ на исходное сообщение, а исправление к ответу. Кроме того, вы используете фиксированный IP-адрес в коде вместо значения, извлеченного из файла server.txt.
Джон 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}}

Тилак Павар
источник
Я не понимаю
Pierre.Vriens