【问题标题】:Remove all permissions to a file, except the owner of the file删除文件的所有权限,文件所有者除外
【发布时间】:2017-04-26 00:41:49
【问题描述】:

我想做类似于How to Remove all permissions for a specific user? 的操作,但我想删除文件所有者以外的所有人 对文件的所有访问权限。

是否有可能以相对干净的方式做到这一点?

我想我可以打电话给get-acl C:\users\myusername\AppData\Local\Temp\TheFile.txt,然后遍历那里列出的所有用户,并删除每个用户的所有权利(如上面链接的问题中所述),但有没有更简单的方法?

【问题讨论】:

  • 定义“更容易”
  • icacls TheFile.txt /grant:r username:f /inheritance:r - 删除所有继承的和显式的权限,并将完全控制权授予“用户名”。这更容易吗?
  • 不相信,认为你是在正确的轨道上循环通过Get-ACL cmdlet获取所有者的文件,然后按照你引用的相同过程
  • 我测试了 TessellatingHeckler 提供的建议。这应该是最简单的方法。 “get-acl”可以帮你获取所有者,然后使用icacls.exe设置权限。

标签: powershell


【解决方案1】:

以下示例删除所有 ACL 并将 ACL 设置为允许文件所有者完全控制。

$acl = Get-Acl "$filePath"
$object = New-Object System.Security.Principal.Ntaccount($acl.owner)
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($acl.owner,"FullControl","Allow")
$acl.SetOwner($object)
$acl.SetAccessRuleProtection($true,$false)
$acl.SetAccessRule($AccessRule)
#$acl.SetAccessRule($sysUserAccessRule)
$acl | Set-Acl "$filePath"

【讨论】:

  • 优秀。我正在寻找一个示例,说明如何将 New-Object 用于单个文件的访问规则,而不是用于目录(可以设置传播选项)
  • 我注释掉了$acl.SetAccessRule($sysUserAccessRule),因为$sysUserAccessRule 在其他地方没有被引用。设置$filePath 应该是直观的。除此之外,我可以确认此代码有效。
【解决方案2】:

函数中的示例代码(简单地放在同一个脚本文件中,最重要的是您自己的代码):

function Remove-ACLEntries
{
    [CmdletBinding()]
    param(
        [string]$File
    )
    $authusers = ((New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-11').Translate([System.Security.Principal.NTAccount])).Value
    $acl = Get-Acl $File
    $acl.SetAccessRuleProtection($True, $False)
    $owner = $acl.owner;
    For($i=$acl.Access.Count - 1; $i -gt 0; $i--)
    {
        $rule = $acl.Access[$i]
        if ($rule.IdentityReference -ne $owner -or $rule.IdentityReference -eq $authusers) 
        {
            $acl.RemoveAccessRule($rule)
        }
    }
    Set-ACL -Path $file -AclObject $acl | Out-Null
}

使用单个文件:

Remove-ACLEntries -File c:\your\path\to\file.txt

使用多个文件:

$files = Get-Childitem c:\your\path -Recurse
foreach ($file in $files){ Remove-ACLEntries -File $file.Fullname }

注意:您用来操作此功能的用户必须拥有对该文件的完全访问权限。如果该功能不起作用,请尝试在管理员模式下运行 powershell。

你好,罗尼

【讨论】:

  • 罗尼,甜蜜的回答。谢谢!
  • 非常好 - 但当我运行它时 - 它删除了所有 ACL - 包括以前授予所有者的 ACL。
  • 这不会删除 Authenticated Users 条目。