Скрипт переноса общей папки на сервере с Windows

Понадобилось тут написать небольшой скрипт, после того как массово пришлось переносить папки на файловом сервере на другой диск. Выкладываю его сюда, вдруг кому-нибудь пригодится. Поменяйте только значение переменных на свои.

# Cоздание копии папки $NameFolder находящейся в $FolderPath1 в директорию $FolderPath2 и копирование ее содержимого со всеми атрибутами.
# Проверка есть ли подключения к общей папке. Если нет, то производится остановка расшаривания и докопирование содержимого. Исходная папка рекурсивно удаляется
# Логи сохраняются в папку $LogsFolderPath

$NameFolder = ‘Общая папка отдела’ #название исходной папки
$FolderSource= ‘F:\Общие папки\’ #путь к исходной папке (обязателен обратный слэш в конце пути)
$FolderDest = ‘D:\Общие папки\’ #путь к папке назначения (обязателен обратный слэш в конце пути)
$LogFolder = ‘C:\MoveFolderLogs\’ #путь к папке с логами (должна быть создана вручную)

$notshare = $false #определяем, что по-умолчанию исходная папка расшарена
$LogFile = $LogFolder + «sync-$NameFolder.log»
$FolderPath1 = $FolderSource+$NameFolder
$FolderPath2 = $FolderDest+$NameFolder

if (!(Test-Path -Path $LogFolder)){
Write-Host «Не создана папка для логов!» -ForegroundColor Yellow }

$SmbShare = Get-SmbShare | where {$_.Path -eq «$FolderPath1» }
if (!(Test-Path -Path $FolderPath2)){
$ACL = Get-Acl $FolderPath1 -Audit
Write-Host «Создание папки назначения» -ForegroundColor Green
New-Item -name $NameFolder -Path $FolderDest -ItemType Directory 1>$null
Set-Acl -AclObject $ACL -Path $FolderPath2
} else
{ Write-Host «Папка назначения уже создана» -ForegroundColor Green }
if (!($SmbShare)){
Write-Host «Исходная папка не расшарена» -ForegroundColor Yellow
$notshare = $true;
$NewSmbShareName = $NameFolder
}
if ((($SmbShare).CurrentUsers -eq «0») -or ($notshare -eq $true)){
if ($notshare -eq $false){
Write-Host «Зашаривание общей папки» -ForegroundColor Green
Remove-SmbShare -Name ($SmbShare).Name -Force
Write-Host «Начинаем копировать файлы общей папки…» -ForegroundColor Yellow -NoNewline
robocopy.exe $FolderPath1 $FolderPath2 /COPYALL /E /DCOPY:DAT /R:3 /W:5 /V /NP /NS /LOG+:$LogFile 1>$null
Write-Host «Завершено» -ForegroundColor Green
Write-Host «Расшаривание общей папки по новому расположению» -ForegroundColor Green
New-SmbShare -Name ($SmbShare).Name -Path $FolderPath2 -CachingMode None -ChangeAccess «Everyone» 1>$null
Write-Host «Удаление исходной папки» -ForegroundColor Green
Remove-Item -Path $FolderPath1 -Force -Recurse
}
else {
Write-Host «Начинаем копировать файлы общей папки…» -ForegroundColor Yellow -NoNewline
robocopy.exe $FolderPath1 $FolderPath2 /COPYALL /E /DCOPY:DAT /R:3 /W:5 /V /NP /NS /LOG+:$LogFile 1>$null
Write-Host «Завершено» -ForegroundColor Green
Write-Host «Расшаривание общей папки по новому расположению» -ForegroundColor Green
New-SmbShare -Name $NewSmbShareName -Path $FolderPath2 -CachingMode None -ChangeAccess «Everyone» 1>$null
Write-Host «Удаление исходной папки» -ForegroundColor Green
Remove-Item -Path $FolderPath1 -Force -Recurse
}
}
else {
Write-Host «Подключений к общей папке»($SmbShare).Name»:»($SmbShare).CurrentUsers -ForegroundColor Yellow
Write-Host «Начинаем копировать файлы общей папки…» -ForegroundColor Yellow -NoNewline
robocopy.exe $FolderPath1 $FolderPath2 /COPYALL /E /DCOPY:DAT /R:3 /W:5 /V /NP /NS /LOG+:$LogFile 1>$null
Write-Host «Завершено» -ForegroundColor Green
Write-Host «Запустите этот скрипт повторно после завершения активных SMB-подключений» -ForegroundColor Red
}

