ฉันสงสัยว่าถ้ามีวิธีที่ง่ายในการทริกเกอร์การแจ้งเตือนอีเมลใน Windows Server 2008 เมื่อใดก็ตามที่โลจิคัลพาร์ติชันดิสก์มีเนื้อที่เหลือน้อย ฉันมีเซิร์ฟเวอร์ SQL 2 ตัวที่ใกล้จะหมดพื้นที่ดิสก์เนื่องจากไฟล์บันทึกของ DB
ขอบคุณไรอัน
ฉันสงสัยว่าถ้ามีวิธีที่ง่ายในการทริกเกอร์การแจ้งเตือนอีเมลใน Windows Server 2008 เมื่อใดก็ตามที่โลจิคัลพาร์ติชันดิสก์มีเนื้อที่เหลือน้อย ฉันมีเซิร์ฟเวอร์ SQL 2 ตัวที่ใกล้จะหมดพื้นที่ดิสก์เนื่องจากไฟล์บันทึกของ DB
ขอบคุณไรอัน
คำตอบ:
วิธีง่ายๆในการทำให้ Windows Server 2008 ส่งการแจ้งเตือนทางอีเมล์มีพื้นที่ดิสก์เหลือน้อยคือการใช้ Task Scheduler และ System Log หากพื้นที่ว่างต่ำกว่าเปอร์เซ็นต์ที่ระบุใน HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThresholdเหตุการณ์จะถูกบันทึกในบันทึกของระบบที่สามารถเรียกใช้งานเพื่อส่งข้อความอีเมล
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}
ฉันเพิ่มการตรวจสอบพื้นที่ดิสก์ผ่าน snmp ไปยังอินสแตนซ์ของ nagios (แยกต่างหาก) ของฉัน
ทำไมคุณไม่เรียกใช้สคริปต์ PowerShell เป็นงานกำหนดการทุกวัน? หากสคริปต์พบว่าพื้นที่ว่างของดิสก์ต่ำกว่า 10% สคริปต์จะส่งอีเมลหรือการแจ้งเตือนถึงคุณ
นี่คือตัวอย่างรหัสสำหรับตรวจสอบพื้นที่ว่างของดิสก์:
รับเนื้อหา ForEach-Object {$ ; รับ -WMIObject –computername $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
ตัวอย่างทั้งสองไม่ทำงานเนื่องจากไวยากรณ์ของ 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 } }
โปรดทราบว่าตัวยึดตำแหน่งด้านนอก$_
ระบุที่อยู่เซิร์ฟเวอร์ในขณะที่ตัวยึดตำแหน่งด้านใน$_
ระบุอุปกรณ์ นั่นเป็น gotcha บ่อยครั้งสำหรับมือใหม่ PowerShell หากคุณต้องการใช้ที่อยู่เซิร์ฟเวอร์ในลูปด้านในคุณจะต้องกำหนดให้กับตัวแปรใหม่ในลูปด้านนอก
ซอฟต์แวร์ฟอรัมที่ใช้ที่นี่มีข้อบกพร่อง ในตัวอย่างการโพสต์มันจะแสดง$_
อย่างถูกต้อง$_
แม้ว่าจะไม่ได้หลบหนีเป็นรหัส แต่โพสต์สุดท้ายลบขีดล่างดังนั้นจึงทำให้ตัวอย่าง PowerShell ไม่ถูกต้อง
Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }
แต่เป็นมือใหม่ PS ฉันไม่เข้าใจว่าขั้นตอนต่อไปจะเป็นอัตโนมัตินี้ (ตัวอย่างเช่นวิธีหนึ่งจะเอาออกจากคำสั่งแรกและถ้า ไดรฟ์อยู่ต่ำกว่าเกณฑ์พื้นที่บางส่วนต่อสายคำสั่ง PS เพื่อส่งและส่งอีเมลฉันเห็นว่าอีเมลสามารถส่งจากโพสต์โดย boadad ด้านบนโดยใช้-command &{send-mailmessage ...
แต่ไม่แน่ใจว่าจะวางสายของคุณด้วยตรรกะที่กำหนดว่าพื้นที่ต่ำ . ขอบคุณ
คุณสามารถใช้สคริปต์นี้เพื่อส่งอีเมลโดยใช้เซิร์ฟเวอร์อีเมลของคุณ เพียงแค่แทนที่ชื่อของเซิร์ฟเวอร์ 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 = ""
}
}
ฉันแก้ไขสคริปต์แล้ว เพียงสร้างไฟล์ข้อความชื่อเช่น 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}}
ขอแสดงความนับถือหลุยส์
Get-Content server.txt | foreach-object {Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}