Đặt cảnh báo không gian đĩa thấp trên Windows Server 2008


29

Tôi đã tự hỏi liệu có một cách dễ dàng để kích hoạt cảnh báo email trên Windows Server 2008 hay không khi bất kỳ phân vùng đĩa logic nào bị thiếu dung lượng. Tôi có 2 máy chủ SQL sắp hết dung lượng đĩa vì các tệp nhật ký DB.

Cảm ơn, Ryan


1
Nếu bạn không cần giữ nhật ký đầy đủ trong bất kỳ khoảng thời gian đáng kể nào, hãy đặt cơ sở dữ liệu với nhật ký lớn nhất thành chế độ sao lưu 'Đơn giản' và có kế hoạch bảo trì của bạn cắt ngắn chúng ngay lập tức sau khi sao lưu toàn bộ. Điều này không trả lời câu hỏi của bạn, tất nhiên, nhưng có thể giúp giữ cho ổ đĩa không bị đầy ngay từ đầu nếu tình huống của bạn cho phép.
Justin Scott

Cảm ơn bạn về thông tin. Tôi đã thực hiện một công việc sao lưu bổ sung để giúp cắt bớt các tệp nhật ký SQL và giữ cho chúng không phát triển lớn hơn nữa. Nhưng tôi muốn đặt một số loại cảnh báo tại chỗ chỉ trong trường hợp. Cảm ơn.
rmwetmore

Chúng tôi sử dụng Spiceworks để cảnh báo chúng tôi về không gian đĩa thấp trên tất cả các máy khách và máy chủ.

Câu trả lời:


37

Một cách đơn giản để Windows Server 2008 gửi thông báo e-mail dung lượng ổ đĩa thấp là sử dụng Trình lập lịch tác vụ và Nhật ký hệ thống. Nếu không gian trống giảm xuống dưới tỷ lệ phần trăm được chỉ định trong HKLM \ HỆ THỐNG \ CurrentControlset \ Services \ LanmanServer \ Paramameter \ DiskSpaceThrưỡng , một sự kiện được ghi lại trong Nhật ký hệ thống có thể kích hoạt tác vụ để gửi thông điệp email.

  1. Mở Trình lập lịch tác vụ và tạo một tác vụ mới.
  2. Nhập tên cho tác vụ, chọn "Chạy cho dù người dùng có đăng nhập hay không" và kiểm tra "Không lưu trữ mật khẩu."
  3. Thêm một kích hoạt mới trên tab Triggers.
  4. Chọn "Trên một sự kiện" trong hộp "Bắt đầu nhiệm vụ".
  5. Đặt Nhật ký thành "Hệ thống", Nguồn thành "srv" và ID sự kiện thành "2013".
  6. Thêm một hành động mới trên tab Hành động.
  7. Đặt hành động thành "Gửi e-mail" và điền vào phần còn lại của cài đặt một cách thích hợp.
  8. Để định cấu hình khi sự kiện không gian đĩa thấp được ghi lại trong Nhật ký hệ thống, hãy mở Trình chỉnh sửa sổ đăng ký, điều hướng đến HKLM \ HỆ THỐNG Khi mục nhập không tồn tại, giá trị mặc định là 10.

6
Có phải điều này chỉ kích hoạt cho ổ đĩa hệ thống (thường là ổ đĩa C)? Điều gì sẽ xảy ra nếu tôi có 2-3 trình điều khiển và tôi muốn thiết lập cảnh báo cho mỗi người trong số họ.
Ved

Sự kiện 2013 được ghi lại cho bất kỳ phân vùng nào nằm dưới ngưỡng xác định - lưu ý rằng nó chỉ được ghi lại một lần cho mỗi phân vùng, trừ khi không gian đĩa tăng trở lại trên ngưỡng hoặc máy chủ được khởi động lại. support.microsoft.com/kb/112509
paulH

2
Trong các phiên bản mới hơn của máy chủ windows, hành động "Gửi e-mail" không được chấp nhận. Thay vào đó, bạn có thể sử dụng hành động "Bắt đầu một chương trình", điền vào powershellchương trình và các mục sau đây cho các đối số:-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

Tôi đã thêm giám sát không gian đĩa thông qua snmp vào ví dụ nagios (riêng) của tôi.


Chúng tôi cũng có giám sát đĩa như một phần của gói giám sát chung, mặc dù chúng tôi sử dụng IPMonitor để cổ vũ các đĩa cứ sau vài phút.
Justin Scott

