Привет! Понадобилось мне недавно провести вручную операцию по удалению из 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
}
}
}