eccos01
Goto Top

Email Benachrichtigung wenn Festplattenplatz unterschritten wird

hallo,

ich suche ein einfaches, resourcenschonendes und kostenloses (auch kommerziell) Tool, welches den Speicherplatz auf den Festplatten überwacht und eine Email-Benachrichtigung verschickt, sobald eine vorher definierte Grenze unterschritten wird.

Ein Tool wie spiceworks ist zu aufwendig... und VB-Skripte sind auch nicht der Hit (aufgrund von Sicherheitsbeschränkungen bei manchen Kunden).

Alternativ wäre eine Batch-Datei möglich... Versand würde dann mittels bmail erfolgen.

Es muß als Dienst oder Task laufen können... ohne Interaktion mit dem Desktop.
Es muß auf den gängigen Windows-Systemen laufen (XP, 7, 2003 Server, 2008 Server).

Habt ihr eine Idee?

Content-ID: 168419

Url: https://administrator.de/contentid/168419

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

Clijsters
Clijsters 21.06.2011 um 21:39:03 Uhr
Goto Top
Hallöchen,

hast du schon mal über WMI nachgedacht?

Auch wenn ein VBScript hier meine erste Wahl wäre, ist es mit Batch oder Powershell auch möglich, Eine WMI-Abfrage zu starten.
Je nach Auftreten eines Events in den Logs, in dem Fall das Unterschreiten eines gewissen Festplattenplatzes, lässt du dir eine E-Mail senden.

Auf die gleiche Art und Weise lässt sich auch der freie Platz abfragen, so kannst du selber definieren, ab wann du eine E-Mail bekommst.


Gruß
Dominique
jsysde
jsysde 21.06.2011 um 21:44:24 Uhr
Goto Top
Auf Server-Betriebssystem liefert Microsoft ein solches "Tool" mit. Nennt sich "Kontingentverwaltung".
Für Clients macht das imho keinen Sinn, dort legt man keine Daten in den Mengen ab, wie auf einem Server. Wenn du es dennoch überwachen willst, würd ich die Überwachung vom Server aus machen, sonst wird das schnell unübersichtlich.

Cheers,
jsysde
Clijsters
Clijsters 21.06.2011 um 21:48:35 Uhr
Goto Top
Auf Server-Betriebssystem liefert Microsoft ein solches "Tool" mit. Nennt sich "Kontingentverwaltung".
Und das sendet E-Mails?
jsysde
jsysde 21.06.2011 um 21:49:36 Uhr
Goto Top
Ja. Wenn man es korrekt konfiguriert. face-wink

Cheers,
jsysde
pieh-ejdsch
pieh-ejdsch 21.06.2011 um 22:22:07 Uhr
Goto Top
moin,

was hat denn jetzt die KontingentVerwaltung mit dem Freien HDD-Platz zu tun?
5 Wiederherstellungspunkte und die Kontingentverwaltung zuckt gar net rum. - na so was!

fur knapp unter 2 GB reicht
@echo off&setlocal
for /f "tokens=3" %%i in ('dir /ad /-c^|findstr /c:" Verzeichnis(se)"^|findstr /e /c:" Bytes frei"') do set "DirSize=%%i"  

:: Maximum auf der Linken Vergleichsseite 2147483647 bytes
if %Dirsize% gtr 2147483647 goto :Mail
goto :eof
:Mail
::hier kommt dein Mailsendeding hin

Für Größer als 2 Gb gucks Du Hier, erst paar Tage her.

Gruß Phil
Clijsters
Clijsters 21.06.2011 um 22:53:14 Uhr
Goto Top
Zitat von @jsysde:
Ja. Wenn man es korrekt konfiguriert. face-wink

Cheers,
jsysde
Wieder was dazu gelernt.
Werde ich mir gleich mal anschauen
jsysde
jsysde 21.06.2011 um 23:01:07 Uhr
Goto Top
was hat denn jetzt die KontingentVerwaltung mit dem Freien HDD-Platz zu tun?

Ähh, du richtest dir für ne komplette Partition ein Kontingent ein und lässt dir bei weniger als n% freiem Platz ne Mail schicken?

