powershell 将文件夹安全性更新到未知深度的某个文件夹

问题描述 投票:0回答:1

我正在尝试更新文件夹的文件夹权限,直到它到达特定文件夹 一旦找到这些文件夹,它将需要停止并转到子文件夹内的下一个文件夹。例如,c: est\ 将有 20 个子文件夹,这些文件夹内可能还有 20 个子文件夹,其中一个文件夹称为 admin,并且具有里面的子文件夹。 我希望它更改所有文件夹的权限,直到到达 c: est ..... dmin 然后转到 c: est \ 而不更改 admin 文件夹内的文件夹的权限。
这是我目前的代码

$Folders = Get-ChildItem -Path "P:\100-LAN LLP" -Recurse -Directory
$Folders2 = Get-ChildItem -Path "P:\300-EE" -Recurse -Directory
$Folders3 = Get-ChildItem -Path "P:\400-House_Insp" -Recurse -Directory
$Folders4 = Get-ChildItem -Path "P:\500-AR" -Recurse -Directory
$Folders5 = Get-ChildItem -Path "P:\600-SP" -Recurse -Directory
$Folders6 = Get-ChildItem -Path "P:\800-Survey" -Recurse -Directory
$Folders7 = Get-ChildItem -Path "P:\900-VR" -Recurse -Directory
$Folders8 = Get-ChildItem -Path "P:\200-AE" -Recurse -Directory

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("LANNJ\Domain Users","Modify","deny")
$AccessRule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("LANNJ\Domain Users","Read","Allow")
$AccessRule3 = New-Object System.Security.AccessControl.FileSystemAccessRule("LANNJ\Domain Users","write","deny")

foreach($folder8 in $Folders8)
{
   $folder8.FullName

  if($folder8.name -eq "Admin" -or $folder.Name -eq "Cad" -or $folder.name -eq "20000-AE" -or $folder.name -like "proposals")
 {
    write-host $folder.name " was found"
    break
 }
    $acl = get-acl $folder.FullName 
    $acl.RemoveAccessRule($AccessRule)
    $acl.SetAccessRule($AccessRule2)
    $acl.SetAccessRule($AccessRule3)
    $acl | Set-Acl $folder8.FullName
    get-acl $folder8.FullName | fl
}

我尝试使用嵌套循环,但它继续进入管理等文件夹内的文件夹。 我尝试获取搜索文件夹的深度编号并将文件夹位置更改为负数,但它不起作用。

powershell acl ntfs
1个回答
0
投票

您将递归地获取所有文件夹,然后仅在名称等于这些术语中的任何一个时才忽略。在这些省略的文件夹下找到的任何子文件夹仍将被使用,因为您没有明确省略它们,例如“Admin”、“Cad”等。

这是一种递归获取文件夹的方法,同时忽略具有特定名称的文件夹及其子文件夹

function Get-FolderWithExclusions {
    param(
        [Parameter()]
        $Path,
        [Parameter()]
        [string[]]
        $FoldersToExclude
    )

    $folders = Get-ChildItem -Path $Path -Directory | Where-Object BaseName -NotIn $FoldersToExclude
    $folders
    $folders | ForEach-Object { 
        Get-FolderWithExclusions -Path $_ -FoldersToExclude $FoldersToExclude 
    }
}

$folder8 = 'C:\temp\200-AE'
$omit = 'Admin', 'Cad'
Get-FolderWithExclusions -Path $folder8 -FoldersToExclude $omit
© www.soinside.com 2019 - 2024. All rights reserved.