#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"
}
}