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

в 18:34, , рубрики: powershell, Песочница, метки:

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

Задача:
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>
	<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 #Имя папки Вчера

Для обеспечения доступности файлов закрываем все сеансы пользователей, отключив общий ресурс:

$share = Get-WmiObject Win32_Share | where {$_.name -eq $ShareName}
$share.delete()

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

for($i=0; $i -le $services.Count; $i++)
{
Stop-Service $services[$i] 
}

Очищаем папку Вчера, пишем ошибки в файл:

Remove-Item "$oldfolder*" -Recurse  2> "$mainfoldererrorlog.txt"

Перемещаем сегодня во вчера, при этом исключаем саму папку «Вчера»:

Get-ChildItem $mainfolder -Exclude $NameOldDir | Move-Item -destination $oldfolder 2> "$mainfoldererrorlog.txt"

Создаем структуру папок пользователей:

Get-ChildItem $oldfolder | 
foreach ($_.Name){
if ($_.Name -ne "errorlog.txt")
{New-Item -type directory -path "$mainfolder$_"}
}

Включаем сервисы командой

for($i=0; $i -le $services.Count; $i++)
{
Start-Service $services[$i] 
}

Включаем шару

$share = [wmiClass] 'Win32_share'
$share.Create($mainfolder, $ShareName, "0", "1000")

Назначаем права READ для пользователей и FullControl для админов на папку «Вчера» через копирования с эталонной папки:

$acl = Get-Acl -path D:aclfolder
Set-Acl -Path $oldfolder -AclObject $acl

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

Автор: evgenx

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js