Impostazione degli avvisi di spazio su disco insufficiente su Windows Server 2008


29

Mi chiedevo se esiste un modo semplice per attivare un avviso di posta elettronica su Windows Server 2008 quando le partizioni del disco logico si esauriscono. Ho 2 server SQL che si sono avvicinati all'esaurimento dello spazio su disco a causa dei file di registro del DB.

Grazie Ryan


1
Se non è necessario conservare i registri completi per un periodo di tempo significativo, impostare i database con i registri più grandi in modalità di backup "Semplice" e fare in modo che il piano di manutenzione li tronchi immediatamente dopo l'esecuzione di un backup completo. Questo non risponde alla tua domanda, ovviamente, ma può aiutare a evitare che l'unità si riempia in primo luogo se la tua situazione lo consente.
Justin Scott,

Grazie per le informazioni. Ho implementato un ulteriore processo di backup per aiutare a troncare i file di registro SQL e impedire che si ingrandiscano ulteriormente. Ma vorrei mettere in atto una specie di avviso per ogni evenienza. Grazie.
rmwetmore,

Usiamo Spiceworks per avvisarci della mancanza di spazio su disco su tutti i client e server.

Risposte:


37

Un modo semplice per far sì che Windows Server 2008 invii avvisi di posta elettronica con spazio su disco ridotto è utilizzare l'Utilità di pianificazione e il Registro di sistema. Se lo spazio libero scende al di sotto della percentuale specificata in HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DiskSpaceThreshold , nel registro di sistema viene registrato un evento che può attivare un'attività per inviare un messaggio di posta elettronica.

  1. Apri l'Utilità di pianificazione e crea una nuova attività.
  2. Inserisci un nome per l'attività, seleziona "Esegui se l'utente è connesso o meno" e seleziona "Non memorizzare la password".
  3. Aggiungi un nuovo trigger nella scheda Trigger.
  4. Seleziona "Su un evento" nella casella "Inizia l'attività".
  5. Impostare Log su "Sistema", Origine su "srv" e ID evento su "2013".
  6. Aggiungi una nuova azione nella scheda Azioni.
  7. Impostare Azione su "Invia un'e-mail" e compilare le altre impostazioni in modo appropriato.
  8. Per configurare quando l'evento di spazio su disco insufficiente viene registrato nel registro di sistema, aprire l'Editor del Registro di sistema, accedere a HKLM \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters e aggiungere un valore DWORD denominato "DiskSpaceThreshold", impostandolo sulla percentuale desiderata. Quando la voce non esiste, il valore predefinito è 10.

6
Questo si innesca solo per l'unità di sistema (di solito unità C)? Che cosa succede se ho un driver 2-3 e voglio impostare un avviso su ciascuno di essi.
Ved,

L'evento 2013 viene registrato per qualsiasi partizione che scende al di sotto della soglia definita; tenere presente che viene registrato solo una volta per partizione, a meno che lo spazio su disco non ritorni al di sopra della soglia o il riavvio del server. support.microsoft.com/kb/112509
paulH

2
Nelle versioni più recenti di Windows Server, l'azione "Invia un'e-mail" è obsoleta. Invece, puoi usare l'azione "Avvia un programma", compilare powershellper il programma e quanto segue per argomenti:-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

Ho aggiunto il monitoraggio dello spazio su disco tramite snmp alla mia istanza nagios (separata).


Abbiamo anche il monitoraggio del disco come parte del nostro pacchetto di monitoraggio generale, sebbene utilizziamo IPMonitor che controlla i dischi ogni pochi minuti.
Justin Scott,

In questo momento sto cercando un sistema di monitoraggio separato (come IPMonitor), ma nel frattempo vorrei mettere in atto qualcosa sui server per avvisarmi. Grazie.
rmwetmore,

1

Perché non eseguire uno script PowerShell come attività di pianificazione ogni giorno? Se lo script rileva che lo spazio libero sul disco è inferiore al 10%, ti invierà un'email o una notifica.

ecco un codice di esempio per controllare lo spazio libero dei dischi:

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


1
Questo script non funziona. Viene visualizzato il messaggio di errore che non è stato impostato alcun parametro di posizione.
Raffael Luthiger,

1

Entrambi gli esempi non funzionano a causa della sintassi di PowerShell errata. Il codice seguente elenca le dimensioni del volume dell'host corrente (usando PowerShell 5.0):

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

Il codice seguente elenca le dimensioni del volume degli host elencati in server.txt :

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

Nota a margine

Si noti che il segnaposto esterno $_enumera gli indirizzi del server mentre il segnaposto interno $_enumera i dispositivi. Questo è un problema frequente per i neofiti di PowerShell. Se si desidera utilizzare l'indirizzo del server nel ciclo interno, è necessario assegnarlo a una nuova variabile nel ciclo esterno.

Il software del forum utilizzato qui è difettoso. Nelle anteprime post, viene visualizzato $_correttamente $_come codice anche se non sfuggito. Ma il post finale rimuove il carattere di sottolineatura, rendendo errati gli esempi di PowerShell.


Sono in grado di vedere lo spazio su disco rimanente usando il primo comando: Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }ma essendo un novizio di PS, non capisco bene quale sarebbe il prossimo passo per automatizzare questo (esempio, come si prenderebbe l'output dal primo comando e se il l'unità era al di sotto della soglia di spazio, collega un comando PS per l'invio e l'e-mail. Vedo che l'e-mail può essere inviata da un post tramite boadad sopra utilizzando -command &{send-mailmessage ...ma non sono sicuro di come collegare il tuo con la logica che impone che lo spazio è basso la posta deve essere inviata . Thx.
Jeff Mergler

0

Puoi utilizzare questo script per inviare un'e-mail utilizzando il tuo server e-mail. Sostituisci semplicemente il nome del nome del server smtp con quello del tuo server. Se sulla stessa macchina, utilizzare "localhost" (il server smtp deve essere funzionale). Lo script si trova anche qui: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

Dopo che lo script è stato salvato nell'unità locale, può essere facilmente eseguito utilizzando PowerShell e testato. Una volta che lo script sembra funzionare correttamente, può essere programmato per essere eseguito ogni giorno o ogni ora in base ai requisiti utilizzando l'utilità di pianificazione di Windows. Questo articolo spiega come eseguire uno script utilizzando l'utilità di pianificazione. 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

Ho corretto la sceneggiatura. Basta creare un file di testo chiamato ad esempio server.txt e includere l'indirizzo IP o i nomi server e quindi è possibile eseguire il seguente script

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

Saluti, Luis.


Questa non è in realtà una risposta al post originale, ma una correzione a una risposta. Inoltre stai usando un indirizzo IP fisso nel codice invece del valore estratto dal file 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}}


Non capisco
Pierre.Vriens,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.