Mengatur Peringatan Ruang Disk Rendah pada Windows Server 2008

29

Saya bertanya-tanya apakah ada cara mudah untuk memicu peringatan e-mail pada Windows Server 2008 ketika setiap partisi disk logis menjadi kekurangan ruang. Saya memiliki 2 server SQL yang hampir kehabisan ruang disk karena file log DB.

Terima kasih, Ryan

apalagi
sumber
1
Jika Anda tidak perlu menyimpan log lengkap untuk periode waktu yang signifikan, atur database dengan log terbesar ke mode cadangan 'Sederhana' dan minta rencana pemeliharaan Anda memotongnya segera setelah cadangan penuh dilakukan. Ini tidak menjawab pertanyaan Anda, tentu saja, tetapi mungkin membantu menjaga agar drive tidak menjadi penuh sejak awal jika situasi Anda memungkinkan.
Justin Scott
Terimakasih atas infonya. Saya memang menerapkan pekerjaan cadangan tambahan untuk membantu memotong file log SQL dan menjaga mereka dari tumbuh lebih besar. Tapi saya ingin memasang semacam peringatan untuk berjaga-jaga. Terima kasih.
rmwetmore
Kami menggunakan Spiceworks untuk memperingatkan kami tentang ruang disk yang rendah di semua klien dan server.

Jawaban:

37

Salah satu cara sederhana untuk mendapatkan Windows Server 2008 untuk mengirim peringatan e-mail ruang disk rendah adalah dengan menggunakan Penjadwal Tugas dan Log Sistem. Jika ruang kosong turun di bawah persentase yang ditentukan dalam HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , suatu peristiwa dicatat dalam Log Sistem yang dapat memicu tugas untuk mengirim pesan email.

  1. Buka Penjadwal Tugas dan buat tugas baru.
  2. Masukkan nama untuk tugas tersebut, pilih "Jalankan apakah pengguna masuk atau tidak", dan centang "Jangan simpan kata sandi."
  3. Tambahkan pemicu baru pada tab Pemicu.
  4. Pilih "Di suatu acara" di kotak "Mulai tugas".
  5. Setel Log ke "Sistem", Sumber ke "srv", dan ID Peristiwa ke "2013".
  6. Tambahkan tindakan baru pada tab Tindakan.
  7. Set Action ke "Kirim email" dan isi sisa pengaturan dengan tepat.
  8. Untuk mengonfigurasi saat peristiwa ruang disk rendah dicatat dalam Log Sistem, buka Editor Registri, buka HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters dan tambahkan nilai DWORD bernama "DiskSpaceThreshold", atur ke persentase yang diinginkan. Ketika entri tidak ada, nilai standarnya adalah 10.
