【问题标题】:Reset file/folder permissions & Set new permissions重置文件/文件夹权限并设置新权限
【发布时间】:2015-10-18 06:53:36
【问题描述】:

尝试使用 powershell 重置从 Linux 机器复制过来的文件/文件夹的权限。

结构与此类似

E:\Parent Folder - No inheritance - Group based permissions
    |
    |
    Folder01 - No inheritance
           |
           |
           Subfolders and file - Group based permissions, inheritance
    Folder02 - No inheritance
           |
           |
           Subfolders and file - Group based permissions, inheritance
    Folder03 - No inheritance
           |
           |
           Subfolders and file - Group based permissions, inheritance
    Folder04 - No inheritance
           |
           |
           User Folder - User based permissions, No Inheritance
                     |
                     |
                     Inheritance

脚本当前首先运行 takeown 命令,然后是 icacls。 然后我遍历第一级文件夹以禁用继承。 然后将权限应用于文件夹。

这是我所拥有的样本。它只是针对我要设置的每个特定权限重复。

    Get-ChildItem -Path "$solidPath" -ErrorAction SilentlyContinue | ForEach-Object {
  $Item = $_.FullName

  If ( "$Item" -eq "E:\ParentFolder\Folder04" -or "$Item" -eq "E:\ParentFolder\Folder03" )
  {
    Write-Host "Do Not Touch" -ForegroundColor DarkRed
  }
  Else
  {
    $colRightsAdmin = [System.Security.AccessControl.FileSystemRights]"FullControl"

    $InheritanceFlagAdmin = [System.Security.AccessControl.InheritanceFlags]::ContainerInHerit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInHerit
    $PropagationFlagAdmin = [System.Security.AccessControl.PropagationFlags]::None

    $objTypeAdmin = [System.Security.AccessControl.AccessControlType]::Allow

    $objUserAdmin = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrators")

    $objACEAdmin = New-Object System.Security.AccessControl.FileSystemAccessRule($objUserAdmin, $colRightsAdmin, $objTypeAdmin)

    $objACLAdmin = Get-ACL "$Item"
    $objACLAdmin.AddAccessRule($objACEAdmin)

    Set-ACL "$Item" $objACLAdmin

我正在使用 takeown + icacls 来尝试重置所有权限。这最初运作良好,因为继承标志也被重置。

然后我使用链接中描述的方法在我的文件夹上设置适当的权限和继承,并让继承完成其余的工作 - Powershell & .net

该脚本适用于我的测试目录结构。但是在处理完文件夹和文件之后,当 icacls 命令运行时,我收到一条权限被拒绝消息(takeown 命令运行没有问题)。然后脚本的其余部分将失败。

我知道我可以使用 RemoveAccessRule($objACE) 从对象中删除权限,但我无法弄清楚如何为定义的所有用户权限执行此操作。

我想从头开始文件夹和文件,然后应用权限。我发现的所有示例仅显示如何删除特定用户的权限。

初始权限清理哪里出了问题?

【问题讨论】:

  • 或许您不应该直接破坏这些权限?您更改复制作业,使其将文件复制到现有目录结构(Folder01 和同一级别的其他人不应被覆盖),然后您设置一次权限并让它成为。
  • 我可以做到这一点。我首先需要更改用于复制的方法。目前我正在使用 rsync 从服务器中提取数据。但是,我仍然担心会有一些挥之不去的权限,这就是我希望完全从头开始的原因。
  • 如果复制文件时不复制ACL,则目标文件或文件夹将继承其父文件夹的ACL。所以,你设置了初始的基于组的权限,然后复制没有 ACL 的文件,你就完成了/
  • 有趣的想法。让我试一试。我可以设置初始文件夹结构,然后执行复制过程。感谢您的建议。虽然我希望我仍然可以找出我的脚本出错的地方。

标签: powershell file-permissions


【解决方案1】:

我最终得到了一些混乱的解决方案。

从 Linux 服务器获得数据的同步副本后,我使用 robocopy 将所有数据从一个文件夹“移动”到另一个文件夹。这完全重置了所有文件的所有权限。

做完之后,我学到了更多关于设置权限的知识,并意识到我一直在犯错误。

我是漫无目的地使用这个对象来删除权限

$acl.RemoveAccessRule($ace) |外空

这实际上是在我有机会设置任何其他权限之前删除文件的所有权限。所以我取消了调整权限的能力。

当我意识到这一点后,我结合使用属性 IdentityReferenceIsInherited 来有选择地定位我要删除的权限。

脚本又大又丑,但似乎可以工作。

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2023-03-28
    • 2017-10-05
    • 2013-12-22
    • 1970-01-01
    • 2012-03-02
    • 2012-09-04
    • 2023-04-07
    相关资源
    最近更新 更多