Таким образом, Windows Server Dfs, по-видимому, поддерживает перечисление на основе доступа (ABE) начиная с Server 2008. Но, похоже, это не работает из коробки - простое создание ссылок в корне делает их видимыми для всех в домене, независимо от того, есть ли у пользователей права на чтение для целевого объекта или нет.
Итак, как мне заставить его работать?
Согласно документация для DFS ABE, должны быть выполнены следующие два условия:
Итак, 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.