Ustawianie alertów niskiego miejsca na dysku w systemie Windows Server 2008

29

Zastanawiałem się, czy istnieje prosty sposób na wywołanie powiadomienia e-mail w systemie Windows Server 2008, gdy na partycjach dysku logicznego zabraknie miejsca. Mam 2 serwery SQL, którym prawie brakuje miejsca na dysku z powodu plików dziennika DB.

Dzięki, Ryan

rmwetmore
źródło
1
Jeśli nie musisz przechowywać pełnych dzienników przez dłuższy okres czasu, ustaw bazy danych z największymi dziennikami na „Prosty” tryb tworzenia kopii zapasowych, a plan konserwacji skróć je natychmiast po wykonaniu pełnej kopii zapasowej. To oczywiście nie odpowiada na twoje pytanie, ale może pomóc w zapobieganiu zapełnieniu dysku, jeśli twoja sytuacja na to pozwala.
Justin Scott
Dzięki za informację. Zaimplementowałem dodatkowe zadanie tworzenia kopii zapasowej, aby pomóc obciąć pliki dziennika SQL i zapobiec ich powiększaniu. Na wszelki wypadek chciałbym jednak wprowadzić jakieś ostrzeżenie. Dzięki.
rmwetmore
Używamy Spiceworks, aby ostrzec nas o małej ilości miejsca na dysku na wszystkich klientach i serwerach.

Odpowiedzi:

37

Jednym z prostych sposobów, aby system Windows Server 2008 wysyłał powiadomienia e-mail o małej ilości miejsca na dysku, jest użycie Harmonogramu zadań i Dziennika systemu. Jeśli ilość wolnego miejsca spadnie poniżej wartości procentowej określonej w HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , w dzienniku systemowym rejestrowane jest zdarzenie, które może uruchomić zadanie wysłania wiadomości e-mail.

  1. Otwórz Harmonogram zadań i utwórz nowe zadanie.
  2. Wprowadź nazwę zadania, wybierz „Uruchom bez względu na to, czy użytkownik jest zalogowany” i zaznacz „Nie przechowuj hasła”.
  3. Dodaj nowy wyzwalacz na karcie Wyzwalacze.
  4. Wybierz „Na zdarzenie” w polu „Rozpocznij zadanie”.
  5. Ustaw opcję Log na „System”, Source na „srv”, a identyfikator zdarzenia na „2013”.
  6. Dodaj nową akcję na karcie Działania.
  7. Ustaw opcję Działanie na „Wyślij wiadomość e-mail” i odpowiednio wypełnij pozostałe ustawienia.
  8. Aby skonfigurować rejestrowanie zdarzenia niskiego miejsca na dysku w dzienniku systemowym, otwórz Edytor rejestru, przejdź do HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters i dodaj wartość DWORD o nazwie „DiskSpaceThreshold”, ustawiając go na żądany procent. Jeśli wpis nie istnieje, wartością domyślną jest 10.
Mark Pettibone
źródło
6
Czy powoduje to uruchomienie tylko dysku systemowego (zwykle dysku C)? Co jeśli mam 2-3 sterowniki i chcę ustawić alarm na każdym z nich.
Wed
Zdarzenie 2013 jest rejestrowane dla każdej partycji, która spadnie poniżej zdefiniowanego progu - pamiętaj, że jest rejestrowana tylko raz na partycję, chyba że miejsce na dysku wzrośnie powyżej progu lub serwer zostanie zrestartowany. support.microsoft.com/kb/112509
paulH
2
W nowszych wersjach serwera Windows akcja „Wyślij e-mail” jest nieaktualna. Zamiast tego możesz użyć akcji „Uruchom program”, wypełnij powershellprogram i następujące argumenty:-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

Dodałem monitorowanie miejsca na dysku przez snmp do mojej (oddzielnej) instancji nagios.

