Powershell watch folder en mail notificatie

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Hallo,

Iemand hier die mij opweg kan helpen?
Ik heb inmiddels twee powershell scriptjes namelijk;

1. Email mij een bestanden in een spicifieke folder met de inhoud van de folder als bijlage.
2. Houdt een specifieke folder in de gaten op veranderingen

Punt is nu dat ik deze twee wil combineren dus, wanneer er een verandering plaats vind in een specifieke folder mijn dan een stuurd met als bijlage bestanden welke in de folder zitten.

Script.1
Param (
[string]$Path = "D:\99_OVERIGE\05_LOGS\01_FREE_FILE_SYNC\",
)


#Connection Details
$username=”mijnemaildadres@hotmail.com”
$password=”wachtwoord”
$smtpServer = “smtp.live.com”
$msg = new-object Net.Mail.MailMessage

#Change port number for SSL to 587
$smtp = New-Object Net.Mail.SmtpClient($SmtpServer, 587)

#Uncomment Next line for SSL
$smtp.EnableSsl = $true

$smtp.Credentials = New-Object System.Net.NetworkCredential( $username, $password )

#From Address
$msg.From = "mijnemaildadres@hotmail.com"
#To Address, Copy the below line for multiple recipients
$msg.To.Add(“mijnemaildadres@hotmail.com”)

#Message Body
$msg.Body=”Free File Sync is klaar, hierbij het LOG bestand”

#Message Subject
$msg.Subject = “Notificatie”

$File = Get-ChildItem $Path | Where { $_.LastWriteTime -ge [datetime]::Now.AddMinutes(-10) }
If ($File)
{ $SMTPBody = "`nThe following files have recently been added/changed:`n`n"
$File | ForEach { $SMTPBody += "$($_.FullName)`n" }
Send-MailMessage @SMTPMessage -Body $SMTPBody

}
Script 2.
Function Register-Watcher {
param ($folder)
$filter = "*.*" #all files
$watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false
EnableRaisingEvents = $true
}

$changeAction = [scriptblock]::Create('
# This is the code which will be executed every time a file change is detected
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file $name was $changeType at $timeStamp"
')

Register-ObjectEvent $Watcher "Changed" -Action $changeAction
}

Register-Watcher "D:\99_OVERIGE\05_LOGS\01_FREE_FILE_SYNC"

Beste antwoord (via Although0000 op 11-02-2017 23:18)


  • Merethil
  • Registratie: December 2008
  • Laatst online: 30-08 20:23
