【问题标题】:PowerShell Removing Folder Permission for Deleted AD User AccountsPowerShell 删除已删除 AD 用户帐户的文件夹权限
【发布时间】:2020-06-16 04:53:01
【问题描述】:

在 AD 中删除用户后,他们的名称将更改为 S-X-XX-XXX

我有一个脚本来提取 S-X-XX-XXX 具有权限的所有文件夹,我要做的是获取该文件夹列表并删除所有 S-X-XX-XXX。

代码

<# The S-* is to represent the User ID that I am wanting to remove their folder permissions #>
$TargetUser = "S-*"
$TargetPath = "C:\Depts"

$Paths = get-childitem -path $TargetPath -Recurse -Directory
$FolderList = $Paths.FullName

ForEach ($Folder in $FolderList) {
    $ACL = Get-Acl -Path $Folder
    $ACLlist = $ACL.Access | where {$_.IdentityReference -like "*mike*"} 
    $RemoveUser = $ACLlist.IdentityReference

    if ($ACLlist.IdentityReference -like "$TargetUser") {
        Write-Host $Folder
        Write-Host $RemoveUser
        $ACE = New-Object System.Security.Accesscontrol.FileSystemAccessRule($RemoveUser, "None", "ContainerInherit,ObjectInherit", "InheritOnly", "Deny")
        $ACL.AddAccessRule($ACE)
        Set-Acl -Path $Folder -AclObject $ACL
    }
}

我找到了有关如何从另一个文件夹权限设置文件夹权限的代码,但是这是不是通过继承添加的用户。

我知道我缺少一些简单的东西,所以任何帮助都会很棒。

Folder Permissions

非常感谢所有回复的人,感谢你们抽出时间提供帮助。

【问题讨论】:

  • 简单的解决方案:不要删除帐户。禁用帐户,进入特定的 OU 并在帐户名称中添加一个前缀,例如 X_
  • 代码没有做什么?脚本完成运行后,文件夹发生了什么变化?我只是想知道您在代码中到底缺少什么。
  • vonPryz - 帐户被禁用并从 Active Directory 中删除。这是我简化的房屋清洁任务,而不必遍历所有文件夹并手动完成。
  • Alex_P - 帐户没有被删除或根本没有更改。上面变量中的脚本为我提供了每个文件夹“C:\Depts\“Fold Name\Sub Folder Name”和域\SX-XX-XXX 帐户的完整路径。我可以看到分配给每个 SX- 的权限XX-XXX 以及我用来递归检查文件夹树中所有文件夹的另一个脚本。

标签: powershell directory permissions


【解决方案1】:

问题的答案如下。

Clear
$TargetUser = Read-Host -Prompt "Enter the target account you are targeting [Full or Parital works]"
$RootPath = Read-Host -Prompt "Enter the root folder to start looking in and removing permissions"

$SubPaths = Get-ChildItem -Path $RootPath -Recurse -Directory
$SubFolderList = $SubPaths.FullName
$rootdone = $false
$FolderPurgeList = @()

if ($rootdone -eq $false) {
        $ACL = Get-Acl -Path $RootPath
        $ACLlist = $ACL.Access | where {$_.IdentityReference -like "*$TargetUser*"} 
        $RemoveUser = $ACLlist.IdentityReference

        $count = $RemoveUser.count 
            ForEach ($UserName in $RemoveUser ) {
                $UserID = New-Object System.Security.Principal.Ntaccount ($UserName)
                $ACL.PurgeAccessRules($UserID)
                $ACL | Set-Acl $RootPath

                $itemHasPerm = New-Object –TypeName PSObject
                    $itemHasPerm | Add-Member –MemberType NoteProperty –Name "Target User" -Value $UserName
                    $itemHasPerm | Add-Member –MemberType NoteProperty –Name "Folder Path" -Value $RootPath

                $FolderPurgeList += $itemHasPerm
                $count -= 1
        }
    if ($count -eq 0 ) {
    $rootdone = $true
    }
}

if ($rootdone -eq $true) {
    ForEach ($SubFolder in $SubFolderList) {
        $ACL = Get-Acl -Path $SubFolder
        $ACLlist = $ACL.Access | where {$_.IdentityReference -like "*$TargetUser*"} 
        $RemoveUser = $ACLlist.IdentityReference
            ForEach ($UserName in $RemoveUser ) {
                $UserID = New-Object System.Security.Principal.Ntaccount ($UserName)
                $ACL.PurgeAccessRules($UserID)
                $ACL | Set-Acl $SubFolder

                $itemHasPerm = New-Object –TypeName PSObject
                    $itemHasPerm | Add-Member –MemberType NoteProperty –Name "Target User" -Value $UserName
                    $itemHasPerm | Add-Member –MemberType NoteProperty –Name "Folder Path" -Value $SubFolder

                $FolderPurgeList += $itemHasPerm
        }
    }
}

$FolderPurgeList
$DateStamp = Get-Date -Format "dd-MMM-yyyy - hh-ss"
$FolderPurgeList | Export-CSV $env:USERProfile\Documents\Purged_Permission_List_$DateStamp.csv

【讨论】:

    【解决方案2】:

    你可以在acl中检查什么类型的用户登录,你不需要模板。而且你必须去每个文件夹中的每个访问规则来检查这个,因为removeaccesrule方法只接受一个对象时间。

    $DebugPreference = 'Continue'
    $TargetPath = "D:\testdir"
    $Paths = get-childitem -path $TargetPath -Recurse -Directory
    $FolderList = $Paths.FullName
    
    ForEach ($Folder in $FolderList) {
        $ACLs = Get-Acl -Path $Folder
        foreach($acl in $ACLs.Access){
            If (($acl.IdentityReference -is [System.Security.Principal.SecurityIdentifier]) -and (-not $acl.IsInherited)){
            Write-Debug ("Removing ACl for {0}`r`n" -f $acl.IdentityReference.Value)
            [Void]$ACLs.RemoveAccessRule($acl)
            }
        }
    Write-Debug ("Setting ACL for {0}`r`n" -f $folder.FullName)
    Set-Acl -path $folder -aclObject $ACLs
    }
    

    我还有一个解决方案: 使用模块 ntfsSecurity(文件夹和文件管理manual) 列出所有无法再解析的权限。如果帐户不再可用,则通常会发生这种情况,因此权限显示为 SID 而不是帐户名称。

    要删除所有不可解析或孤立的权限,您可以使用以下行。但要非常小心,因为可能由于网络问题,该帐户无法解析。

    Install-Module -Name NTFSSecurity
    dir -Recurse | Get-NTFSOrphanedAccess | Remove-NTFSAccess
    

    【讨论】:

    • 我尝试了您的建议,但它并没有改变目标人。在测试用例中,我没有 S-X-XX-XXX 用户,因此我试图删除帐户“domain\mikeh”的非继承权限。当我运行代码执行时,没有错误,但没有任何变化。我会在上面贴一张文件夹权限的图片。
    • 我又检查了一次脚本,它完美地从文件夹中删除了用户。
    • 我想我知道发生了什么,目标位于根/目标文件夹中,并且由于启用了继承,它不会删除它们,因为没有检查根/目标文件夹。我最终不得不在代码中添加更多内容以使其适用于根/目标文件夹。
    猜你喜欢
    • 2012-11-10
    • 2017-11-21
    • 2015-05-15
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多