Windows Server 2008'de Düşük Disk Alanı Uyarılarını Ayarlama


29

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


1
Tam günlükleri önemli bir süre boyunca tutmanız gerekmiyorsa, en büyük günlükleri içeren veritabanlarını 'Basit' yedekleme moduna ayarlayın ve tam bir yedekleme yapıldıktan hemen sonra bakım planınızın bunları kısaltmasını sağlayın. Elbette bu, sorunuzu yanıtlamaz, ancak durumunuz izin verirse sürücünün ilk sırada yer almasını önlemeye yardımcı olabilir.
Justin Scott,

Bilgi için teşekkürler. SQL günlük dosyalarını kısaltmak ve daha büyük büyümelerini engellemek için ek bir yedekleme işi yaptım. Ancak tam da bir tür uyarı koymak istiyorum. Teşekkürler.
rmwetmore,

Tüm istemcilerde ve sunucularda düşük disk alanı olduğu konusunda bizi uyarmak için Spiceworks kullanıyoruz.

Yanıtlar:


37

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.

  1. Görev Zamanlayıcı'yı açın ve yeni bir görev oluşturun.
  2. Görev için bir ad girin, "Kullanıcının oturum açıp açmadığını çalıştır" seçeneğini seçin ve "Parola saklama" seçeneğini işaretleyin.
  3. Tetikleyiciler sekmesine yeni bir tetikleyici ekleyin.
  4. "Göreve başla" kutusundaki "Bir olayı" seçin.
  5. Günlüğü "Sistem", Kaynak "srv" ve Etkinlik Kimliği'ni "2013" olarak ayarlayın.
  6. Eylemler sekmesine yeni bir işlem ekleyin.
  7. Eylemi "Bir e-posta gönder" olarak ayarlayın ve ayarların kalanını uygun şekilde doldurun.
  8. Düşük disk alanı olayının Sistem Günlüğüne ne zaman kaydedileceğini yapılandırmak için Kayıt Defteri Düzenleyicisi'ni açın, HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters bölümüne gidin ve istediğiniz disk yüzdesine ayarlayarak “DiskSpaceThreshold” adlı bir DWORD değeri ekleyin. Giriş olmadığında, varsayılan değer 10'dur.

6
Bu sadece Sistem sürücüsü için tetikler mi (genellikle C sürücüsü)? Peki ya 2-3 sürücüm varsa ve onların her birini uyarmak istiyorum.
Ved

Olay 2013, tanımlanmış eşiğin altına düşen herhangi bir bölüm için günlüğe kaydedilir - disk alanı eşiğin üstüne çıkmadığı ya da sunucu yeniden başlatılmadığı sürece, bölüm başına yalnızca bir kez günlüğe kaydedildiğini unutmayın. support.microsoft.com/kb/112509
paulH

2
Windows sunucusunun daha yeni sürümlerinde "Bir e-posta gönder" eylemi kullanımdan kaldırılmıştır. Bunun yerine, "Bir Program Başlat" eylemini kullanabilir, powershellprogramı 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}
Baodad

1

(Ayrı) nagios örneğime snmp aracılığıyla disk alanı izlemeyi ekledim.


Diskleri genel izleme paketimizin bir parçası olarak da izliyoruz, ancak diskleri birkaç dakikada bir kesen IPMonitor kullanıyoruz.
Justin Scott,

Şu anda ayrı bir izleme sistemine (IPMonitor gibi) bakıyorum, ancak bu arada beni uyarmak için sunuculara bir şey koymak istiyorum. Teşekkürler.
rmwetmore

1

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


1
Bu komut dosyası çalışmıyor. Konum parametresi ayarlanmadı hata mesajını alıyorum.
Raffael Luthiger

1

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

Kenar notu

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.


İlk komutu kullanarak kalan sürücü alanını görebiliyorum: 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.
Jeff Mergler

0

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

-1

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.


Bu gerçekten asıl gönderinin cevabı değil, cevabın düzeltilmesidir. Ek olarak, server.txt dosyasından çıkarılan değer yerine kodda sabit bir IP adresi kullanıyorsunuz.
John aka hot2use

-1

İçeriği Al server.txt | foreach-object {Get-WmiObject -BilgisayarAdı xx.xx.xx.xx win32_logicalDisk -filter "DriveType = 3" | forEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}


Anlamadım.
Pierre.Vriens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.