Я хочу удалить пользователя из разрешений папки с помощью 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
Вышеупомянутые две команды сняли всю безопасность, и пользователь / группа исчезли из списка разрешений. Я, вероятно, проведу дополнительное расследование, чтобы увидеть, можно ли это упростить, но он делает именно то, что мне нужно.
Спасибо за вашу помощь.