Ngay bây giờ tôi đang xem xét một hệ thống giám sát riêng (như IPMonitor), nhưng tôi muốn đặt một cái gì đó vào vị trí trên các máy chủ để cảnh báo tôi trong lúc này. Cảm ơn.
rmwetmore

1

Tại sao bạn không chạy một kịch bản powershell như một nhiệm vụ lịch trình mỗi ngày? Nếu tập lệnh tìm không gian trống của đĩa thấp hơn 10%, nó sẽ gửi cho bạn một email hoặc thông báo.

đây là mã ví dụ để kiểm tra dung lượng trống của các đĩa:

Nhận nội dung ForEach-Object {$ ; Tên người dùng Get-WMIObject $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}


1
Kịch bản này không hoạt động. Tôi nhận được thông báo lỗi rằng không có tham số vị trí nào được đặt.
Raffael Luthiger

1

Cả hai ví dụ đều không hoạt động do cú pháp PowerShell không chính xác. Đoạn mã sau liệt kê kích thước âm lượng của máy chủ hiện tại (sử dụng PowerShell 5.0):

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

Đoạn mã sau liệt kê kích thước âm lượng của máy chủ được liệt kê trong server.txt :

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

Sidenote

Lưu ý rằng người giữ vị trí bên ngoài $_liệt kê các địa chỉ máy chủ trong khi người giữ vị trí bên trong $_liệt kê các thiết bị. Đó là một vấn đề thường xuyên đối với người mới sử dụng PowerShell. Nếu bạn muốn sử dụng địa chỉ máy chủ trong vòng lặp bên trong, bạn phải gán nó cho một biến mới trong vòng lặp bên ngoài.

Các phần mềm diễn đàn được sử dụng ở đây là thiếu sót. Trong phần xem trước bài đăng, nó hiển thị $_chính xác $_ngay cả khi không thoát dưới dạng mã. Nhưng bài đăng cuối cùng sẽ loại bỏ dấu gạch dưới, do đó làm cho các ví dụ PowerShell không chính xác.


Tôi có thể thấy dung lượng ổ đĩa còn lại bằng lệnh đầu tiên: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }nhưng là một người mới chơi PS, tôi hoàn toàn không hiểu bước tiếp theo sẽ là gì để tự động hóa điều này (ví dụ, làm thế nào để lấy đầu ra từ lệnh đầu tiên và nếu ổ đĩa nằm dưới ngưỡng không gian, nối một lệnh PS để gửi và gửi email. Tôi thấy rằng email có thể được gửi từ một bài đăng bằng cách tải về phía trên bằng cách sử dụng -command &{send-mailmessage ...nhưng không chắc chắn làm thế nào để nối dây của bạn với logic mà ra lệnh rằng không gian cần gửi thư thấp Thx.
Jeff Mergler

0

Bạn có thể sử dụng tập lệnh này để gửi email bằng máy chủ email của bạn. Chỉ cần thay thế tên của máy chủ smtp bằng tên của máy chủ của bạn. Nếu trên cùng một máy thì sử dụng "localhost" (máy chủ smtp phải hoạt động). Kịch bản cũng được tìm thấy ở đây: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Sau khi tập lệnh được lưu trong ổ đĩa cục bộ, nó có thể dễ dàng chạy bằng powershell và được kiểm tra. Khi tập lệnh dường như hoạt động tốt, thì nó có thể được lên lịch để chạy hàng ngày hoặc mỗi giờ dựa trên yêu cầu sử dụng bộ lập lịch tác vụ của windows. Bài viết này giải thích cách chạy tập lệnh bằng cách sử dụng bộ lập lịch tác vụ. https://www.metalogix.com/help/Content%20Matrix%20Console/SharePoint%20Edition/002_HowTo/004_SharePointActions/012

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

Tôi đã sửa kịch bản. Chỉ cần tạo một tệp văn bản có tên là server.txt và bao gồm địa chỉ IP hoặc tên máy chủ và sau đó bạn có thể thực thi đoạn mã sau

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

Trân trọng, Luis.


Đây không thực sự là một câu trả lời cho bài viết gốc, mà là một sự điều chỉnh cho một câu trả lời. Ngoài ra, bạn đang sử dụng một địa chỉ IP cố định trong mã thay vì giá trị được trích xuất từ ​​tệp server.txt.
John 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}}


Tôi không hiểu
Pierre.Vriens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.