การตั้งค่า Low Disk Space Alerts ใน Windows Server 2008


29

ฉันสงสัยว่าถ้ามีวิธีที่ง่ายในการทริกเกอร์การแจ้งเตือนอีเมลใน Windows Server 2008 เมื่อใดก็ตามที่โลจิคัลพาร์ติชันดิสก์มีเนื้อที่เหลือน้อย ฉันมีเซิร์ฟเวอร์ SQL 2 ตัวที่ใกล้จะหมดพื้นที่ดิสก์เนื่องจากไฟล์บันทึกของ DB

ขอบคุณไรอัน


1
หากคุณไม่จำเป็นต้องเก็บบันทึกการทำงานเต็มรูปแบบไว้เป็นระยะเวลานาน ๆ ให้ตั้งค่าฐานข้อมูลด้วยการบันทึกที่ใหญ่ที่สุดเป็นโหมดการสำรองข้อมูล 'แบบง่าย' และให้แผนการบำรุงรักษาของคุณถูกตัดทิ้งทันทีหลังจากทำการสำรองข้อมูลเต็มรูปแบบ นี่ไม่ได้ตอบคำถามของคุณแน่นอน แต่อาจช่วยป้องกันไม่ให้ไดรฟ์เต็มตัวตั้งแต่แรกถ้าสถานการณ์ของคุณอนุญาต
Justin Scott

ขอบคุณสำหรับข้อมูล. ฉันใช้งานสำรองพิเศษเพื่อช่วยตัดทอนล็อกไฟล์ SQL และป้องกันไม่ให้ไฟล์เหล่านั้นโตขึ้น แต่ฉันต้องการที่จะทำให้การแจ้งเตือนบางอย่างในกรณีที่ ขอบคุณ
rmwetmore

เราใช้ Spiceworks เพื่อแจ้งเตือนเราถึงพื้นที่ดิสก์เหลือน้อยในไคลเอนต์และเซิร์ฟเวอร์ทั้งหมด

คำตอบ:


37

วิธีง่ายๆในการทำให้ Windows Server 2008 ส่งการแจ้งเตือนทางอีเมล์มีพื้นที่ดิสก์เหลือน้อยคือการใช้ Task Scheduler และ System Log หากพื้นที่ว่างต่ำกว่าเปอร์เซ็นต์ที่ระบุใน HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThresholdเหตุการณ์จะถูกบันทึกในบันทึกของระบบที่สามารถเรียกใช้งานเพื่อส่งข้อความอีเมล

  1. เปิด Task Scheduler และสร้างงานใหม่
  2. ป้อนชื่อสำหรับงานเลือก "เรียกใช้ว่าผู้ใช้เข้าสู่ระบบหรือไม่" และตรวจสอบ "อย่าเก็บรหัสผ่าน"
  3. เพิ่มทริกเกอร์ใหม่บนแท็บทริกเกอร์
  4. เลือก "ในเหตุการณ์" ในกล่อง "เริ่มงาน"
  5. ตั้งค่าบันทึกเป็น "ระบบ", แหล่งที่มาเป็น "srv" และรหัสเหตุการณ์เป็น "2013"
  6. เพิ่มการกระทำใหม่ในแท็บการกระทำ
  7. ตั้งค่าการกระทำเป็น "ส่งอีเมล" และกรอกการตั้งค่าที่เหลือให้เหมาะสม
  8. เมื่อต้องการกำหนดค่าเมื่อเหตุการณ์พื้นที่ดิสก์เหลือน้อยในบันทึกระบบให้เปิดตัวแก้ไขรีจิสทรีนำทางไปยัง HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters และเพิ่มค่า DWORD ที่ชื่อว่า“ DiskSpaceThreshold” เพื่อตั้งค่าเป็นเปอร์เซ็นต์ที่ต้องการ เมื่อไม่มีรายการค่าเริ่มต้นคือ 10

6
สิ่งนี้เรียกเฉพาะสำหรับไดรฟ์ระบบ (โดยปกติคือไดรฟ์ C) หรือไม่ จะทำอย่างไรถ้าฉันมีไดรเวอร์ 2-3 ตัวและฉันต้องการตั้งค่าการเตือนในแต่ละรายการ
Ved

