Назад | Перейти на главную страницу

Полное удаление пользователя из ACL с помощью PowerShell

Я хочу удалить пользователя из разрешений папки с помощью PowerShell. Я нашел множество примеров того, как удалить разрешения пользователя, но на самом деле я хочу полностью удалить пользователя.

Эквивалентным будет выполнение следующих действий в проводнике Windows: 1. Щелкните папку правой кнопкой мыши и выберите «Свойства». 2. Щелкните вкладку «Безопасность». 3. Щелкните «Изменить». 4. Выделите пользователя или группу. 5. Нажмите "Удалить".

Это нажатие кнопки удаления, которое я пытаюсь имитировать в PowerShell.

Заранее спасибо.

Как предположил Саймон, следующие команды позволят добиться того, что вы ищете, просто удалить определенного пользователя или группу.

Используя модуль NTFSSecurity (https://gallery.technet.microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85)

Remove-NTFSAccess -AccessRights FullControl -Account DOMAIN\Group -Path c:\temp -AccessType Deny -AppliesTo ThisFolderSubfoldersAndFiles
Remove-NTFSAccess -AccessRights FullControl -Account DOMAIN\Group -Path c:\temp -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles

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

$path = "C:\Path\To\Folder"
$users = @{}

$users = Get-NTFSAccess $path | Where-Object {$_.Account -ne "DOMAIN\Exclude"} | Select-Object Account

foreach ($user in $users) {
    $removalAccount = $user.Account
    Write-Host "Removing account - $($removalAccount)"
    Remove-NTFSAccess -Path $path -Account $removalAccount -AccessRights FullControl -AccessType Allow
    Remove-NTFSAccess -Path $path -Account $removalAccount -AccessRights FullControl -AccessType Deny    
}

Вообще говоря, сочетание Get-Acl и Set-Acl должен быть в состоянии выполнить то, что вам нужно. Однако Get-Acl имеет досадное ограничение, которое может проявляться как невозможность записать измененный ACL обратно с помощью Set-Acl из-за недостаточных разрешений (если у вас нет прав на смену владельца). Более подробную информацию об этой проблеме можно найти в этот ТАК вопрос.

В любом случае, для разрешений файловой системы вы можете обойти ограничение Get-Acl, используя метод из объекта, возвращаемого Get-Item вместо.

$acl = (Get-Item C:\myfolder).GetAccessControl('Access')

Если вы изучите $acl.Access свойство возвращенного объекта, вы обнаружите, что это набор FileSystemAccessRule объекты (также известные как объекты ACE). В конечном итоге вы хотите найти подмножество тех ACE, которые соответствуют пользователю, которого вы пытаетесь удалить, а также игнорировать все, что унаследовано. На самом деле вы не можете удалить унаследованные ACE, и даже проводник Windows сообщит вам об этом, если вы попытаетесь удалить их с помощью графического интерфейса. В любом случае, вот как вы можете получить это подмножество ACE.

$acesToRemove = $acl.Access | ?{ $_.IsInherited -eq $false -and $_.IdentityReference -eq 'MYCOMPUTER\myuser' }

Теперь, когда у вас есть ACE, которые нужно удалить, вам просто нужно удалить их из исходного ACL и записать обратно в папку.

$acl.RemoveAccessRuleAll($acesToRemove)
Set-Acl -AclObject $acl C:\myfolder\

Мне удалось заставить это работать, используя модуль NTFSSecurity, рекомендованный zoredache.

Remove-NTFSAccess -AccessRights FullControl -Account DOMAIN\Group -Path c:\temp -AccessType Deny -AppliesTo ThisFolderSubfoldersAndFiles
Remove-NTFSAccess -AccessRights FullControl -Account DOMAIN\Group -Path c:\temp -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles

Вышеупомянутые две команды сняли всю безопасность, и пользователь / группа исчезли из списка разрешений. Я, вероятно, проведу дополнительное расследование, чтобы увидеть, можно ли это упростить, но он делает именно то, что мне нужно.

Спасибо за вашу помощь.