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-ID: 247596

Url: https://administrator.de/forum/dateiueberpruefung-per-powershell-versand-per-mail-247596.html

Ausgedruckt am: 23.12.2024 um 04:12 Uhr

DerWoWusste
DerWoWusste 27.08.2014 um 22:09:34 Uhr
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.
colinardo
Lösung colinardo 28.08.2014, aktualisiert am 12.11.2014 um 10:16:54 Uhr
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
smithers
smithers 29.08.2014 um 11:11:32 Uhr
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.