PowerShell: сбой сценария, поскольку объекты AD не были реплицированы достаточно скоро

У меня есть сценарий, который создает две группы, полный папок, и устанавливает разрешения для этих папок. В моей среде тестирования все эти процессы работают без проблем, но в моей производственной среде я сталкиваюсь с проблемой. Установка разрешений для папок не удалась, так как созданные мной группы не реплицировались через все 8 моих контроллеров домена. Может ли PowerShell работать только с одним DC, чтобы мне не пришлось ждать репликации? Должен ли я перевести скрипт в спящий режим на X секунд? Или есть какой-нибудь способ узнать, входят ли группы во все ДК или хотя бы в тот, в котором я работаю?

Вот как я делаю группы:

New-ADGroup -Name $Admin_GRP -path "OU=Users,OU=Sandbox,DC=test,DC=local" -GroupScope Global
New-ADGroup -Name $User_GRP -path "OU=Users,OU=Sandbox,DC=test,DC=local" -GroupScope Global

Вот как я устанавливаю разрешения для одной из папок:

#Set permissions on root directory
$ACL = Get-Acl $PathToFolder
#For Admin
$Permission = $Admin_GRP,"Write,ReadAndExecute,Synchronize,DeleteSubdirectoriesAndFiles","Allow"
$Access_Rule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$ACL.AddAccessRule($Access_Rule)
$ACL | Set-Acl $PathToFolder
#For Users
$Permission = $User_GRP,"ReadAndExecute,Synchronize","Allow"
$Access_Rule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$ACL.AddAccessRule($Access_Rule)
$ACL | Set-Acl $PathToFolder

4 ответа

Решение

Установите разрешение на SID новой группы вместо ее имени / имени samaccount.

В прошлом, когда я писал сценарии оболочки, я вызывал NLTEST.EXE, чтобы указать текущему ПК / серверу на конкретный контроллер домена (обычно я выбираю эмулятор PDC). Я не могу вспомнить, какой переключатель я использовал. Не уверен, поможет ли это.

Я решил использовать цикл while для проверки репликации группы.

#Wait for group replication
while ($Admin_GRP_CHK -ne 'group')
{$Admin_GRP_CHK = (Get-ADGroup $Admin_GRP).ObjectClass
trap {'Admin group not replicated yet. Waiting 10 seconds.' -f $_.Exception.Message;    continue}
Start-Sleep -Seconds 10
}
Write-Host 'Admin group exists'

У меня была точно такая же проблема. Оказывается, наша файловая система обновляет свой собственный кэш SID каждые 20 - 30 секунд. Поэтому, если бы я создал новый SID и сразу попытался применить его к папке, наша файловая система сказала бы, что SID неизвестен. Я изменил настройку в нашей файловой системе, чтобы она могла принимать "неизвестные" идентификаторы безопасности (даже если они были известны AD, и они просто не обновлялись). Больше информации здесь:

Проблемы с New-ADGroup, Set-ACL и сетевыми папками

Спать сценарий определенно не вариант, когда у вас есть 7,5 миллионов файлов и папок!

Другие вопросы по тегам