Windows Server 2008で低ディスク領域アラートを設定する


29

論理ディスクパーティションの空き容量が少なくなったときに、Windows Server 2008で電子メールアラートをトリガーする簡単な方法があるかどうか疑問に思っていました。DBログファイルのためにディスク領域が不足しそうになった2つのSQLサーバーがあります。

ありがとう、ライアン


1
完全なログを長期間保持する必要がない場合は、最大のログを持つデータベースを「シンプル」バックアップモードに設定し、完全バックアップが完了した直後にメンテナンスプランでそれらを切り捨てます。もちろん、これはあなたの質問に答えるものではありませんが、状況が許せば、そもそもドライブがいっぱいにならないようにするのに役立つかもしれません。
ジャスティンスコット

情報をありがとう。SQLログファイルを切り捨て、サイズが大きくなるのを防ぐために、追加のバックアップジョブを実装しました。しかし、万が一に備えて何らかのアラートを設定したいと思います。ありがとう。
rmwetmore

Spiceworksを使用して、すべてのクライアントとサーバーのディスクスペースが不足していることを警告します。

回答:


37

ディスク容量の少ない電子メールアラートをWindows Server 2008に送信させる簡単な方法の1つは、タスクスケジューラとシステムログを使用することです。空き領域がHKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThresholdで指定された割合を下回ると、電子メールメッセージを送信するタスクをトリガーできるイベントがシステムログに記録されます。

  1. タスクスケジューラを開き、新しいタスクを作成します。
  2. タスクの名前を入力し、[ユーザーがログオンしているかどうかに関係なく実行する]を選択し、[パスワードを保存しない]をオンにします。
  3. [トリガー]タブで新しいトリガーを追加します。
  4. [タスクの開始]ボックスで[イベント中]を選択します。
  5. ログを「システム」に、ソースを「srv」に、イベントIDを「2013」に設定します。
  6. [アクション]タブで新しいアクションを追加します。
  7. [アクション]を[電子メールの送信]に設定し、残りの設定を適切に入力します。
  8. 低ディスク容量イベントがシステムログに記録されるタイミングを構成するには、レジストリエディターを開き、HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parametersに移動して、「DiskSpaceThreshold」という名前のDWORD値を追加し、希望の割合に設定します。エントリが存在しない場合、デフォルト値は10です。

6
これはシステムドライブ(通常はCドライブ)のみをトリガーしますか?2〜3個のドライバーがあり、それぞれにアラートを設定したい場合はどうなりますか。
2011年

イベント2013は、定義されたしきい値を下回るパーティションについてログに記録されます。ディスクスペースがしきい値を超えて増加するか、サーバーが再起動されない限り、パーティションごとに1回しか記録されないことに注意してください。 support.microsoft.com/kb/112509
paulH

2
Windowsサーバーの新しいバージョンでは、「電子メールの送信」アクションは非推奨です。代わりに、「プログラムの開始」アクションを使用し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}
。– Baodad

1

(別個の)nagiosインスタンスにsnmpを介してディスクスペースモニタリングを追加しました。


一般的な監視パッケージの一部としてディスク監視もありますが、ディスクを数分ごとにチェックするIPMonitorを使用します。
ジャスティンスコット

現在、別の監視システム(IPMonitorなど)を検討していますが、その間にサーバーに警告を表示するために何かを配置したいと思います。ありがとう。
-rmwetmore

1

毎日スケジュールタスクとしてPowerShellスクリプトを実行してみませんか?スクリプトがディスクの空き容量が10%未満であると判断した場合、電子メールまたは通知を送信します。

ディスクの空き容量を確認するためのサンプルコードを次に示します。

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


1
このスクリプトは機能しません。位置パラメータが設定されていないというエラーメッセージが表示されます。
ラファエルルーティガー

1

どちらの例も、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 } }

サイドノート

外側のプレースホルダー$_はサーバーのアドレスを列挙し、内側のプレースホルダー$_はデバイスを列挙することに注意してください。これは、PowerShell初心者にとってよくある落とし穴です。内側のループでサーバーアドレスを使用する場合は、外側のループの新しい変数に割り当てる必要があります。

ここで使用されているフォーラムソフトウェアには欠陥があります。ポストプレビューでは、コードとしてエスケープされていなく$_$_も、として正しく表示されます。ただし、最後の投稿ではアンダースコアが削除されているため、PowerShellの例は正しくありません。


私は最初のコマンドを使用してドライブスペースが残っているのを見ることができますGet-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }が、PS初心者であるため、これを自動化する次のステップがどうなるかよくわかりません(例、最初のコマンドからの出力をどのように取得するか、ドライブはあるスペースのしきい値を下回っていたので、PSコマンドを接続して送信およびメールを送信します。メールは上記のboadadによる投稿から送信できますが-command &{send-mailmessage ...、スペースが少ないことを示すロジックを使用してメールを送信するには。Thxを。
ジェフMergler

0

このスクリプトを使用して、電子メールサーバーを使用して電子メールを送信できます。smtpサーバー名の名前をサーバーの名前に置き換えてください。同じマシン上で「localhost」を使用する場合(SMTPサーバーが機能している必要があります)。スクリプトもここにあります:https : //gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

スクリプトをローカルドライブに保存すると、powershellを使用して簡単に実行してテストできます。スクリプトが正常に動作しているようであれば、Windowsタスクスケジューラを使用して要件に基づいて毎日または1時間ごとに実行するようにスケジュールできます。この記事では、タスクスケジューラを使用してスクリプトを実行する方法について説明します。 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

スクリプトを修正しました。たとえば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}}

よろしく、ルイス。


これは実際には元の投稿に対する回答ではなく、回答に対する修正です。さらに、server.txtファイルから抽出された値の代わりに、コードで固定IPアドレスを使用しています。
ジョン別名hot2use

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.