使用 Set-Acl 和 FileSystemAccessRule.RemoveAccessRule 方法不起作用

Using Set-Acl and the FileSystemAccessRule.RemoveAccessRule method not working

总结:

我正在尝试编写脚本,跨多台计算机(实际上是文件部署脚本的一部分)删除“NT AUTHORITY\Authenticated 用户”组的特定文件夹(或文件)的修改权限。我有一些尝试执行此操作的代码,但它没有按预期工作。

上下文:

脚本在本地复制文件结构,并且特定文件(最好是整个文件夹结构)需要不可修改(非管理员)。设置只读设置是不够的,因为它可以被具有文件修改权限的人恢复。

我的尝试:

$folder = "C:\folder"
$file = "C:\folder\file.ext"

# Get the existing ACL
$acl = Get-Acl -Path $folder

# See what it looks like
$acl.Access | ft

# Target and remove the specific modify rule
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\Authenticated Users","Modify","Allow")
$acl.RemoveAccessRule($rule)

# Check that the modification to the PS object took
$acl.Access | ft

# Perform the modification
$acl | Set-Acl -Path $folder

# Check that the modification to the folder/file took
$acl = Get-Acl -Path $folder
$acl.Access | ft

我的结果:

.RemoveAccessRule() 调用对 ACL 没有影响(即使它 returns True),如第二个 $acl.Access | ft 所示。因此, Set-Acl 调用也没有效果。我怀疑也许我没有正确定位我想要的规则,也许 .RemoveAccessRule() 调用返回 True 只是因为技术上没有“失败”。但这只是瞎猜。

以下是 $acl.Access | ft 在所有情况下的输出:

           FileSystemRights AccessControlType IdentityReference                IsInherited InheritanceFlags PropagationFlags
           ---------------- ----------------- -----------------                ----------- ---------------- ----------------
                FullControl             Allow BUILTIN\Administrators                  True             None             None
                FullControl             Allow NT AUTHORITY\SYSTEM                     True             None             None
        Modify, Synchronize             Allow NT AUTHORITY\Authenticated Users        True             None             None
ReadAndExecute, Synchronize             Allow BUILTIN\Users                           True             None             None

我就是无法摆脱那个 Modify 标志。我也试过直接定位文件(在上面的代码中用 $file 替换对 $folder 的引用),但结果是一样的。我也尝试用 Authenticated Users 替换 NT AUTHORITY\Authenticated Users,但没有效果。

问题:

大概是我做错了。我精通 Powershell,但以前没有使用它来配置 NTFS 权限的经验。也许我需要以不同的方式定位所需的规则,或者我可能需要用 .SetAccessRule() 而不是以某种方式覆盖它...

如何使用 Powershell 实现此目的?感谢您的宝贵时间。

更新:也许继承也是一个问题?我不确定如何处理。

来源:

我的环境:

原来我的问题是文件夹继承了 C:\ 的修改权限。显然,在启用继承时修改权限只会不执行任何操作并且不会引发任何错误 (>:/)。解决方案是首先禁用文件夹的继承(复制现有权限),然后其余代码按预期工作。

在我的例子中,完全删除 NT AUTHORITY\Authenticated Users 的所有权限就足够了(并且比对现有权限执行修改更容易),因为 BUILTIN\Users 仍然具有读取权限。

# Get the existing ACL
$acl = Get-Acl -Path $item

# Disable inheritance (copying permissions), so the modifications will actually take
$acl.SetAccessRuleProtection($true,$true)

# Perform the modification
$acl | Set-Acl -Path $item

# Get the existing ACL again
$acl = Get-Acl -Path $item

# Target and remove all permission for "NT AUTHORITY\Authenticated Users"
$rules = $acl.Access | Where { $_.IdentityReference -eq $identity }
foreach($rule in $rules) {
    $acl.RemoveAccessRule($rule)
}

# Perform the modification
$acl | Set-Acl -Path $item