我有一个PowerShell脚本,我在共享目录中的超过4000个文件夹中创建了一个子文件夹" Admin",如果它还没有存在。创建子文件夹后,我需要子文件夹的权限仅适用于域中的特定组。我没有错误,除了文件夹已存在的子文件夹错误,但我让脚本运行了12个小时,它从未完成。我停止了脚本,发现所有Admin子文件夹都已创建,但未设置权限。
如果我在*
添加输入中取出$folder
通配符,则文件夹名称可以完美运行。如何使用*
通配符使其工作,以便我不必手动输入超过4000个文件夹名称?
这是我的剧本:
# If the folder for Equipment Images does not exist, make a new one and set the correct permissions.
$Location = "E:\Images\Equipment\*\"
$file = "E:\Images\Equipment\*\Admin"
foreach ($_ in (Get-ChildItem E:\Images\Equipment\*\)) {
if (($_.PSIsContainer -AND $_.name -eq "Admin")-eq $false) {
New-Item -Path $location -Name "Admin" -ItemType directory
$errorActionPreference = "continue"
}
$folder = "E:\Images\Equipment\*\Admin"
$acl = Get-Acl $folder
if ($acl.AreAccessRulesProtected) {
$acl.Access | % {$acl.purgeaccessrules($_.IdentityReference)}
} else {
$isProtected = $true
$preserveInheritance = $false
$acl.SetAccessRuleProtection($isProtected, $preserveInheritance)
}
$account = "recoequip\folder sales group"
$rights = [System.Security.AccessControl.FileSystemRights]::FullControl
$inheritance = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
$propagation = [System.Security.AccessControl.PropagationFlags]::None
$allowdeny = [System.Security.AccessControl.AccessControlType]::Allow
$dirACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($account,$rights,$inheritance,$propagation,$allowdeny)
$ACL.AddAccessRule($dirACE)
Set-Acl -aclobject $ACL -Path $folder
Write-Host $folder Permissions added
}
答案 0 :(得分:1)
不要在任何Acl cmdlet上使用通配符,我认为这不会起作用。
之前在循环中设置单个文件夹的权限,或者如果以后必须这样做,只需遍历所有文件夹并逐个设置所有admin
文件夹的权限。
一些提示:
从400个文件夹的一个小子集开始进行测试,然后将当前处理过的文件夹写入主机,以便查看进度。
代码示例:
Get-ChildItem E:\Images\Equipment\ -Directory -Filter "admin" -Recurse | ForEach-Object {
$acl = Get-Acl $_.FullName
... # do your permission stuff
}