Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 脚本赢得';无法使用通配符设置权限_Powershell_Wildcard_Acl - Fatal编程技术网

Powershell 脚本赢得';无法使用通配符设置权限

Powershell 脚本赢得';无法使用通配符设置权限,powershell,wildcard,acl,Powershell,Wildcard,Acl,我编写了一个PowerShell脚本,用于在共享目录中的4000多个文件夹中创建子文件夹“Admin”(如果尚未存在)。创建子文件夹后,我需要子文件夹的权限仅用于域中的特定组。我没有收到任何错误,除了子文件夹上已经存在的文件夹错误,但是我让脚本运行了12个小时,它从未完成。我停止了脚本,发现所有管理子文件夹都已创建,但权限未设置 如果我在$文件夹中取出*通配符添加一个文件夹名称,它将非常有效。我怎样才能让它与*通配符一起工作,这样我就不必手动输入超过4000个文件夹名称 这是我的剧本: # If

我编写了一个PowerShell脚本,用于在共享目录中的4000多个文件夹中创建子文件夹“Admin”(如果尚未存在)。创建子文件夹后,我需要子文件夹的权限仅用于域中的特定组。我没有收到任何错误,除了子文件夹上已经存在的文件夹错误,但是我让脚本运行了12个小时,它从未完成。我停止了脚本,发现所有管理子文件夹都已创建,但权限未设置

如果我在
$文件夹中取出
*
通配符
添加一个文件夹名称,它将非常有效。我怎样才能让它与
*
通配符一起工作,这样我就不必手动输入超过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
}

只是不要在任何Acl cmdlet中使用通配符,我认为这行不通

在循环中设置单个文件夹的权限之前,或者如果以后必须这样做,只需循环所有文件夹并逐个设置所有
admin
文件夹的权限

一些提示:

从400个文件夹的小子集开始进行测试,并将当前处理的文件夹写入主机,以便查看进度

代码示例:

Get-ChildItem E:\Images\Equipment\ -Directory -Filter "admin" -Recurse | ForEach-Object {

  $acl = Get-Acl $_.FullName
   ... # do your permission stuff

}

(这与SQL Server有什么关系?)我正在SQL Server 2008 r2上运行脚本。我不明白。这是一个.ps1文件?您如何“在SQL Server上运行它”?即使您是通过SQL Server代理作业或其他方式运行此程序,我认为问题与SQL Server无关;无论从何处运行脚本,都可能需要解决通配符问题。该问题与sql server无关,我只是尽可能多地添加了信息。我将删除标记。你是说取出*并将文件夹名称按1乘1放入?@SaraBagford-不,我是说在所有目录中循环查找所有
admin
文件夹并设置每个文件夹的权限。我在回答中添加了一些代码。我同意循环查看
Get ChildItem
的结果并修改每个项目的ACL的建议,但如果层次结构中有更深层名为“admin”的文件夹,则使用过滤器递归可能会产生不希望的结果<代码>获取子项“E:\Images\device\*\Admin”-目录| ForEach Object…应该足够了。@PeterHahndorf-你就是那个人。谢谢你,你的代码工作得很好。