使用 PowerShell 从 ACL 中完全删除用户

使用 PowerShell 从 ACL 中完全删除用户

我希望使用 PowerShell 从文件夹权限中删除用户。我找到了很多关于如何删除用户权限的示例,但我实际上想完全删除该用户。

相当于在 Windows 资源管理器中执行以下操作:1. 右键单击​​文件夹并选择属性。2. 单击“安全”选项卡 3. 单击“编辑” 4. 突出显示用户或组。5. 单击“删除”

我在 PowerShell 中尝试模仿的是删除的单击操作。

提前致谢。

答案1

一般来说,Get-AclSet-Acl应该能够满足您的需要。但是,Get-Acl 有一个令人讨厌的限制,表现为由于权限不足而无法使用 Set-Acl 写回修改后的 ACL(除非您还拥有更改所有权的权限)。有关该问题的更多信息,请参阅这个问题

无论如何,对于文件系统权限,您可以使用返回的对象的方法来解决 Get-Acl 的限制Get-Item

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

如果你检查$acl.Access返回对象的属性,你会发现它是一个集合FileSystemAccessRule对象(又称 ACE 对象)。最终,您需要找到与要删除的用户相匹配的 ACE 子集,并忽略任何继承的 ACE。您实际上无法删除继承的 ACE,即使您尝试使用 GUI 删除它们,Windows 资源管理器也会告诉您这一点。无论如何,以下是获取该 ACE 子集的方法。

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

现在您已经有要删除的 ACE,您只需将它们从原始 ACL 中删除并将其写回文件夹。

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

答案2

正如 Simon 所建议的,以下命令将实现您所要删除的特定用户或组。

使用 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    
}

答案3

我创建的这个函数将在目标机器上为您调用 scriptBlock 来删除用户的权限。

function Remove-OGRemoteACL (){
<#
.SYNOPSIS
Invoke a script block on a target to remove ACL permissions

.DESCRIPTION
Invoke a script block on a target to change ACL permissions to remove the crazy delay GET-ACL can encounter.

.PARAMETER serverFQDN
the server that the script block is run on

.PARAMETER remotePath
the UNC path of the share to remove the permisions for the user from.

.PARAMETER userName
the user name of the domain user.

.EXAMPLE
Remove-OGRemoteACL -serverFQDN "bigserver.awesomedomain.net" -remotePath "\\bigserver.awesomedomain.net\my\amazingShare" -userName "awesomedomain\myuser"

.NOTES
    Name:       Remove-OGRemoteACL
    Author:     Richie Schuster - SCCMOG.com
    GitHub:     https://github.com/SCCMOG/PS.SCCMOG.TOOLS
    Website:    https://www.sccmog.com
    Contact:    @RichieJSY
    Created:    2023-03-14
    Updated:    -

    Version history:
    1.0.0 - 2023-03-14 Function Created
#>
[cmdletbinding()]
param (
    [parameter(Mandatory=$True,ValueFromPipeline=$true,Position=0)]
    [string]$serverFQDN,
    [parameter(Mandatory=$True,ValueFromPipeline=$true,Position=1)]
    [string]$remotePath,
    [parameter(Mandatory=$True,ValueFromPipeline=$true,Position=2)]
    [string]$userName
)
try{
    Write-Verbose "Invoking ACL removal commmand [Server: $($serverFQDN)] [userName: $($userName)] [Server: $($remotePath)]"
    Invoke-Command -ComputerName "$($serverFQDN)" -ScriptBlock { 
        $acl = Get-Acl $using:remotePath
        $userPrincipal = New-Object System.Security.Principal.Ntaccount("$using:userName")
        $acl.PurgeAccessRules($userPrincipal)
        $acl | Set-Acl $using:remotePath
    }
    Write-Verbose "Success invoking ACL removal commmand [Server: $($serverFQDN)] [userName: $($userName)] [Server: $($remotePath)]"
}
catch{
    Write-Error "Error - Failed invoking ACL removal commmand [Server: $($serverFQDN)] [userName: $($userName)] [Server: $($remotePath)]. Error: $($_.Exception.Message)"
}

}

例子:

Remove-OGRemoteACL -serverFQDN "bigserver.awesomedomain.net" -remotePath "\\bigserver.awesomedomain.net\my\amazingShare" -userName "awesomedomain\myuser" -Verbose

答案4

我已设法使用 zoredache 推荐的 NTFSSecurity 模块使其工作。

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

上述两个命令已删除所有安全性,并且用户/组已从权限列表中消失。我可能会做更多调查,看看是否可以简化,但它确实满足了我的需求。

感谢您的帮助。

相关内容