smithers
Goto Top

Dateiüberprüfung per Powershell - Versand per Mail

Hallo liebe Community,

gibt es eine Möglichkeit per Powershell eine Datei zu überwachen und falls diese geändert wird eine Email zu versenden ?
Dies muss nicht live geschehen, das Script soll dann als Task eingebunden sein und alle 15 Minuten laufen.
Die Email soll dann nur den Pfad zur Datei beinhalten.

Leider finde ich keinen Weg, dies irgendwie zu implementieren.
Ich hoffe Ihr könnt mir den Stoß in die richtige Such/Gedankenrichtung geben.

Vielen Dank und einen schönen Abend

Gruß

smithers

Content-Key: 247596

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

Printed on: April 25, 2024 at 03:04 o'clock

Member: DerWoWusste
DerWoWusste Aug 27, 2014 at 20:09:34 (UTC)
Goto Top
Hi.

Mit "per Powershell" engst Du die Möglichkeiten ein, warum? Nimm einfach die NTFS-Überwachung, überwache Schreibzugriffe auf die Datei, damit wird in Echtzeit ein Event generiert, an das Du Deinen Mailtask triggern kannst.
Member: colinardo
Solution colinardo Aug 28, 2014, updated at Nov 12, 2014 at 09:16:54 (UTC)
Goto Top
Moin smithers,
würde auch die Lösung von @DerWoWusste nehmen, wenn du es aber unbedingt mit Powershell machen möchtest kann man dies hiermit erreichen (Wichtig: Hiermit lassen sich nur lokale Ordner überwachen, keine Netzlaufwerke):
Dass Script überprüft alle 60 Sekunden ob in dieser Zeit eine Änderung der Datei stattgefunden hat. Das Script muss also nur einmal gestartet werden und überwacht dann die Events im Hintergrund.
<#
     Monitor folder changes
#>

# Variables -------------------------
# local folder path to monitor
    $localFolderPath = "C:\Ordner"   
#Filename to check for changes
    $strFilename = "demo.txt"  
# interval to check for changes (seconds)
    $intMonitorInterval = 60
# -----------------------------------

# get seperate drive and path for wql query specific formatting
$strDrive = $localFolderPath.Split("\")  
$localFolderPath.TrimEnd("\")  
$strPath = $localFolderPath.Split(":")[1].Replace("\","\\")+"\\"  

# action fired when event occurs
$eventaction = {
    #object which fired the event
    $obj = $Event.SourceEventArgs.NewEvent.TargetInstance
    $objWMI = gwmi "Win32_OperatingSystem"  
    $modifiedDate = get-date ($objWMI.ConvertToDateTime($obj.LastModified)) -Format 'dd.MM.yyyy HH:mm:ss'  

    # send mail
    $smtpusername = 'USERNAME'  
    $smtppassword = 'PASSWORD'  
    $smtpfrom = 'fromuser@domain.de'  
    $smtpto = 'fromuser@domain.de'  
    $smtpserver = "smtp.server.de"  
    $smtpcred = new-Object pscredential($smtpusername,(Convertto-SecureString $smtppassword -AsPlainText -Force))
    Try{
     Send-MailMessage -To $smtpto -From $smtpfrom -Subject 'Eine Datei hat sich geändert' -Body "Die Datei '$($obj.Name)' wurde geändert am $modifiedDate" -SmtpServer $smtpserver -UseSsl -Credential $smtpcred -Encoding UTF8 -ErrorAction Stop  
     write-host "Datei '$strFilename' wurde geändert am $modifiedDate, eine E-Mail wurde verschickt." -ForegroundColor Green  
    }catch{
      write-host $_
    }
}

$query = "Select * From __InstanceModificationEvent WITHIN $intMonitorInterval`  
          where TargetInstance ISA 'CIM_DataFile'`  
          and TargetInstance.Drive = '$strDrive'`  
          and TargetInstance.Path = '$strPath'`  
          and TargetInstance.Name like '%$strFilename'"  

#actually register Event-Subscriber
Register-WmiEvent -query $query -SourceIdentifier "Monitor Folder Watcher" -action $eventaction  

while($true){
    sleep($intMonitorInterval)
}

# to unregister the event  call
# Unregister-Event -SourceIdentifier "Monitor Folder Watcher"  
Grüße Uwe
Member: smithers
smithers Aug 29, 2014 at 09:11:32 (UTC)
Goto Top
Hallo zusammen,

herzlichen Dank für die prompten Lösungvorschläge.
per Powershell war nur ein Gedanke von mir, da ich dachte dies einfacher gelöst zu bekommen.

Den Lösungsvorschlag mit der NTFS Überwachung sehe ich mir mal genauer an..

Vielen Dank dafür.