Davon abgesehen: Afaik meckert jedes Windows-System, wenn auf einem Laufwerk "nur geringer Speicherplatz" zur Verfügung steht und verewigt das auch im Eventlog. Was man wiederum per Scheduler (Vista/7/2008/R2) oder eventtriggers (XP/2003/R2) abfangen könnte; letzteres kann man in Kombination mit blat auch als Mailbenachrichtigung aufbauen.

Cheers,
jsysde
Friemler
Friemler 22.06.2011 um 01:54:07 Uhr
Goto Top
Hallo @all,

ich denke auch, dass die Kontingentverwaltung ein geeignetes Mittel wäre. Auf XP ist sie schon vorhanden, auf meinem Windows 7 Ultimate auch, wie das mit den Home-Versionen aussieht weiß ich nicht, die Server-Betriebssysteme haben das bestimmt an Bord.

@pieh-ejdsch:
Batchskripte, die ständig im Hintergrund laufen, erzeugen eine hohe Prozessorlast und sind deshalb eher ungeeignet.

Man kann in der Kontingentverwaltung eine Obergrenze für einen User einstellen, wie viel Festplattenspeicher er benutzen darf und eine etwas niedriger liegende Grenze, ab deren Überschreitung ein Alarm ausgelöst wird.

In beiden Fällen wird eine Alarmmeldung erzeugt und ins Eventlog ein Eintrag geschrieben.

Und hier könnte man jetzt ein WMI-Feature nutzen, die permanenten Event Consumer, die einmalig über ein VBScript installiert werden müssen.

Zunächst wird ein EventConsumer erstellt, dann ein Filter und schließlich ein Binding zwischen diesen beiden.

WMI stellt mehrere vordefinierte EventConsumer zur Verfügung, der praktischste ist der CommandLineEventConsumer. Wenn das im Filter angegebene Ereignis eintritt (hier: In einem bestimmten Eventlog taucht ein bestimmter Event auf), kann der CommandLineEventConsumer ein Programm starten.

Im folgenden Script habe ich dafür CSCRIPT.exe, also den Windows Scripting Host für die Konsole genommen. Dem aufgerufenen Programm können Parameter übergeben werden. Das sind hier der Name eines VBScript, das sich im gleichen Verzeichnis wie der Installer befinden muss und auch dort verbleiben muss, sowie die Daten, die sich aus dem Eventlog-Eintrag gewinnen lassen.

Das Script habe ich für einen anderen Anwendungsfall entwickelt, nämlich das Beenden des Sicherheitscenter-Dienstes unter XP. Das ganze ist aber eine Art allgemeines Framework zum Installieren von permanenten Event Consumern. Es müssen nur die Zeilen 13 bis 16 angepasst werden. Man muss also den Namen des NT-Eventlogs kennen, in dem die Events bzgl. Überschreiten der eingestellten Warngrenze bzw. Erreichen der Obergrenze eingetragen werden, sowie die EventID dieser Events. Aus dem String strEventDescription in Zeile 13 wird der Name der WMI-EventConsumer- und der WMI-Filterinstanz sowie der Dateiname des zu startenden VBScripts erzeugt. Das VBScript müsste in dem Fall SecurityCenterStoppedEventHandler.vbs heißen. Das Pollingintervall in Zeile 16 gibt das Zeitintervall an, in dem das NT-Eventlog auf neu generierte Events abgefragt wird. Selbst bei einem Wert, wie hier, von einer Sekunde, erzeugt das nur eine geringe Prozessorlast.

Hier also erstmal der Installer für den Permanent EventConsumer. Das Script muss mit Adminrechten ausgeführt werden, aber wie gesagt nur einmalig.
' ===========================================  
' Run this script with administrative rights!  
' ===========================================  



'/////////////////////////////// Configure script's job ///////////////////////////////  

'******************** Customize according to your specific needs **********************  

'------------------ Set event description and job related variables -------------------  

strEventDescription  = "Security Center Stopped"  
strEventLog          = "Application"  
strEventID           = "2"  
strPollingIntervall  = "1"  



'----------------------------- Set WMI Event Filter query -----------------------------  

strEventFilterQuery  = "SELECT * FROM __InstanceCreationEvent" _  
                     & " WITHIN " & strPollingIntervall _  
                     & " WHERE TargetInstance ISA 'Win32_NTLogEvent'" _  
                     & " AND TargetInstance.LogFile='" & strEventLog & "'" _  
                     & " AND TargetInstance.EventIdentifier='" & strEventID & "'"  



