重置文件/文件夹权限&设置新权限

时间:2015-07-27 22:01:17

标签: powershell file-permissions

尝试使用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)从对象中删除权限,但我无法弄清楚如何为定义的所有用户权限执行此操作。

我想用干净的平板启动文件夹和文件,然后应用权限。我找到的所有示例仅显示如何删除特定用户的权限。

我在初始权限清理方面出错了吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

我漫无目的地使用此对象删除权限

  

$ acl.RemoveAccessRule($ ace)|出空

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

一旦我意识到这一点,我就使用 IdentityReference IsInherited 这些属性的组合来有选择地定位我要删除的权限。

脚本大而丑,但似乎有效。