这可能会有点长,但要正确解释有些困难。
我建立了一个新的文件服务器。与原始文件共享相比,我们对共享的安全性结构进行了重大更改。用户仅具有读取访问权限,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这么好吗?我当然不是。
我确实有一个用于执行此操作的软件,但是它很慢且麻烦,因为我必须选择每个编号的文件夹,然后选择下面需要更改的文件夹,然后转到下一个编号的文件夹等等。它将立即更改所有权限,但是我需要选择它们,这需要很长时间。
谢谢!
答案 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
}
}
}