我希望使用 PowerShell 从文件夹权限中删除用户。我找到了很多关于如何删除用户权限的示例,但我实际上想完全删除该用户。
相当于在 Windows 资源管理器中执行以下操作:1. 右键单击文件夹并选择属性。2. 单击“安全”选项卡 3. 单击“编辑” 4. 突出显示用户或组。5. 单击“删除”
我在 PowerShell 中尝试模仿的是删除的单击操作。
提前致谢。
答案1
一般来说,Get-Acl
和Set-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
上述两个命令已删除所有安全性,并且用户/组已从权限列表中消失。我可能会做更多调查,看看是否可以简化,但它确实满足了我的需求。
感谢您的帮助。