Although0000 schreef op dinsdag 7 februari 2017 @ 10:11:
Waar ik nu op vast loop is dat ik niet weet ik welke volgorde het script moet komen te staan, waar en hoe zeg ik. "Als je een file vindt dat is veranderd in folder c:/test Stuur mij deze dan per mail op"
code:
1
2
3
4
5
6
7
$changeAction = [scriptblock]::Create('
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated
    Write-Host "The file $name was $changeType at $timeStamp"
')


Dit stuk is "wat er uitgevoerd wordt als er een folder/file is veranderd in je folder die je in de gaten houdt".
Ik zou dus beginnen met eruit gooien wat er in die functie staat, en kijken hoe je dat kan veranderen naar wat je wilt doen.
Uiteindelijk komt het erop neer dat je script A (je email-script) moet kopieëeren naar de juiste plek in script B (je filechecker-script). Dit stuk hierboven is de locatie waar je moet denken: Als X gebeurt (een aanpassing op een file heeft plaatsgevonden), doe dan Y (het stuk in je create).

Probeer het eens samen te voegen op die locatie en te zien wat er gebeurt.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:01

Creepy

Tactical Espionage Splatterer

Wat voor poging heb je zelf al ondernomen om beide te combineren?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Behalve heel internet af zoeken nog niet veel. Ik vind een hoop voorbeelden waar beide los van elkaar werken maar niet gecombineerd en weet niet zo goed waar ik moet beginnen. Ik ben erg nieuw in powershell.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 09:15
Begin punt is om goed de scripts door te nemen en te bepalen wat elke regel doet en waarom het dus werkt, daarna is het combineren echt zo gedaan.
Begin eerst eens met Script 1 door te nemen en alle zaken die niet met mail versturen te maken hebben eruit te halen. Vervolgens neem je script twee door en kijk je nog eens goed naar het commentaar en douw je script 1 in script 2.

Acties:
  • +1 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 30-08 16:12
Although0000 schreef op zondag 5 februari 2017 @ 19:38:
Hallo,

Iemand hier die mij opweg kan helpen?
Ik heb inmiddels twee powershell scriptjes namelijk;

1. Email mij een bestanden in een spicifieke folder met de inhoud van de folder als bijlage.
2. Houdt een specifieke folder in de gaten op veranderingen

Punt is nu dat ik deze twee wil combineren dus, wanneer er een verandering plaats vind in een specifieke folder mijn dan een stuurd met als bijlage bestanden welke in de folder zitten.

Script.1

[...]


Script 2.

[...]
Goede manier om een mailbox volgespammed te zien worden.

Maar goed, dit is erg simpel te realiseren in Powershell :
  • Functie aanmaken om een mailtje te sturen met parameter input voor de body van de mail of de attachment
  • FileSystemWatcher Object aanmaken
  • Subscriben op de betreffende event dmv Register-ObjectEvent : in de Action moet deze dan de mailbody of de attachment aanmaken adv de EventArgs, daarna stuur je de mail.
Is dit voor school/werk of privé ? Indien privé dan wil ik nog wel de code zeg maar voorkauwen, ik ben echter niet bereid om andermans (betaalde) werk te doen uiteraard.

Overigens moet ik ook zeggen dat het af te raden is om Write-Host in scripts te gebruiken, zie ook http://www.jsnover.com/bl...-host-considered-harmful/ (en als meneer Snover dit zegt dan zal het wel zo zijn aangezien er maar weinig mensen op de wereld zijn met meer inhoudelijke Powershell kennis als de uitvinder hiervan).

[ Voor 11% gewijzigd door Killah_Priest op 06-02-2017 11:23 ]


Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Is dit voor school/werk of privé ? Indien privé dan wil ik nog wel de code zeg maar voorkauwen, ik ben echter niet bereid om andermans (betaalde) werk te doen uiteraard.
Uiteraard is het voor privé gebruik. Ik wil namelijk van een aantal processen en handelingen email notificaties. Voor het inloggen in Windows is het al gelukt om hiervan een notificatie te krijgen en was overigens mijn eerste Powershell script.

Ik heb, zoals Caelorum mij aanraden, de mail script doorgenomen en al het overbodige eruit gehaald

Mail script.
$emailSmtpServer = "smtp.live.com"
$emailSmtpServerPort = "587"
$emailSmtpUser = "**"
$emailSmtpPass = "**"

$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = ( $emailSmtpUser )
$emailMessage.To.Add( $emailSmtpUser )
$emailMessage.Subject = "Testing e-mail"
$emailMessage.IsBodyHtml = $true
$emailMessage.Body =
@"
<p>Dit is een <strong>test</strong>.</p>
"@

#HIER ZOU DAN HET GEVONDEN BESTAND TOEGEVOEGD MOETEN WORDEN?
$attachment = "gevonden bestand"
$emailMessage.Attachments.Add( $attachment )


$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );

$SMTPClient.Send( $emailMessage )
FileSystemWatch Script.
Function Register-Watcher {
param ($folder)
$filter = "*.*" #all files
$watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false
EnableRaisingEvents = $true
}

$changeAction = [scriptblock]::Create('
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file $name was $changeType at $timeStamp"
')

Register-ObjectEvent $Watcher "Changed" -Action $changeAction
}

Register-Watcher "c:\test"
Beide werken dus afzonderlijk van elkaar. Ik zou graag willen leren om deze te combineren maar misschien is dat alleen mogelijk door het voor te kauwen helaas. Ik hoop dat je me kan helpen.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 09:15
Begrijp je wat er in het tweede script gebeurt en dus welke functie bij elke wijziging wordt aangeroepen? Vanaf daar is het namelijk echt zeer eenvoudig om iig het pad van het bestand op te sturen.

Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Ik weet dat het tweede script de folder "c:\test" in de gaten houdt op een gemaakte bestand ($changeAction = [scriptblock]::Create), als er een verandering plaats vindt komt de volgende meldingen met de variabelen The file $name was $changeType at $timeStamp"

Ook begrijp ik de $filter = "*.*" #all files en IncludeSubdirectories = $false

Maar hoe nu verder

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 30-08 20:23
Although0000 schreef op maandag 6 februari 2017 @ 19:22:
Ik weet dat het tweede script de folder "c:\test" in de gaten houdt op een gemaakte bestand ($changeAction = [scriptblock]::Create), als er een verandering plaats vindt komt de volgende meldingen met de variabelen The file $name was $changeType at $timeStamp"

Ook begrijp ik de $filter = "*.*" #all files en IncludeSubdirectories = $false

