在Windows中与Powershell共享多个级别的文件和文件夹的权限

时间:2020-05-20 12:44:29

标签: powershell permissions

这可能会有点长,但要正确解释有些困难。

我建立了一个新的文件服务器。与原始文件共享相比,我们对共享的安全性结构进行了重大更改。用户仅具有读取访问权限,1个组具有修改权限,Domain Admins具有完全控制权限。

在共享下有编号的文件夹。有881个。在这些文件夹中的每个文件夹中,都有基于文件夹模板的另一组文件夹。模板权限已进行了调整,因此只要将其复制并粘贴到新的编号文件夹中,它便具有适当的权限。该模板不允许继承。

我的问题是在现有881文件夹和以下文件夹中。复制数据时,证券未正确交出或被重写为共享权限。无论如何,我需要使现有文件夹结构与新模板匹配,以便每个人都具有正确的访问权限。有没有办法编写一个Powershell脚本来做到这一点。下面是一个结构外观和我必须做的例子。

-Share    
    -001            
      -Folder 1        
      -Folder 2        
      -Folder 3        
    -002    
      -Folder 1    
      -Folder 2    
      -Folder 3    

我需要能够添加组1来对文件夹1及其文件进行修改,组3来对文件夹2及其文件进行修改,组7能够对文件夹3及其文件进行修改。

实际上比这要复杂一点,但这是一般前提。在编号的文件夹下实际上有26个文件夹。我需要更改其中9个的权限。其中有4个用于同一组,但其余的都是不同的组。我还必须维护当前权限。

有人对Powershell这么好吗?我当然不是。

我确实有一个用于执行此操作的软件,但是它很慢且麻烦,因为我必须选择每个编号的文件夹,然后选择下面需要更改的文件夹,然后转到下一个编号的文件夹等等。它将立即更改所有权限,但是我需要选择它们,这需要很长时间。

谢谢!

1 个答案:

答案 0 :(得分:0)

使用哈希表来映射文件夹->本金,然后遍历所有根目录文件夹并应用新的ACE:

$principalMapping = @{
  'folder1' = @('Domain\Group1')
  'folder2' = @('Domain\Group3')
  'folder3' = @('Domain\Group7')
}

# Loop through all top level folders
foreach($topLevelFolder in Get-ChildItem C:\path\to\share\root\ -Directory){
  # Loop through each inner folder 
  foreach($innerFolder in $topLevelFolder |Get-ChildItem -Directory){
    # See if we have a corresponding entry in our mapping table
    if($principalMapping.ContainsKey($innerFolder.Name.ToLower())){
      # if so, obtain the current ACL
      $acl = Get-Acl $innerFolder.FullName

      # Loop through the list of groups to add (currently only one in each folder)
      foreach($principal in $principalMapping[$innerFolder.Name.ToLower()]){
        # Create your Access Control Entry
        $ace = [System.Security.AccessControl.FileSystemAccessRule]::new($principal, 'Modify', 'Allow')
        $acl.Add($ace)
      }

      # Update the ACL on the directory
      Set-Acl $innerFolder.FullName -AclObject $acl
    }

  }
}