Powershell cкрипт для массового отображения/изменения ACL на файловом сервере

Привет! Понадобилось мне недавно провести вручную операцию по удалению из ACL лишней записи. Проблема была в том, что таких папок было около 50 штук. Спасало только то, что это нужно было сделать в папке с одним и тем же именем в разных директориях с одним общим корнем. Я это сделал вручную, так как задачу надо было выполнить быстро, но решил для себя написать скрипт, чтобы можно было быстро править ACL-листы папок в Windows. Необходимо только, чтобы на сервере был Powershell и немного его знания, так как скрипт практически не оттестирован и не проверен в реальной работе на большом количестве данных.
Вот он сам, по комментариям внутри него думаю будет понятно, что надо делать.

function Print_Dir($list_catalogs)
    {
         $Table = New-Object system.Data.DataTable “$Table_Security”  <#Создание таблицы для отображения ACL#>
         $column1 = New-Object system.Data.DataColumn Директория,([string])
         $column2 = New-Object system.Data.DataColumn ACL,([string])
         $column3 = New-Object system.Data.DataColumn Владелец,([string])
         $table.columns.add($column1)
         $table.columns.add($column2)
         $table.columns.add($column3)
         foreach ($Foundfolder in $list_catalogs) 
            {
                $Access = (Get-Acl $Foundfolder.FullName).AccessToString  
                $row = $table.NewRow()
                $row.Директория = $Foundfolder.FullName
                $row.ACL = “$Access”
                $row.Владелец = $AccessACL.Owner
                $table.Rows.Add($row)
            } 
         $table | format-table -Wrap
        
    }

function Found_Folder()
    {
                $Root_Path = Read-Host 'Введите корневую директорию'   <#Директория в которой производится поиск по-умолчанию#>
                $Target_Folder = Read-Host 'Введите название папки'    <#папка для поиска по-умолчанию #>
                $FFolder = Get-ChildItem $Root_Path -Recurse -Directory -Force -ErrorAction SilentlyContinue -Filter "$Target_Folder" <#Найденные папки#>
                return $FFolder
    }

While ($KEY='1')
{
$ACL_Key = Read-Host 'Что необходимо сделать? (1 - Вывести текущие значения ACL; 2 - Добавление; 3 - Удаление; 4 - Выход из программы)'
switch ($ACL_Key)
{
    1 
        {
                $Found_Folder = Found_Folder
                Print_Dir($Found_Folder)
        }
    2
        {
                $Found_Folder = Found_Folder
                $AccessRuleAdd = New-Object System.Security.AccessControl.FileSystemAccessRule "ONIX\TestAV", "Modify","ContainerInherit,ObjectInherit", "None","Allow" <#ACL, которую требуется добавить в папки#>
                foreach ($Foundfolder in $Found_Folder)
                    {
                        $ACL = $Foundfolder.GetAccessControl("Access")  
                        $ACL.AddAccessRule($AccessRuleAdd)
                        $Foundfolder.SetAccessControl($ACL)
                    } 
                Print_Dir($Found_Folder)
        }
    3
        {
                $Found_Folder = Found_Folder
                $AccessRuleDel = New-Object System.Security.AccessControl.FileSystemAccessRule "ONIX\TestAV", "Modify","ContainerInherit,ObjectInherit", "None","Allow" <#ACL, которую требуется добавить в папки#>
                foreach ($Foundfolder in $Found_Folder)
                    {
                        $ACL = $Foundfolder.GetAccessControl("Access")  
                        $ACL.RemoveAccessRule($AccessRuleDel)
                        $Foundfolder.SetAccessControl($ACL)
                    } 
                Print_Dir($Found_Folder)
        }
    4   
        {
            exit
        }
} 
}