Maar hoe nu verder
changeAction is de actie die uitgevoerd wordt tijdens het opmerken van een change door powershell. Wat denk je dat je daarin moet doen om je mailtje te laten werken?

Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
changeAction is de actie die uitgevoerd wordt tijdens het opmerken van een change door powershell. Wat denk je dat je daarin moet doen om je mailtje te laten werken?
Ik heb echt geen idee anders had ik het graag erin gezet, ik ben druk aan het googlen geslagen maar kom er niet uit.

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 30-08 20:23
Although0000 schreef op maandag 6 februari 2017 @ 20:36:
[...]


Ik heb echt geen idee anders had ik het graag erin gezet, ik ben druk aan het googlen geslagen maar kom er niet uit.
Dus je hebt een stukje code dat een emailtje verstuurt, en je hebt een stukje code dat iets doet wanneer er een verandering heeft plaatsgevonden. Wat let je om dat stuk zo aan te passen dat ipv een regeltje printen bij wijzigingen, hij jouw code uitvoert die een mailtje verstuurt?
Voeg het samen, probeer een beetje, je komt er vanzelf, maar bedenk wat de code nu doet.

ChangeAction bevat een stuk code dat wordt uitgevoerd wanneer er een wijziging is opgemerkt, zou je dat stuk code dan niet veranderen in je andere code die mailtjes verstuurt?

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 09:15
Vergeet het googlen even en kijk even goed naar het tweede script en de reactie van Merethil. Je beschreef net wat de output is van het tweede script, maar het belangrijkste voor jou is momenteel bepalen op welk moment en dus waar in heg script doe melding wordt gegeven. Als je dat hebt bepaalt kan je wat in script 1 zit makkelijk overzetten op de goede plek.

Ik begrijp dat het frustraties oplevert, maar beter nu goed leren via de pijnlijke weg, dan halfbakken. Dan heb je er later ook nog wat aan :)

Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Hm ik ben wat aan het proberen maar weet totaal niet wat ik doe en in welke volgorde wat moet komen te staan. Ik ben ook voorstander van de pijnlijke weg en alles uitpluizen zodat het ook blijft hangen maar als iemand me toch een begin wil geven zou dat wel fijn zijn.
Ik merk dat het geen wat ik wil wat hoog gegrepen is :)

De volgorde lijkt me;

1. Mail gegevens en variabelen aanbieden
2. Watch script uitvoeren
3. Bij een change van de watchfolder een actie uitvoeren = 4.
4. Resultaten en gevonden bestand toevoegen in een mail
5. De mail versturen

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 09:15
Prima :) en je loopt duidelijk vast op 3/4.
Je weet wat een functie is en hoe events werken? Welke functie als actie op het event wordt uitgevoerd in script 2? Op welk punt je dan dus de functies uit script 1 kan toevoegen?

Het is mij nog niet helemaal duidelijk waar je precies op vastloopt. Wat is er niet (geheel) duidelijk in de scripts?

Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Waar ik nu op vast loop is dat ik niet weet ik welke volgorde het script moet komen te staan, waar en hoe zeg ik. "Als je een file vindt dat is veranderd in folder c:/test Stuur mij deze dan per mail op"

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 30-08 20:23
Although0000 schreef op dinsdag 7 februari 2017 @ 10:11:
Waar ik nu op vast loop is dat ik niet weet ik welke volgorde het script moet komen te staan, waar en hoe zeg ik. "Als je een file vindt dat is veranderd in folder c:/test Stuur mij deze dan per mail op"
code:
1
2
3
4
5
6
7
$changeAction = [scriptblock]::Create('
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated
    Write-Host "The file $name was $changeType at $timeStamp"
')


Dit stuk is "wat er uitgevoerd wordt als er een folder/file is veranderd in je folder die je in de gaten houdt".
Ik zou dus beginnen met eruit gooien wat er in die functie staat, en kijken hoe je dat kan veranderen naar wat je wilt doen.
Uiteindelijk komt het erop neer dat je script A (je email-script) moet kopieëeren naar de juiste plek in script B (je filechecker-script). Dit stuk hierboven is de locatie waar je moet denken: Als X gebeurt (een aanpassing op een file heeft plaatsgevonden), doe dan Y (het stuk in je create).

Probeer het eens samen te voegen op die locatie en te zien wat er gebeurt.

Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Yes! ik heb het voor elkaar! bedankt voor je laatste goude tip Merethil. De volgende uitdaging is nu om de gevonden *.log file als bijlage mee te sturen en misschien zelfs de inhoud in de body van de mail te krijgen.
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
#MAIL CODE CREATE ACTION
$emailSmtpServer = "smtp.live.com"
$emailSmtpServerPort = "587"
$emailSmtpUser = "****"
$emailSmtpPass = "****"

$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = ( $emailSmtpUser )
$emailMessage.To.Add( $emailSmtpUser )
$emailMessage.Subject = "Notificatie - FreeFileSync"
$emailMessage.IsBodyHtml = $true
$emailMessage.Body =
@"
<p>De backup is voltooid op $timeStamp <br><strong> $name </strong> is $changeType</p>
<p>Hierbij de inhoud van het log bestand.</p>
"@

$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );

$SMTPClient.Send( $emailMessage )
#EINDE MAIL CODE
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
}

Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Ik krijg het ook niet helemaal lekker voor elkaar om een bijlage aan mijn mail toe te voegen. Als ik een vaste naam aan mijn .log bestand geef bijvoorbeeld test.log en deze invul zoals hieronder dat lukt het wel, echter varieert steeds de naamgeving van't .log bestand.
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
#MAIL CODE CREATE ACTION
$emailSmtpServer = "smtp.live.com"
$emailSmtpServerPort = "587"
$emailSmtpUser = "***"
$emailSmtpPass = "**"
$attachment = "D:\99_OVERIGE\05_LOGS\01_FREE_FILE_SYNC\test.log"
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = ( $emailSmtpUser )
$emailMessage.To.Add( $emailSmtpUser )
$emailMessage.Subject = "Notificatie - FreeFileSync"
$emailMessage.IsBodyHtml = $true
$attach = new-object Net.Mail.Attachment($attachment)
$emailMessage.Attachments.Add($attach)
$emailMessage.Body =
@"
<p>De backup is voltooid op $timeStamp <br><strong> $name </strong> is $changeType</p>
<p>Hierbij de inhoud van het log bestand.</p>
"@

$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );

$SMTPClient.Send( $emailMessage )
#EINDE MAIL CODE
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
}
Maak ik er een wildcard van dan doet hij het niet zoals hier. Nu las ik dat wildcard niet werken op deze manier.
$attachment = "D:\99_OVERIGE\05_LOGS\01_FREE_FILE_SYNC\*.log"
Vervolgens probeer ik het onderstaande maar ook hier wil het niet lukken.
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated


#MAIL CODE CREATE ACTION
$emailSmtpServer = "smtp.live.com"
$emailSmtpServerPort = "587"
$emailSmtpUser = "***"
$emailSmtpPass = "***"


$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = ( $emailSmtpUser )
$emailMessage.To.Add( $emailSmtpUser )
$emailMessage.Subject = "Notificatie - FreeFileSync"
$emailMessage.IsBodyHtml = $true

$emailMessage.Body =
@"
<p>De backup is voltooid op $timeStamp <br><strong> $name </strong> is $changeType</p>
<p>Hierbij de inhoud van het log bestand.</p>
"@

$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );

#your file location
$files=Get-ChildItem “D:\99_OVERIGE\05_LOGS\01_FREE_FILE_SYNC”

Foreach($file in $files)
{
Write-Host “Attaching File :- ” $file
$attachment = New-Object System.Net.Mail.Attachment
$emailMessage.Attachments.Add($attachment)
}


$SMTPClient.Send( $emailMessage )
$attachment.Dispose();
$emailMessage.Dispose();

#EINDE MAIL CODE
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
}
Iemand nog een idee hoe ik het voor elkaar kan krijgen, om een bijlage mee te sturen, de naamgeving van de file varieert steeds dus dit kan niet een vaste path+filename krijgen.

Acties:
  • +1 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 09:15
*Je maakt met
code:
1
$attachment = New-Object System.Net.Mail.Attachment

een nieuw attachment-object, maar je geeft nergens aan welk bestand dat zou moeten zijn. Wat je wilt doen is iets als
code:
1
$attachment = New-Object System.Net.Mail.Attachment($file.FullName)


en waarschijnlijk wil je ook nog een -Force bij je get-childitems doen zodat hidden items ook worden meegenomen en een
code:
1
-Filter "*.log"
zodat alleen .log bestanden worden toegevoegd.

[ Voor 26% gewijzigd door Caelorum op 11-02-2017 22:01 ]


Acties:
  • 0 Henk 'm!

  • Although0000
  • Registratie: Juli 2016
  • Laatst online: 23-07 15:37
Super! het loopt nu helemaal zoals ik wil.
Bedankt!
Pagina: 1