'-------------- Set WMI Namespace where the monitored event will occure ---------------  

strEventNamespace    = "root\Cimv2"  



'----------- Set parameters which should be passed to Event Handler script ------------  

strEventHandlerParam = """" _  
                     & "%TargetInstance.LogFile%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.RecordNumber%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.SourceName%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.EventIdentifier%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.EventCode%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.EventType%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.Type%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.Category%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.CategoryString%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.TimeGenerated%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.TimeWritten%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.ComputerName%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.User%" _  
                     & """" _  
                     & " " _  
                     & """" _  
                     & "%TargetInstance.Message%" _  
                     & """"  

'**************************************************************************************  





'//////////////////////////////// Set script variables ////////////////////////////////  

'- Set Event Handler path, quote it and prepare it and its working directory for WMI --  

Set FSO           = CreateObject("Scripting.FileSystemObject")  

strEventHandlerWD = Replace(FSO.GetParentFolderName(WScript.ScriptFullName), "\", "\\")  

strEventHandler   = Replace(strEventDescription, " ", "") & "EventHandler.vbs"  
strEventHandler   = """" & strEventHandlerWD & "\\" & strEventHandler & """"  

Set FSO           = Nothing



'----------------------- Test for existing Event Handler script -----------------------  

Set FSO = CreateObject("Scripting.FileSystemObject")  

If Not FSO.FileExists(Replace(Replace(strEventHandler, "\\", "\"), """", "")) Then  
  MsgBox "The Event Handler script " & vbCRLF _  
          & Replace(strEventHandler, "\\", "\") & vbCRLF _  
          & "does not exist. Please create it.", _  
         vbExclamation, _
         "Missing Event Handler script"  
End If

Set FSO = Nothing



'-------------------------- Build parameters for CScript.exe --------------------------  

strCScriptParam = strEventHandler & " " & strEventHandlerParam  



'---------------- Get path of Windows Directory and prepare it for WMI ----------------  

Set WshShell    = WScript.CreateObject("WScript.Shell")  

strWinDir       = Replace(WshShell.ExpandEnvironmentStrings("%SystemRoot%"), "\", "\\")  

Set WshShell    = Nothing
 


'---------------------- Set path of CScript.exe prepared for WMI ----------------------  

setCScriptPath  = strWinDir & "\\System32\\cscript.exe"  





'////////////////////////// Install permanent Event Consumer //////////////////////////  

'------- Get WMI Scripting API object (SWbemServices), Namespace: Subscription --------  

strComputer                          = "."  
Set objWMIService                    = GetObject("winmgmts:" _  
                                                 & "{impersonationLevel=impersonate}!" _  
                                                 & "\\" & strComputer & "\root\Subscription")  



'------------------------------ Create the Event Filter -------------------------------  

Set objFilterClass                   = objWMIService.Get("__EventFilter")  
Set objFilter                        = objFilterClass.SpawnInstance_()

objFilter.Name                       = strEventDescription & " Event Filter"  
objFilter.EventNamespace             = strEventNamespace
objFilter.QueryLanguage              = "WQL"  
objFilter.Query                      = strEventFilterQuery

Set EventFilterPath                  = objFilter.Put_()



'----------------------- Create the Commandline Event Consumer ------------------------  

Set objEventConsumerClass            = objWMIService.Get("CommandLineEventConsumer")  
Set objEventConsumer                 = objEventConsumerClass.SpawnInstance_()

objEventConsumer.Name                = strEventDescription & " Commandline Event Consumer"  
objEventConsumer.CommandLineTemplate = setCScriptPath & " " & strCScriptParam  
objEventConsumer.ExecutablePath      = setCScriptPath
objEventConsumer.WorkingDirectory    = strEventHandlerWD
objEventConsumer.ShowWindowCommand   = 0

Set CommandlineEventConsumerPath     = objEventConsumer.Put_()



'------------------ Bind Event Filter to Commandline Event Consumer -------------------  

Set objBindingClass                  = objWMIService.Get("__FilterToConsumerBinding")  
Set objBinding                       = objBindingClass.SpawnInstance_()

objBinding.Filter                    = EventFilterPath
objBinding.Consumer                  = CommandlineEventConsumerPath

objBinding.Put_()


Falls auf dem ausführenden System Outlook oder ein Exchange-Server installiert ist, kann das folgende Script, der Eventhandler, verwendet werden, um die EMail zu verschicken.
Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.  
Const cdoSendUsingPort   = 2 'Send the message using the network (SMTP over the network).  

Const cdoAnonymous       = 0 'Do not authenticate  
Const cdoBasic           = 1 'basic (clear-text) authentication  
Const cdoNTLM            = 2 'NTLM  


Set listArgs = WScript.Arguments

If listArgs.Count = 14 Then
  strSenderName     = "Your Name"  
  strSenderEMail    = "YourEMailAddress@Provider.com"  
  strRecipientEMail = "RecipientEMailAddress@Provider.com"  

  strSMTPServer     = "Your.SMTP.Server"  
  intSMTPPort       = 465
  strSMTPUserName   = "YourSMTPUserName"  
  strSMTPPassWord   = "YourSMTPPassword"  

  strSubject        = "Ereignis aufgetreten"  
  strMailBody       = "Logfile  : " & listArgs(0) & vbCRLF & _  
                      "RecordNo : " & listArgs(1) & vbCRLF & _  
                      "Source   : " & listArgs(2) & vbCRLF & _  
                      "EventID  : " & listArgs(3) & vbCRLF & _  
                      "EventCode: " & listArgs(4) & vbCRLF & _  
                      "EventType: " & listArgs(5) & " (" & listArgs(6) & ")" & vbCRLF & _  
                      "Category : " & listArgs(7) & " (" & ConvertCategory(listArgs(8)) & ")" & vbCRLF & _  
                      "GenTime  : " & ConvertDateTime(listArgs(9)) & vbCRLF & _  
                      "WriteTime: " & ConvertDateTime(listArgs(10)) & vbCRLF & _  
                      "Computer : " & listArgs(11) & vbCRLF & _  
                      "LogedUser: " & ConvertUser(listArgs(12)) & vbCRLF & _  
                      "Message  : " & listArgs(13) & vbCRLF  
  strAttachmentFile = ""  


  Set objMessage      = CreateObject("CDO.Message")  

  objMessage.Subject  = strSubject
  objMessage.From     = """" & strSenderName & """ <" & strSenderEMail & ">"  
  objMessage.To       = strRecipientEMail
  objMessage.TextBody = strMailBody

  If strAttachmentFile <> "" Then  
    objMessage.AddAttachment strAttachmentFile
  End If
  

  '==This section provides the configuration information for the remote SMTP server.  

  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort  

  'Name or IP of Remote SMTP Server  
  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTPServer  

  'Type of authentication, NONE, Basic (Base64 encoded), NTLM  
  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic  

  'Your UserID on the SMTP server  
  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/sendusername") = strSMTPUserName  

  'Your password on the SMTP server  
  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strSMTPPassWord  

  'Server port (typically 25 or 465 (SMTP over SSL))  
  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = intSMTPPort  

  'Use SSL for the connection (False or True)  
  Select Case intSMTPPort
    Case 25 :
      objMessage.Configuration.Fields.Item _
      ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False  

    Case 465:
      objMessage.Configuration.Fields.Item _
      ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True  
      
  End Select

  'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)  
  objMessage.Configuration.Fields.Item _
  ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  

  objMessage.Configuration.Fields.Update

  '==End remote SMTP server configuration section==  


  objMessage.Send

  Set objMessage = Nothing
End If

Set listArgs = Nothing

WScript.Quit



Function ConvertCategory(strCategory)
  If strCategory = "<null>" Then  
    ConvertCategory = "Keine"  
  Else
    ConvertCategory = strCategory
  End If
End Function


Function ConvertUser(strUserName)
  If strUserName = "<null>" Then  
    ConvertUser = "Nicht zutreffend"  
  Else
    ConvertUser = strUserName
  End If
End Function


Function ConvertDateTime(strDateTime)
  Set dateTime    = CreateObject("WbemScripting.SWbemDateTime")  
  dateTime.Value  = strDateTime
  strResult       = dateTime.GetVarDate(True)
  Set dateTime    = Nothing

  ConvertDateTime = strResult
End Function
Das Script stammt von hier und wurde von mir angepasst. Erwähnenswert ist hier die Konvertierung des WMI-DateTime-Formats in eine lesbare Form im Unterprogramm ConvertDateTime.

Der Eventhandler wird unter dem Benutzerkonto SYSTEM in Session 0 ausgeführt. Die Session 0 spielt unter Vista und Windows 7 eine Rolle, weil dort alle Anwenderprogramme und der Desktop in Session 1 laufen. Dadurch ist keine Benutzerinteraktion möglich, da von einem Prozessen in Session 0 nicht mit Prozessen in Session 1 kommuniziert werden kann. Es ist deshalb auch ratsam, normalen Benutzern den Zugriff auf die Scriptdatei über NTFS-Rechte zu verbieten.


Natürlich ist es möglich, Script Nr. 1 so umzustricken, dass statt CSCRIPT.exe die Konsole, also CMD gestartet wird, um ein Batchfile auszuführen, in dem z.B. mit BLAT die EMail verschickt wird. Dann läßt sich das ganze auch auf Systemen verwenden, auf denen der Windows Scripting Host aus Sicherheitsgründen deaktiviert ist. Um den Installer laufen zu lassen muss er natürlich einmalig kurz aktiviert werden.


Genauere Informationen finden sich auf folgenden Seiten:

http://msdn.microsoft.com/en-us/library/aa392395%28v=VS.85%29.aspx
http://blogs.technet.com/b/heyscriptingguy/archive/2010/12/06/learn-how ...
http://www.codeproject.com/KB/system/PermEvtSubscriptionMOF.aspx
http://msdn.microsoft.com/en-us/library/aa394226%28v=vs.85%29.aspx
http://www.codeproject.com/KB/system/WQLByExample.aspx


Gruß
Friemler
eccos01
eccos01 22.06.2011 um 12:22:42 Uhr
Goto Top
danke für eure Antworten...
1. in erster linie geht es um Server-betriebssysteme... nur zum Testen wäre eine Läuffähigkeit auf XP / 7 ganz nett.
2.das VB-Skripte sagt mir gar nix... hab keinen Schimmer für was das jetzt genau ist.
3. Den Nachteil bzgl. Batchdateien kenn ich... wäre als ständig laufende Task nicht machbar... würde höchstens in einem best. Intervall immer wieder gestartet.
4. Was hat die Kontingentverwaltung (die den Platzverbrauch eines Users beschränkt) mit dem freien Platz auf dem Gesamtsystem zu tun?
5. Läßt sich die Warnung des Betriebssystems bzgl. "geringem Speicherplatz" konfigurieren? Wirkt sich das nicht nur auf die Systemplatte aus?
6. Wie kan ich denn aneinen Eintrag im Ereignisprotokoll ein Event (Auslösen eienr Email) hängen ?
Friemler
Friemler 22.06.2011 um 13:54:00 Uhr
Goto Top
Hallo eccos01,

Zitat von @eccos01:
2.das VB-Skripte sagt mir gar nix... hab keinen Schimmer für was das jetzt genau ist.
Eben dafür:
6. Wie kan ich denn aneinen Eintrag im Ereignisprotokoll ein Event (Auslösen eienr Email) hängen ?
Du musst es halt ein bisschen anpassen. Außerdem ist mein Posting lang, klar, aber wenn Du es liest, weißt Du bescheid.
Zitat von @Friemler:
Wenn das im Filter angegebene Ereignis eintritt (hier: In einem bestimmten Eventlog taucht ein bestimmter Event auf), kann der CommandLineEventConsumer ein Programm starten.

4. Was hat die Kontingentverwaltung (die den Platzverbrauch eines Users beschränkt) mit dem freien Platz auf dem Gesamtsystem zu tun?
Das hat jsysde schon in diesem Posting beantwortet.

5. Läßt sich die Warnung des Betriebssystems bzgl. "geringem Speicherplatz" konfigurieren? Wirkt sich das nicht nur auf die Systemplatte aus?
Wenn Du das noch selbst herausfindest, hast Du die Lösung so gut wie. Ich kann dazu leider nichts sagen.

Gruß
Friemler
eccos01
eccos01 27.06.2011 um 14:56:18 Uhr
Goto Top
Gibt es nicht ein einfaches Tool (auch bei kommerzieller Nutzung frei) welches alle lokalen Festplatten / Partitionen überwacht und bei Unterschreitung einer vorher definierten Grenze eine Email verschickt???