脚本不会使用通配符设置权限

时间:2015-08-18 14:20:11

标签: powershell wildcard acl

我有一个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
}

1 个答案:

答案 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

}