如何在 Dfs 中使用基于访问的枚举?

如何在 Dfs 中使用基于访问的枚举?

因此,Windows Server Dfs 显然从 Server 2008 开始支持基于访问的枚举 (ABE)。但它似乎不能开箱即用 - 仅在根中创建链接就会使它们对域中的每个人都可见,无论用户是否对目标具有读取权限。

那么我该如何让它工作呢?

答案1

根据Dfs ABE 文档,需要满足以下两个条件:

  1. 需要为相关的 Dfs 根目录启用 ABE
  2. 需要更新链接,以便需要查看这些链接的用户和组获得相应权限

因此 1. 相当简单。只需简单调用

dfsutil property abde enable \\<domain>\<DfsRoot>

会做需要做的事情。2. 更复杂,因为您可能不想手动设置链接权限。基本思路是编写脚本读取链​​接目标的权限并调用

dfsutil property acl grant \\<domain>\<DfsRoot> <permission list>

使用收集到的数据。Powershell 是这里的首选工具。这个脚本非常简单,只需在此处列出即可,它将处理一级 Dfs 链接:

# Dfs-SetLinkACEsToTargetACEs.ps1
# Automation for Access-Based Enumeration on Dfs links
# Call: .\Dfs-SetLinkACEsToTargetACEs.ps1 -DfsRootPath \\<Domain>\<DfsRoot>

Param (
        [Parameter(Mandatory=$true)]
        [string]$DfsRootPath 
)


Get-ChildItem $DfsRootPath | ForEach-Object {
    $DfsTargetPath = $_.FullName
    $AccessGrant = @()
    $AccessDeny = @()
    (Get-Acl $DfsTargetPath).Access | ForEach-Object {
        # exclude security principals which do not resolve correctly
        If (-not ($_.IdentityReference.Value -like "S-1-5-21*")) {
            If ($_.AccessControlType -eq "Allow") {
                $AccessGrant += "$($_.IdentityReference):R"
            }
            If ($_.AccessControlType -eq "Deny") {
                $AccessDeny += "$($_.IdentityReference):R"
            }
        }
    }
    If ($AccessGrant.Count -gt 0) {
        dfsutil property acl grant "$DfsTargetPath" $AccessGrant Protect Replace
    }
    If ($AccessDeny.Count -gt 0) {
        dfsutil property acl deny "$DfsTargetPath" $AccessDeny
    }
}

您显然可以通过在其中一台服务器上创建计划任务来自动执行此操作以使其频繁运行。

请注意,为了成功执行,您至少需要对链接目标拥有“读取权限”以及对 Dfs 根拥有管理委派。

相关内容