The -Path
的参数Set-Acl
需要一个路径字符串,而不是DirectoryInfo
目的。当通过后者时,仅其Name
财产扩大了,所以Set-Acl
正在当前工作目录中寻找具有给定名称的对象(在您的情况下显然是C:\Windows\system32
).
Change
Set-Acl -Path $folder -AclObject $acl
into
Set-Acl -Path $folder.FullName -AclObject $acl
问题就会消失。
话虽如此,您可能还想进行一些其他修改。
$folders = @((get-item $filePath))
$folders += Get-ChildItem $filePath -Recurse |
where { $_.PSIsContainer -ne $false }
##Need to do this in order to remove item 0 from the array, otherwise
##item 0 is the parent folder
$newfolders = $folders[1,2 + 3..($folders.length - 1)]
如果您不希望父文件夹位于数组中:首先不要将其放入数组中。由于您显然拥有 PowerShell v3,因此您可以使用-Directory
参数而不是where
filter.
$newfolders = Get-ChildItem $filePath -Recurse -Directory
foreach ($access in $acl.access) {
foreach ($value in $access.IdentityReference.Value) {
if ($value -eq $user) {
$acl.RemoveAccessRule($access) | Out-Null
}
}
}
每个访问规则只有一个身份引用,因此内部循环是没有意义的。
foreach ($access in $acl.access) {
if ($access.IdentityReference.Value -eq $user) {
$acl.RemoveAccessRule($access) | Out-Null
}
}
您的代码可以简化为如下所示:
$filepath = 'C:\ALCTEST'
$user = 'domain\username'
$folders = Get-ChildItem $filePath -Recurse -Directory
foreach ($folder in $folders) {
$acl = Get-Acl -Path $folder.FullName
foreach ($access in $acl.Access) {
if ($access.IdentityReference.Value -eq $user) {
$acl.RemoveAccessRule($access) | Out-Null
}
}
Set-Acl -Path $folder.FullName -AclObject $acl
}
或(使用管道)像这样:
$filepath = 'C:\ALCTEST'
$user = 'domain\username'
Get-ChildItem $filePath -Recurse -Directory | ForEach-Object {
$acl = Get-Acl -Path $_.FullName
$acl.Access | Where-Object {
$_.IdentityReference.Value -eq $user
} | ForEach-Object {
$acl.RemoveAccessRule($_) | Out-Null
}
Set-Acl -Path $_.FullName -AclObject $acl
}