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