Налаштування сповіщень про мало дискового простору на Windows Server 2008


29

Мені було цікаво, чи є простий спосіб викликати сповіщення електронної пошти на Windows Server 2008, коли будь-які розділи логічного диска стають мало місця. У мене є 2 SQL-сервери, які через файли журналу DB наблизилися до місця на диску.

Спасибі, Райан


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 \ Параметри та додайте значення DWORD під назвою "DiskSpaceThreshold", встановивши його на потрібний відсоток. Якщо запис не існує, значення за замовчуванням дорівнює 10.

6
Це спрацьовує лише для системного накопичувача (зазвичай це диск C)? Що робити, якщо у мене є 2-3 драйвери, і я хочу налаштувати попередження про кожен з них.
Вед

Подія 2013 реєструється для будь-якого розділу, який опускається нижче визначеного порогу - зауважте, що він реєструється лише один раз на розділ, якщо тільки дисковий простір не збільшується вище порогового значення або сервер не перезавантажується. support.microsoft.com/kb/112509
понеділок

2
У нових версіях Windows-сервера дія "Надіслати електронну пошту" застаріла. Натомість ви можете скористатися дією "Почати програму", заповнити 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}
Baodad

1

Я додав моніторинг простору диска через snmp до мого (окремого) екземпляра nagios.


Моніторинг дисків також є частиною нашого загального пакета моніторингу, хоча ми використовуємо IPMonitor, який перевіряє диски кожні кілька хвилин.
Джастін Скотт

Зараз я переглядаю окрему систему моніторингу (наприклад, IPMonitor), але хотів би покласти щось на місце на серверах, щоб тим часом попередити мене. Спасибі.
rmwetmore

1

Чому ви не запускаєте скрипт powerhell як завдання розкладу щодня? Якщо у сценарію знайдеться вільний простір диска нижче 10%, він надішле вам електронний лист або повідомлення.

ось приклад коду для перевірки вільного простору дисків:

Get-Content ForEach-Object {$ ; Get-WMIObject –комп'ютер $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1 Гб}}


1
Цей сценарій не працює. Я отримую повідомлення про помилку, що не встановлено жодного параметра позиції.
Раффаель Лютігер

1

Обидва приклади не працюють через неправильний синтаксис PowerShell. У наведеному нижче коді перераховані розміри гучності поточного хоста (використовуючи PowerShell 5.0):

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

У наведеному нижче коді перераховані розміри хостів, перелічені в сервері.txt :

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

Sidenote

Зауважте, що зовнішній власник місця $_перераховує адреси сервера, тоді як внутрішній власник місця $_перераховує пристрої. Це часті випадки для новачків 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 / 1 Гб}}

З повагою, Луїс.


Це насправді не відповідь на оригінальну публікацію, а виправлення відповіді. Крім того, ви використовуєте в коді фіксовану IP-адресу замість значення, вилученого з файлу server.txt.
Джон ака hot2use

-1

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


Я не розумію.
Pierre.Vriens
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.