Pull to refresh

Поддержка чистой шары для обмена файлами с помощью Powershell

Reading time 3 min
Views 17K
В каждой организации есть сетевой ресурс для обмена данными между пользователями, в который доступ имеют все. Что делать, когда пользователи сами не удаляют временные файлы из своих папок в «обмене» и ресурс начинает занимать слишком много места?

Задача:
1) Автоматическое очищение папок пользователей на общем сетевом ресурсе с сохранением структуры каталогов до 1 уровня. В корне ресурса расположены папки по фамилиям пользователей.
2) Сохранение данных за прошедший день в папке «Вчера» (права пользователей «только чтение»). Это нужно на случай, если пользователь забыл забрать важный документ вчера.
3) Логирование ошибок копирования файлов. Для анализа.
4) Возможность быстро перенастроить скрипт для использования на другом сервер\папке.
Исходные данные:
1) Сетевая папка «Обмен» на //server/obmen, которая смотрит на D:\obmen
Решение:


PowerShell позволяет работать с форматом xml штатными средствами, по этому для хранения настроек мы будем использовать именно этот формат.

Листинг файла settings.xml
<?xml version="1.0"?>
<settings>
	<MainDir>D:\obmen</MainDir>
	<OldDir> D:\obmen \Вчера</OldDir>
	<NameOldDir>Вчера</NameOldDir>
	<ShareName>Obmen</ShareName>
	<AclDir>D:\acl</AclDir>
	<service>test_service_1</service>
	<service>test_service_2</service>
</settings>


В файле скрипта clearshare.ps1 первым делом читаем настройки:
[xml]$settings = Get-Content D:\ps_project\Обмен\settings.xml
$mainfolder = $settings.settings.MainDir #Путь до папки обмена
$oldfolder = $settings.settings.OldDir #Путь папки Вчера
$services = $settings.settings.service #Сервисы, которые надо выключать
$ShareName = $settings.settings.sharename #Имя шары
$NameOldDir = $settings.settings.NameOldDir #Имя папки Вчера
$acldir = $settings.settings.AclDir #Имя эталонной папки acl


Для обеспечения доступности файлов закрываем все сеансы пользователей, отключив общий ресурс:
$share = Get-WmiObject Win32_Share | where {$_.name -eq $ShareName}
$share.delete()


Так же может потребоваться необходимость в отключении служб. Список служб описан в файле настроек, может увеличиваться.:
stop-service -DisplayName $services 


Очищаем папку Вчера, пишем ошибки в файл:
Remove-Item "$oldfolder\*" -Recurse -Force 2> "$mainfolder\remove_error_log.txt"


Перемещаем сегодня во вчера, при этом исключаем саму папку «Вчера»:
Get-ChildItem $mainfolder -Exclude $NameOldDir | Move-Item -destination $oldfolder 2> "$mainfolder\move_error_log.txt"


Создаем структуру папок пользователей:
foreach ($foldname in Get-ChildItem $oldfolder | where {$_.Attributes -eq 'Directory'})
{
$a = $mainfolder + "\" + $foldname.name;
New-Item -type directory -path $a
}


Включаем сервисы командой
start-service -DisplayName $services


Включаем шару
$share = [wmiClass] 'Win32_share'
$share.Create($mainfolder, $ShareName, "0", "1000")


Назначаем права READ для пользователей и FullControl для админов на папку «Вчера» через копирования с эталонной папки:
$acl = Get-Acl -path $acldir
Set-Acl -Path $oldfolder -AclObject $acl


Итак, мы получили скрипт, который сам будет очищать временные данные пользователей каждую ночь, оставляя возможность забрать данные для забывчивых людей. Так же он логирует ошибки копирования и имеет файл настройки для адаптации к любой общей папке.

Естественно скрипт необходимо добавить в планировщик заданий на удобное Вам время. (Спасибо ame)

UPD: Доработан процесс воссоздания структуры папок.
Tags:
Hubs:
+2
Comments 7
Comments Comments 7

Articles