Tandai Pettibone
sumber
6
Apakah ini hanya memicu drive Sistem (biasanya drive C)? Bagaimana jika saya memiliki 2-3 driver dan saya ingin mengatur peringatan pada masing-masing dari mereka.
Ved
Event 2013 dicatat untuk setiap partisi yang jatuh di bawah ambang batas yang ditentukan - perhatikan bahwa itu hanya dicatat sekali per partisi, kecuali ruang disk meningkat kembali di atas ambang batas atau server di-boot ulang. support.microsoft.com/kb/112509
paulH
2
Dalam versi server windows yang lebih baru, tindakan "Kirim email" sudah tidak digunakan lagi. Sebagai gantinya, Anda dapat menggunakan tindakan "Mulai Program", isi powershelluntuk program dan yang berikut untuk argumen:-command &{send-mailmessage -from [email protected] -to [email protected] -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

Saya menambahkan pemantauan ruang disk melalui snmp ke instance nagios (terpisah) saya.

David Mackintosh
sumber
Kami memiliki pemantauan disk sebagai bagian dari paket pemantauan umum kami juga, meskipun kami menggunakan IPMonitor yang memeriksa disk setiap beberapa menit.
Justin Scott
Saat ini saya sedang mencari sistem pemantauan yang terpisah (seperti IPMonitor), tetapi saya ingin menempatkan sesuatu pada server untuk mengingatkan saya sementara itu. Terima kasih.
rmwetmore
1

Mengapa Anda tidak menjalankan skrip PowerShell sebagai tugas jadwal setiap hari? Jika skrip menemukan ruang kosong disk lebih rendah dari 10%, ia akan mengirimi Anda email atau pemberitahuan.

berikut adalah contoh kode untuk memeriksa ruang kosong disk:

Get-Content ForEach-Object {$ ; Get-WMIObject –computername $ Win32_LogicalDisk -filter "DriveType = 3" | ForEach-Object {$ .DeviceID; $ .FreeSpace / 1GB}}

sky100
sumber
1
Skrip ini tidak berfungsi. Saya mendapatkan pesan kesalahan bahwa tidak ada parameter posisi yang ditetapkan.
Raffael Luthiger
1

Kedua contoh tidak berfungsi karena sintaks PowerShell yang salah. Kode berikut mencantumkan ukuran volume host saat ini (menggunakan PowerShell 5.0):

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

Kode berikut mencantumkan ukuran volume host yang terdaftar di server.txt :

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

Sidenote

Perhatikan bahwa tempat dudukan luar $_menyebutkan alamat server sedangkan tempat dudukan bagian dalam $_menyebutkan perangkat. Itu sering didapat untuk pemula PowerShell. Jika Anda ingin menggunakan alamat server di loop dalam, Anda harus menetapkannya ke variabel baru di loop luar.

Perangkat lunak forum yang digunakan di sini cacat. Dalam pratinjau pos, ini ditampilkan $_dengan benar sebagai $_bahkan jika tidak lolos sebagai kode. Tetapi posting terakhir menghapus garis bawah, sehingga membuat contoh PowerShell salah.

Frank Heimes
sumber
Saya dapat melihat ruang drive yang tersisa menggunakan perintah pertama: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }tetapi sebagai pemula PS, saya tidak begitu mengerti apa langkah selanjutnya untuk mengotomatisasi ini (contoh, bagaimana seseorang akan mengambil output dari perintah pertama dan jika drive berada di bawah ambang batas ruang, memasang perintah PS untuk mengirim dan mengirim email. Saya melihat bahwa email dapat dikirim dari pos dengan menggunakan boadad di atas menggunakan -command &{send-mailmessage ...tetapi tidak yakin bagaimana cara menghubungkan Anda dengan logika yang menentukan bahwa ruang surat rendah harus dikirim Thx.
Jeff Mergler
0

Anda dapat menggunakan skrip ini untuk mengirim email menggunakan server email Anda. Ganti saja nama server smtp dengan nama server Anda. Jika pada mesin yang sama maka gunakan "localhost" (server smtp harus fungsional). Skrip juga ditemukan di sini: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Setelah skrip disimpan di drive lokal, skrip dapat dengan mudah dijalankan menggunakan PowerShell dan diuji. Setelah skrip tampak berfungsi dengan baik, maka skedul dapat dijadwalkan untuk berjalan setiap hari atau setiap jam berdasarkan kebutuhan menggunakan penjadwal tugas windows. Artikel ini menjelaskan cara menjalankan skrip menggunakan penjadwal tugas. 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 = "[email protected]" 
    #$users = "[email protected]" # I use this for testing by uing my email address. 
  #$users = "[email protected]", "[email protected]", "[email protected]";  # 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 = "[email protected]" 
  $msg.Subject = "Environment DiskSpace Report for $titledate" 
        $msg.IsBodyHTML = $true 
        $msg.Body = get-content $diskReport 
  $smtp.Send($msg) 
        $body = "" 
    } 
  } 
Sameeksha Kumari
sumber
-1

Saya telah memperbaiki skrip. Cukup buat file teks bernama misalnya server.txt dan sertakan alamat ip atau nama server dan kemudian Anda dapat menjalankan skrip berikut

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

Salam, Luis.

Luis Guzman
sumber
Ini sebenarnya bukan jawaban untuk posting asli, tetapi koreksi untuk jawaban. Selain itu Anda menggunakan alamat IP tetap dalam kode alih-alih nilai yang diekstrak dari file server.txt.
John alias 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}}

Tilak Pawar
sumber
Saya tidak mengerti.
Pierre.Vriens