David Mackintosh
źródło
Monitorowanie dysku jest również częścią naszego ogólnego pakietu monitorowania, chociaż używamy IPMonitor, który sprawdza dyski co kilka minut.
Justin Scott
W tej chwili szukam osobnego systemu monitorowania (takiego jak IPMonitor), ale w międzyczasie chciałbym umieścić coś na serwerach, aby ostrzec mnie. Dzięki.
rmwetmore
1

Dlaczego codziennie nie uruchamiasz skryptu PowerShell jako zadania harmonogramu? Jeśli skrypt wykryje, że wolne miejsce na dysku jest mniejsze niż 10%, wyśle ​​Ci wiadomość e-mail lub powiadomienie.

oto przykładowy kod do sprawdzania wolnego miejsca na dyskach:

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

sky100
źródło
1
Ten skrypt nie działa. Pojawia się komunikat o błędzie, że nie ustawiono parametru pozycji.
Raffael Luthiger,
1

Oba przykłady nie działają z powodu niepoprawnej składni programu PowerShell. Poniższy kod wyświetla rozmiary woluminów bieżącego hosta (przy użyciu programu PowerShell 5.0):

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

Poniższy kod zawiera listę rozmiarów woluminów hostów wymienionych w server.txt :

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

Dygresja

Zauważ, że zewnętrzny symbol $_zastępczy wylicza adresy serwerów, podczas gdy wewnętrzny symbol $_zastępczy wylicza urządzenia. To częsty problem dla początkujących PowerShell. Jeśli chcesz użyć adresu serwera w wewnętrznej pętli, musisz przypisać go do nowej zmiennej w zewnętrznej pętli.

Użyte tutaj oprogramowanie forum jest wadliwe. W podglądzie wiadomości wyświetla się $_poprawnie jako $_nawet, jeśli nie jest poprzedzony kodem. Ale ostatni post usuwa znak podkreślenia, przez co przykłady PowerShell są niepoprawne.

Frank Heimes
źródło
Widzę, że pozostało miejsce na dysku za pomocą pierwszego polecenia: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }ale będąc początkującym PS, nie bardzo rozumiem, jaki byłby następny krok, aby to zautomatyzować (na przykład, jak wziąć dane wyjściowe z pierwszego polecenia i jeśli dysk był poniżej pewnego progu miejsca, połącz polecenie PS, aby wysłać i wysłać e-mailem. Widzę, że e-mail może zostać wysłany z postu przez boadad powyżej przy użyciu, -command &{send-mailmessage ...ale nie jestem pewien, jak połączyć twoje z logiką, która dyktuje, że jest mało miejsca, należy wysłać pocztę , Dzięki
Jeff Mergler
0

Możesz użyć tego skryptu, aby wysłać wiadomość e-mail za pomocą serwera e-mail. Wystarczy zastąpić nazwę serwera smtp nazwą serwera. Jeśli na tym samym komputerze, użyj „localhost” (serwer smtp musi działać). Skrypt znajduje się tutaj: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Po zapisaniu skryptu na dysku lokalnym można go łatwo uruchomić za pomocą programu PowerShell i przetestować. Gdy skrypt wydaje się działać poprawnie, można zaplanować jego uruchamianie codziennie lub co godzinę, w zależności od wymagań, za pomocą harmonogramu zadań systemu Windows. W tym artykule wyjaśniono, jak uruchomić skrypt za pomocą harmonogramu zadań. 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
źródło
-1

Naprawiłem skrypt. Wystarczy utworzyć plik tekstowy o nazwie na przykład server.txt i podać adres IP lub nazwy serwerów, a następnie można wykonać następujący skrypt

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

Pozdrawiam, Luis.

Luis Guzman
źródło
To nie jest tak naprawdę odpowiedź na oryginalny post, ale korekta odpowiedzi. Dodatkowo używasz stałego adresu IP w kodzie zamiast wartości pobranej z pliku server.txt.
John aka 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
źródło
Nie rozumiem
Pierre.Vriens,