脚本不会使用通配符设置权限
Script Won't Set Permissions with Wildcard
我编写了一个 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
}
只是不要将通配符与任何 Acl cmdlet 一起使用,我认为这不会起作用。
之前在循环中对单个文件夹设置权限,或者如果您以后必须这样做,只需循环遍历所有文件夹并对所有 admin
个文件夹分别设置权限,一个一个。
一些小技巧:
从 400 个文件夹的一小部分开始进行测试,然后写入托管当前处理的文件夹,以便您可以看到进度。
代码示例:
Get-ChildItem E:\Images\Equipment\ -Directory -Filter "admin" -Recurse | ForEach-Object {
$acl = Get-Acl $_.FullName
... # do your permission stuff
}
我编写了一个 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
}
只是不要将通配符与任何 Acl cmdlet 一起使用,我认为这不会起作用。
之前在循环中对单个文件夹设置权限,或者如果您以后必须这样做,只需循环遍历所有文件夹并对所有 admin
个文件夹分别设置权限,一个一个。
一些小技巧:
从 400 个文件夹的一小部分开始进行测试,然后写入托管当前处理的文件夹,以便您可以看到进度。
代码示例:
Get-ChildItem E:\Images\Equipment\ -Directory -Filter "admin" -Recurse | ForEach-Object {
$acl = Get-Acl $_.FullName
... # do your permission stuff
}