Установите ACL с помощью импорта.Файл CSV

#powershell #foreach

#powershell #foreach

Вопрос:

Я пытаюсь найти способ получить сообщение «Le repertual suivant $ Path3 est au niveau 3, иль нет необходимости вносить изменения». когда у меня есть что-то в столбце 3.

Но когда он нашел что-то в столбце 3, он снова установил acl из столбца 2.

В этом примере он установил в 3 раза больше acl для «Boum2», моего файла «.csv»:

 Level1,Level2,Level3
Bada1,,
Bada1,,
Bada2,Boum1,
Bada2,Boum2,Eureka1
Bada2,Boum2,Eureka2
Bada2,Boum2,Eureka3
  

Мой код:

 ## Set Acl to directory ##
Import-Csv $ImportCsv -Delimiter ',' | ForEach-Object { $_.Level2; $_.Level3 }`
    {
    ## Set DL Group from name dir ##
    $Dir   = $_.Level2.ToUpper()
    $Dir2  = $_.Level3.ToUpper()
    $Path2 = [IO.Path]::Combine($Path, $Dir)
    $Path3 = [IO.Path]::Combine($Path, $Dir, $Dir2)
    If      ( $_.Level3 -contains "*" )                                                                   #                                                                                                  
        {                                                                                                 # 
        Write-output "Le repertoire suivant $Path3 est au niveau 3, il n'a pas besoin d'etre modifie."    #  <- This part doesn't work
        exit                                                                                              #   
        }                                                                                                 #     
    ElseIf  ( $_.Level2 -contains '#RECYCLE' )
        {
        Write-output "Le repertoire suivant $Path2  n'a pas besoin d'etre modifie."
        }
    Else
        {
        ## Get DL Group from name dir ## 

        Write-output "Modification des ACL sur: $Path2"
        $Acl   = Get-Acl -Path "$Path2"
        $DirCT = Get-ADGroup "DL`_$Dir`_$NameSrv`_CT" | ForEach-Object { $_.Name }
        $DirM  = Get-ADGroup "DL_$Dir`_$NameSrv`_M"   | ForEach-Object { $_.Name }
        $DirL  = Get-ADGroup "DL_$Dir`_$NameSrv`_L"   | ForEach-Object { $_.Name }
        $DirR  = Get-ADGroup "DL_$Dir`_$NameSrv`_R"   | ForEach-Object { $_.Name }

        # Heritance disable ##
        $isProtected = $true
        $preserveInheritance = $true
        $Acl.SetAccessRuleProtection($isProtected, $preserveInheritance)
        Set-Acl -Path $Path2 -AclObject $Acl
        
        ## Rule for all groups ##
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("$NetBIOSName$DirCT","FullControl","Allow")
        $acl.SetAccessRule($AccessRule)
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("$NetBIOSName$DirM","Modify","Allow")
        $acl.SetAccessRule($AccessRule)
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("$NetBIOSName$DirL","ReadAndExecute","Allow")
        $acl.SetAccessRule($AccessRule)
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("$NetBIOSName$DirR","Read","Deny")
        $acl.SetAccessRule($AccessRule)
        Set-Acl -Path $Path2 -AclObject $acl
        
        ## Remove BUILTINUtilisateurs ##
        $acl.Access | Where-Object {$_.IdentityReference -eq "BUILTINUtilisateurs"} | Foreach-Object {$acl.RemoveAccessRule($_) | Out-Null}
        Set-Acl -Path $Path2 -AclObject $acl
        }
    }
  

Спасибо, что нашли время для чтения и заранее благодарим.

Комментарии:

1. Вы, кажется, извлекаете переменные из ниоткуда здесь .. $Path , $NameSrv .. Также иногда вы добавляете обратные ссылки в код, которые не имеют никакого смысла. -contains это оператор, используемый для массивов . Измените это на -like . И, кроме того, вы должны добавить Deny Allow правила перед строгими правилами.

2. Привет, Тео, спасибо за ответ. -Да, переменная, которую вы не знаете (например: $Path, $NameSrv ..), просматривается пользователем скрипта. -Для оператора, которого я этого не знал, я изменю и протестирую снова.

Ответ №1:

Я получил решение от контакта:

 $strCSV = @'
Level1,Level2,Level3
Bada1,,
Bada1,,
Bada2,Boum1,
Bada2,#RECYCLE,
Bada2,Boum2,Eureka1
Bada2,Boum2,Eureka2
Bada2,Boum2,Eureka3
'@

$Path = $env:TEMP

$objCSV = $strCSV | ConvertFrom-Csv -Delimiter ','
## Set Acl to directory ##
$objCSV | ForEach-Object {
    ## Set DL Group from name dir ##
    $Dir   = $_.Level2.ToUpper()
    $Dir2  = $_.Level3.ToUpper()
    $Path2 = [IO.Path]::Combine($Path, $Dir)
    $Path3 = [IO.Path]::Combine($Path, $Dir, $Dir2)
    If(-not [System.String]::IsNullOrEmpty($_.Level3) )                                                                                                                                                                     
    {                                                                                                  
        Write-output "Le repertoire suivant $Path3 est au niveau 3, il n'a pas besoin d'etre modifie."                                                                                         #   
    }                                                                                                    
    ElseIf($_.Level2 -like '#RECYCLE' )
    {
        Write-output "Le repertoire suivant $Path2  n'a pas besoin d'etre modifie."
    }
    Else
    {
        ## Get DL Group from name dir ## 

        Write-output "Modification des ACL sur: $Path2"
    }
}