В продолжении поста “Поиск файлов на Autoit”
Условия задачи:
1. Есть файлы вида C:\MSBRO\Files_on_Computers\report\%computername%-%username%.txt
2. В файлах содержится информация о найденных файлах на компьютерах пользователей.
3. Данные файлы не должны храниться локально на компьютерах пользователей.
4. Требуется оповестить пользователей об этом путем отправки письма.
5. Всем пользователям отправлять письма не нужно, только определенным персонам в организации.
Итак, начнем…
После некоторых мучений с попытками составить список отправки было принято решение предварительно прогнать список файлов через скрипт и результат вывести в CSV. Потом уже откорректировать CSV и отправлять через него.
Для наших целей потребуется два скрипта и три действия.
1. Первый создаст CSV файл.
2. Откорректируем CSV
3. Отправим отчет пользователям.
Файлы генерируется этой программой “Поиск файлов на Autoit”
в папке C:\MSBRO\Files_on_Computers\report. Папка “report” открыта как сетевой ресурс и спустя NN перезагрузок компьютеров пользователей оказывается заполнена файлами в таком формате:
1 2 3 4 |
COMPUTER1-PC-ebadaev.txt COMPUTER2-PK-ederbenev.txt COMPUTER3-PC-esidorov.txt COMPUTER4-PK-petrov.txt |
В файлах содержится информация о найденных файлах на компьютерах пользователей.
Нам нужно взять содержимое папки C:\MSBRO\Files_on_Computers\report и вывести в CSV
Сделаем это скриптом на PorerShell msbro-generate-csv.ps1:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# получение владельцев cls cd c:\ $my_LanPath = 'C:\MSBRO\Files_on_Computers\report' $arr = @() gci $my_LanPath | ? {$_.PSIsContainer -eq $False} | % { $obj = New-Object PSObject $obj | Add-Member NoteProperty Directory $_.DirectoryName $obj | Add-Member NoteProperty Name $_.Name $obj | Add-Member NoteProperty Length $_.Length $arr += $obj } $arr | Export-CSV -notypeinformation "C:\MSBRO\Files_on_Computers\msbro-report.csv" |
В результате отработки скрипта получается файл C:\MSBRO\Files_on_Computers\msbro-report.csv примерно такого содержания:
1 2 3 4 5 6 |
#TYPE Selected.System.IO.FileInfo "FullName","LastWriteTime","Length","BaseName" "C:\MSBRO\Files_on_Computers\report\COMPUTER3-PC-esidorov.txt","08.12.2016 15:03:37","644","COMPUTER3-PC-esidorov" "C:\MSBRO\Files_on_Computers\report\COMPUTER4-PK-epetrov.txt","27.12.2016 10:17:52","2088","COMPUTER4-PK-epetrov" "C:\MSBRO\Files_on_Computers\report\COMPUTER1-PC-ebadaev.txt","20.01.2017 11:03:09","4095","COMPUTER1-PC-ebadaev" "C:\MSBRO\Files_on_Computers\report\COMPUTER2-PK-ederbenev.txt","19.01.2017 9:25:29","8248","COMPUTER2-PK-ederbenev" |
Как видите структура CSV простая. Нас прежде всего интересует поле “FullName” и “BaseName”. Поле “BaseName” можно парсить простым методом и определить имя пользователя в домене так как после второго разделителя “-” стоит имя пользователя домена. А поле “FullName” можно взять в качестве пути до отправляемого файла. Кому не нужно отправлять файлы – мы просто удаляем ненужные строки из нашего CSV фала.
Теперь уже можно начать отправлять файлы.
Проще всего это можно сделать PowerShell скриптом.
Я запускал его на сервере терминалов (Windows 2012R2 Eng) который используется как сервер консолей администрирования в домене. На этом сервере установлены консоли администрирования AD (иначе команда Import-Module activedirectory не отработает). Если лень мучиться установкой консолей – можно запустить на контроллере домена. Я не проверял, но думаю при наличии установленного PowerShell должно работать на любой версии Windows.
Сам скрипт msbro-send-report.ps1 (замените mydomain.ru на ваши значения):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# отправка файлов которые на компьютере cls cd c:\ Import-Module activedirectory $Smtp = 'hub1.mydomain.ru' $from = 'reports@mydomain.ru' $my_LanPath = 'C:\MSBRO\Files_on_Computers\report' $my_LanPathCSV = 'C:\MSBRO\Files_on_Computers\msbro-report.csv' $my_Date = Get-Date -UFormat "%Y-%m-%d" #берем значения C:\MSBRO\Files_on_Computers\msbro-report.csv в массив $BulkImport = Import-Csv $my_LanPathCSV ForEach ($Entry in $BulkImport) { Write-host “Пошла обработка: “$Entry.Basename -ForegroundColor Green sleep 1 #берем значения имени пользователя из названия файла и помещаем в $UserNameFromFile $a = $Entry.BaseName $b = $a.Split("-") $b.Count $UserNameFromFile = $b[-1] #ставим ограничения отправки. Слишком маленькие файлы C:\MSBRO\Files_on_Computers\report не отправляем. #Маленькие файлы в директории C:\MSBRO\Files_on_Computers\report означают что у пользователя на компьютере храниться мало файлов #и его можно не беспокоить по этому поводу if((Get-Item $Entry.FullName).length -gt 2kb){ Write-Host "Файл больше" #получаем e-mail пользователя из AD $user2Find = $UserNameFromFile $user = Get-ADUser $user2Find -Properties mail $EmailFromFile = $user.mail #формирует тело письма $Subject = 'Предупреждение: найдены файлы на компьютере' #само тело письма $Body = $Null $Body += "" $Body += "Добрый день!" $Body += "При сканировании Вашего компьютера были обнаружены локально хранимые документы, перечисленные во вложении." $Body += "Напоминаем вам, что хранение подобных файлов на жестком диске рабочей станции категорически запрещено." $Body += "Произведите копирование необходимых для работы файлов в персональную папку на общем сетевом ресурсе." $Body += "Данное предупреждение генерируется автоматически. Пожалуйста не отвечайте на него." $Body += "" #Конвертируем кодировку в utf8 $enc = New-Object System.Text.utf8encoding #отправляем сообщение Send-MailMessage -From $from -To $EmailFromFile -Subject $Subject -BodyAsHtml $Body -Encoding $enc -SmtpServer $Smtp -Attachments $Entry.FullName } else { Write-Host "Файл меньше" } } |
Собственно все.
Если, к примеру, был фалик C:\MSBRO\Files_on_Computers\report\COMPUTER56-PC-ivanov.txt
то скрипт определив поле e-mail для пользователя ‘ivanov’ отправит на этот e-mail письмо.
Вроде все.
Удачи!
Скрипты можно взять тут: Files_on_Computers