如何从大量文件夹中删除单个用户ACL?

迈克尔·H

我有一个很大的文件夹列表,我需要从每个文件夹中删除一个ACL。我正在尝试编写脚本以在短时间内完成该任务,而不是手动执行,但遇到了一些麻烦。

这是我到目前为止的内容:

$filepath = "C:\ALCTEST"
$user = "domain\username"

$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)]

foreach ($folder in $newfolders) {
    $acl = Get-Acl -Path $folder.FullName

    foreach ($access in $acl.access) {
        foreach ($value in $access.IdentityReference.Value) {
            if ($value -eq $user) {
                $acl.RemoveAccessRule($access) | Out-Null
            }
        }
    }

    Set-Acl -Path $folder -AclObject $acl
}

从调试期间的观察来看,我认为一切正常,直到尝试将ACL重新设置到文件夹中为止。当到达那条线时,我得到了错误

找不到路径“ C:\ Windows \ system32 \ 01”,因为它不存在。

ACLTEST的父文件夹内有七个名为“ 01” ...“ 07”的文件夹,带有用于测试的各种ACL。

我不确定从这里去哪里。我正在阅读这篇脚本专家的文章该文章对我有很大帮助,但是他的脚本似乎专注于手动输入文件夹路径,对于需要更改的数百个文件夹,我绝对不能这样做。

任何帮助表示赞赏。我是PowerShell脚本的新手,因此,如果您看到除上面脚本中所指的错误以外的其他任何错误,我很乐意听到。

安斯加·威彻斯(Ansgar Wiechers)

-Path参数Set-Acl需要一个路径字符串,而不是一个DirectoryInfo对象。传递后者时,只会Name扩展属性,因此Set-Acl也在当前工作目录(显然是您的情况C:\Windows\system32)中查找具有给定名称的对象

更改

Set-Acl -Path $folder -AclObject $acl

进入

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过滤器。

$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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Powershell从文件夹的根目录中仅删除子文件夹和子文件夹的内容,而不删除单个文件

获取特定用户的文件夹的ACL

如何删除文件夹中的文件

如何从文件夹中删除文件

Ansible:如何在单个任务中删除目录内的文件夹和文件?

如何从 GIT 中删除文件夹?

如何删除Jenkinsfile中的文件夹?

如何从Powershell中删除文件夹?

如何从跟踪中删除文件夹

如何从Windows 7/2008中每个用户的用户配置文件文件夹中删除“用户”组?

如何限制用户从回收站文件夹中删除文件?

如何删除与“用户|文件夹|其他”中的任何模式匹配的文件或目录?

如何删除Shell脚本文件中的特定if语句,并对单个文件夹内所有文件夹的所有文件执行相同的操作

如何从删除的文件夹中“删除”文件?

如何安全删除用户及其主文件夹?

如何使用DOS命令从文件夹中文件列表的文件名中删除单个字符?

我如何使用htaccess从网址中删除用户文件夹

删除用户个人资料文件夹中的.nuget文件夹是否安全?

如何在用户窗体中显示单个Windows资源管理器文件夹(无法导航到该文件夹)?

如何从文件夹中的文件中删除行?

如何从trapi中的上传文件夹中删除文件?

如何删除文件夹

Laravel 8:如何删除存储文件夹中的文件

如何从文件夹中删除所有文件?

如何删除.camel子文件夹中的旧文件?

如何从grub终端中删除文件或文件夹?

如何在 Python 中删除文件或文件夹?

如何在 Python 中删除文件或文件夹?

如何从bin文件夹中删除* .compiled文件?