【发布时间】:2020-10-23 10:43:28
【问题描述】:
当我在列中有内容时,我试图找到一种方法来显示“Le repertoire suivant $Path3 est au niveau 3, il n'a pas besoin d'etre modifie.” 3.
但是当他在第 3 列中找到某些东西时,他再次从第 2 列中设置了 acl。
在这个例子中,他在“Boum2”上设置了 3 倍的 acl,我的“.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 BUILTIN\Utilisateurs ##
$acl.Access | Where-Object {$_.IdentityReference -eq "BUILTIN\Utilisateurs"} | Foreach-Object {$acl.RemoveAccessRule($_) | Out-Null}
Set-Acl -Path $Path2 -AclObject $acl
}
}
感谢您抽出时间阅读并提前致谢。
【问题讨论】:
-
您似乎在这里不知从何处提取了变量..
$Path,$NameSrv.. 有时您在代码中添加了没有任何意义的反引号。-contains是用于数组 的运算符。将其更改为-like。顺便说一句,您应该在Allow规则之前添加Deny规则,以使其更加严格。 -
您好 Theo,感谢您的反馈。 - 是的,您不知道的变量(例如:$Path、$NameSrv..)由脚本用户看到。 -对于我不知道的操作员,我将更改并再次测试。
标签: powershell foreach