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
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
Câu trả lời:
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.
powershell
chươ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}
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.
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}}
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 } }
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.
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.
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 = ""
}
}
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.
Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}