เหตุการณ์ 2013 ถูกบันทึกไว้สำหรับพาร์ติชันใด ๆ ที่อยู่ต่ำกว่าขีด จำกัด ที่กำหนดไว้ - โปรดทราบว่าจะถูกบันทึกเพียงครั้งเดียวต่อพาร์ติชั่นเว้นแต่ว่าพื้นที่ดิสก์จะเพิ่มขึ้นกลับมาเหนือขีด จำกัด หรือเซิร์ฟเวอร์ถูกรีบูต support.microsoft.com/kb/112509
paulH

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

ทำไมคุณไม่เรียกใช้สคริปต์ PowerShell เป็นงานกำหนดการทุกวัน? หากสคริปต์พบว่าพื้นที่ว่างของดิสก์ต่ำกว่า 10% สคริปต์จะส่งอีเมลหรือการแจ้งเตือนถึงคุณ

นี่คือตัวอย่างรหัสสำหรับตรวจสอบพื้นที่ว่างของดิสก์:

รับเนื้อหา ForEach-Object {$ ; รับ -WMIObject –computername $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}


1
สคริปต์นี้ไม่ทำงาน ฉันได้รับข้อความแสดงข้อผิดพลาดว่าไม่มีการตั้งค่าพารามิเตอร์ตำแหน่ง
Raffael Luthiger

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 } }

sidenote

โปรดทราบว่าตัวยึดตำแหน่งด้านนอก$_ระบุที่อยู่เซิร์ฟเวอร์ในขณะที่ตัวยึดตำแหน่งด้านใน$_ระบุอุปกรณ์ นั่นเป็น gotcha บ่อยครั้งสำหรับมือใหม่ PowerShell หากคุณต้องการใช้ที่อยู่เซิร์ฟเวอร์ในลูปด้านในคุณจะต้องกำหนดให้กับตัวแปรใหม่ในลูปด้านนอก

ซอฟต์แวร์ฟอรัมที่ใช้ที่นี่มีข้อบกพร่อง ในตัวอย่างการโพสต์มันจะแสดง$_อย่างถูกต้อง$_แม้ว่าจะไม่ได้หลบหนีเป็นรหัส แต่โพสต์สุดท้ายลบขีดล่างดังนั้นจึงทำให้ตัวอย่าง PowerShell ไม่ถูกต้อง


ฉันสามารถดูพื้นที่ไดรฟ์ที่เหลือโดยใช้คำสั่งแรก: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }แต่เป็นมือใหม่ PS ฉันไม่เข้าใจว่าขั้นตอนต่อไปจะเป็นอัตโนมัตินี้ (ตัวอย่างเช่นวิธีหนึ่งจะเอาออกจากคำสั่งแรกและถ้า ไดรฟ์อยู่ต่ำกว่าเกณฑ์พื้นที่บางส่วนต่อสายคำสั่ง PS เพื่อส่งและส่งอีเมลฉันเห็นว่าอีเมลสามารถส่งจากโพสต์โดย boadad ด้านบนโดยใช้-command &{send-mailmessage ...แต่ไม่แน่ใจว่าจะวางสายของคุณด้วยตรรกะที่กำหนดว่าพื้นที่ต่ำ . ขอบคุณ
Jeff Mergler

0

คุณสามารถใช้สคริปต์นี้เพื่อส่งอีเมลโดยใช้เซิร์ฟเวอร์อีเมลของคุณ เพียงแค่แทนที่ชื่อของเซิร์ฟเวอร์ smtp ด้วยชื่อเซิร์ฟเวอร์ของคุณ หากบนเครื่องเดียวกันให้ใช้ "localhost" (เซิร์ฟเวอร์ smtp ต้องใช้งานได้) สคริปต์พบที่นี่เช่นกัน: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

หลังจากบันทึกสคริปต์ในไดรฟ์ในเครื่องแล้วสามารถเรียกใช้ได้อย่างง่ายดายโดยใช้ PowerShell และทดสอบ เมื่อสคริปต์ทำงานได้ดีก็สามารถกำหนดให้ทำงานทุกวันหรือทุกชั่วโมงตามความต้องการโดยใช้ windows task scheduler บทความนี้อธิบายวิธีเรียกใช้สคริปต์โดยใช้ตัวกำหนดตารางเวลางาน 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
John aka hot2use

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.