Sprawdzanie lokalizacji sieciowej pod kątem wystąpienia nowych plików

Poniższy skrypt pozwala na sprawdzania podanej lokalizacji sieciowej pod kątem pojawienia się w niej nowych plików.

# skrypt sprawdza czy w lokalizacji \\serwer\folder\Aktualizacje pojawiły się nowe pliki i jesli tak to wysyła powiadomienie

# sprawdzenie dla Kadr
write-host "sprawdzanie dla kadr."
$plikikadry = $null
$plikikadry = Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *kadry*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikikadry += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *ppk*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikikadry += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *rcp*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$licznikplikikadry = 0
$body = $null
 
if ($plikikadry)
{
write-host "Pliki kadry"
$plikikadry
foreach ($plikkadry in $plikikadry)
{
$plikkadrynazwa = $plikkadry.name
$Body = @"
<style>
.colorchange {color:#4F81BD;}
ind {text-indent:50px;}
</style>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div style="background-color:#3059D6; color:white; padding:20px;">
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:40pt"; align=center><b>Informacja</b></p>
</div>
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:12pt">W lokalizacji sieciowej na serwerze <b>NAZWA</b> pojawił się nowy plik <a href="$plikkadry">$plikkadrynazwa</a> </p>
<p> </p>
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:10pt">Wiadomość wygenerowana automatycznie, prosimy nie odpowiadać.</p>
</body>
</html>
"@
#$body

write-host "aktualny plik kadr: " $plikkadry
write-host "Licznik kadr: " $licznikplikikadry

#wysyłka powiadomienia email
   #użytkownik do zalogowania
   $User = "usrinfo"
   #pobranie hasła z pliku
   $File = "C:\scripts\passinfo.txt"
   #przekonwertowanie hasła
  # $credinfo = $null
   $credinfo=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
   #wysyłka wiadomości
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
$licznikplikikadry+=2

#Po wysyłce 5 plików oczekuj 1 minutę (ograniczenia Exchange)
if ($licznikplikikadry -eq 4) {
    write-host "oczekiwanie 61s"
    start-sleep -Seconds 61
    $licznikplikikadry = 0
   }
}
}

else
{Write-host "Pusto"}

# sprawdzenie dla Plac
Write-Host "sprawdzanie dla plac (po odczekaniu 61s)."
start-sleep -Seconds 61
$plikiplace = $null
$plikiplace = Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *place*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikiplace += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *jpk*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikiplace += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *arp*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikiplace += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *fk*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikiplace += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *kzp*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikiplace += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *arp*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$plikiplace += Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *fk*| where {$_.CreationTime -gt (get-date).adddays(-1)}
$licznikplikplace = 0

$body = $null
if ($plikiplace)
{
#Write-Host 'Pliki Place'
#$plikiplace

foreach ($plikplace in $plikiplace)
{
$plikplacenazwa = $plikplace.name
$Body = @"
<style>
.colorchange {color:#4F81BD;}
ind {text-indent:50px;}
</style>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div style="background-color:#3059D6; color:white; padding:20px;">
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:40pt"; align=center><b>Informacja</b></p>
</div>
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:12pt">W lokalizacji sieciowej na serwerze <b>NAZWA</b> pojawił się nowy plik <a href="$plikplace">$plikplacenazwa</a> </p>
</body>
</html>
"@
#$body

write-host "aktualny plik plac: " $plikplace
write-host "Licznik place: " $licznikplikplace

#wysyłka powiadomienia email
   #użytkownik do zalogowania
   $User = "usrzeinfo"
   #pobranie hasła z pliku
   $File = "C:\scripts\passinfo.txt"
   #przekonwertowanie hasła
   $credinfo=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
   #wysyłka wiadomości
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
$licznikplikplace+=2

#Po wysyłce 5 plików oczekuj 1 minutę (ograniczenia Exchange)
if ($licznikplikplace -eq 4) {
    write-host "oczekiwanie 61s"
    start-sleep -Seconds 61
    $licznikplikplace =0}
}
}
else
{Write-host "Pusto"}

# sprawdzenie dla Administratorów
write-host "Sprawdzenie dla Adm (po odczekaniu 61s)"
write-host "oczekiwanie 61s"
start-sleep -Seconds 61
$plikiadmin = $null
$licznikplikiadm = 0
$plikiadmin = Get-ChildItem '\\serwer\folder\Aktualizacje' -Recurse -file -include *admin*| where {$_.CreationTime -gt (get-date).adddays(-1)}
 
$body = $null
if ($plikiadmin)
{
Write-Host 'Pliki Adm'
$plikiadm
foreach ($plikadmin in $plikiadmin)
{
$plikadminnazwa = $plikadmin.name
#formatowanie treści email jako HTML
$Body = @"
<style>
.colorchange {color:#4F81BD;}
ind {text-indent:50px;}
</style>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div style="background-color:#3059D6; color:white; padding:20px;">
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:40pt"; align=center><b>Informacja</b></p>
</div>
<p style="font-family:Tahoma, Geneva, sans-serif; font-size:12pt">W lokalizacji sieciowej na serwerze <b>NAZWA</b> pojawił się nowy plik <a href="$plikadmin">$plikadminnazwa</a> </p>
</body>
</html>
"@
#$body

#wysyłka powiadomienia email
   #użytkownik do zalogowania
   $User = "usrzeinfo"
   #pobranie hasła z pliku
   $File = "C:\scripts\passinfo.txt"
   #przekonwertowanie hasła
   $credinfo=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
   #wysyłka wiadomości
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
   Send-MailMessage -From [email protected] -To [email protected] -Subject "Nowe pliki na serwerze NAZWA" -Body $body -Credential $credinfo -SmtpServer smtp.domena.pl -Port 587 -Encoding UTF8 -BodyAsHtml
$licznikplikiadm+=3
 
#Po wysyłce 4 plików oczekuj 1 minutę (ograniczenia Exchange)
if ($licznikplikadm -eq 4) {
    write-host "oczekiwanie 61s"
    start-sleep -Seconds 61
    $licznikplikiadm = 1}
}
}
else
{Write-host "Pusto"}

Powyższy skrypt sprawdza w lokalizacji '\\serwer\folder\Aktualizacje’ czy pojawiły się nowe pliki dla 3 różnych kryteriów: kadry, płace, administratorzy (słowa kluczowe w nazwach plików). W przypadku pojawienia się nowych plików wysyła email do wskazanych osób. Email zawiera link do podanego liku. Dodatkowo w przypadku gdy na serwerze Exchange są ustawione ograniczenia odnośnie ilości wysyłanych wiadomości skrypt po wysłaniu kilku wiadomości odczekuje zadany czas przed wysłaniem kolejnych wiadomości.

W powyższym skrypcie wykorzystujemy fakt zapisania hasła do pliku w postaci zakodowanej. Aby skorzystać z tego sposoby w pierwszej kolejności muśmy zapisać hasło do pliku i następnie możemy go wykorzystać w sposób podany w poniższym skrypcie. Plik możemy poprawnie rozszyfrować tylko na komputerze na którym zakodowaliśmy hasło. Po przeniesieniu pliku na inny komputer hasła nie można rozszyfrować. Należy pamiętać, że w przypadku gdy do komputera mają dostęp osoby które nie powinny poznać hasła należy odpowiednio zabezpieczyć dostęp do pliku z zaszyfrowanym hasłem.

#Zapisanie hasła do pliku w postaci zaszyfrowanej, do wykorzystania w automatycznych skryptach. Zamiast tekstu "haslo_do_konta" podajemy rzeczywiste hasło
"haslo_do_konta" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "c:\password.txt"
Hasło zapisane w powyższy sposób możemy następnie wykorzystać w skrypcie w następujący sposób
#zapis nazwy użytkownika do zmiennej
$User = "login"
#zapisanie w zmiennej ścieżki do  pliku z zakodowanym hasłem
$File = "C:\password.txt"
#zapisanie danych logowania do zmiennej
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)