Mantıksal disk bölümleri az yer kaplarsa, Windows Server 2008'de bir e-posta uyarısını tetiklemenin kolay bir yolu olup olmadığını merak ediyordum. DB günlük dosyaları nedeniyle disk alanı azalıyor yakın 2 SQL sunucu var.
Teşekkürler, Ryan
Mantıksal disk bölümleri az yer kaplarsa, Windows Server 2008'de bir e-posta uyarısını tetiklemenin kolay bir yolu olup olmadığını merak ediyordum. DB günlük dosyaları nedeniyle disk alanı azalıyor yakın 2 SQL sunucu var.
Teşekkürler, Ryan
Yanıtlar:
Windows Server 2008'in düşük disk alanı e-posta uyarıları göndermesini sağlamanın basit bir yolu, Görev Zamanlayıcı'yı ve Sistem Günlüğünü kullanmaktır. Boş alan HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold'da belirtilen oranın altına düşerse , e-posta iletisi göndermek üzere bir görevi tetikleyebilecek bir olay Sistem Günlüğüne kaydedilir.
powershell
programı ve argümanlar için aşağıdakileri doldurabilirsiniz :-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}
(Ayrı) nagios örneğime snmp aracılığıyla disk alanı izlemeyi ekledim.
Neden her gün bir powershell betiğini zamanlama görevi olarak çalıştırmıyorsunuz? Komut dosyası diskin boş alanını% 10'dan daha düşük buluyorsa, size bir e-posta veya bildirim gönderir.
disklerin boş alanlarını kontrol etmek için örnek bir kod:
GetE-Content ForEach-Object {$ ; Get-WMIObject - bilgisayar adı $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
Her iki örnek de yanlış PowerShell sözdizimi nedeniyle çalışmıyor. Aşağıdaki kod geçerli ana bilgisayarın ses boyutlarını listeler (PowerShell 5.0 kullanarak):
Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }
Aşağıdaki kod, server.txt dosyasında listelenen ana bilgisayarların birim boyutlarını listeler :
Get-Content server.txt | %{ Get-WMIObject –computername $_ Win32_LogicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB } }
Dış yer tutucunun $_
sunucu adreslerini, iç yer tutucusunun $_
aygıtları numaralandırdığını unutmayın. Bu PowerShell yeni başlayanlar için sıkça rastlanan bir durumdur. Sunucu adresini iç döngüde kullanmak istiyorsanız, dış döngüdeki yeni bir değişkene atamanız gerekir.
Burada kullanılan forum yazılımı hatalı. Yayın önizlemelerinde, koddan kaçmasanız bile $_
doğru olarak görüntülenir $_
. Ancak son gönderi alt çizgiyi kaldırır, böylece PowerShell örneklerini yanlış yapar.
Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }
ancak bir PS acemi olarak, bir sonraki adımın bunu otomatikleştirmek için ne olacağını tam olarak anlayamıyorum (örneğin, ilk çıktıdan nasıl çıktı alınacak ve sürücü bir miktar eşik değerin altındaydı, göndermek ve e-postayla göndermek için bir PS komutu bağladım, e-postanın yukarıdaki gönderiyle boadad ile gönderilebildiğini -command &{send-mailmessage ...
ancak sizin alanınızın düşük posta gönderilmesi gerektiğini belirten bir mantıkla nasıl bağlanacağından emin olmadığınızı görüyorum. Thx.
E-posta sunucunuzu kullanarak bir e-posta göndermek için bu komut dosyasını kullanabilirsiniz. Sadece smtp sunucusunun adını sunucunuzun ismiyle değiştirin. Aynı makinede ise "localhost" kullanın (smtp sunucusu işlevsel olmalı). Betik burada da bulunur: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65
Komut dosyası yerel sürücüye kaydedildikten sonra, powershell kullanılarak kolayca çalıştırılabilir ve test edilebilir. Komut dosyası iyi çalışıyor gibi göründüğünde, Windows görev zamanlayıcıyı kullanarak gereksinime göre günlük veya her saat çalışacak şekilde programlanabilir. Bu makalede, görev zamanlayıcı kullanarak bir komut dosyasının nasıl çalıştırılacağı açıklanmaktadır. 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 = ""
}
}
Senaryoyu düzelttim. Sadece server.txt adlı bir metin dosyası oluşturun ve ip adresini veya sunucu adlarını ekleyin, ardından aşağıdaki betiği uygulayabilirsiniz.
İçeriği Al server.txt | foreach-object {Get-WmiObject -BilgisayarAdı 192.168.22.208 win32_logicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}
Saygılar, Luis.
İçeriği Al server.txt | foreach-object {Get-WmiObject -BilgisayarAdı xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}