2013-07-31 2 views
1

Я пытаюсь установить разрешения для папки в Powershell. Моя проблема заключается в том, что я устанавливаю эти разрешения для активной учетной записи каталога, которая недавно была создана на одном из наших главных контроллеров домена. Поскольку учетная запись совершенно новая, она пока не распространяется ни на один из наших локальных контроллеров домена. Это вызывает проблемы для меня, так как я пытаюсь установить папку, чтобы разрешить этому пользователю изменять доступ, и Powershell бросает «Некоторые или все ссылки на идентификаторы не могут быть переведены». когда я пытаюсь вызвать SetAccessRule в ACL папки. Пример кода, показанного ниже.Настройка разрешений для пользователя, который еще не был распространен

#I'm actually setting more details than this for the account, but I abbreviated 
#the command to make it a little more readable 
New-ADUser -Name "Testy Testerson" -Server Master-DC.Domain.ca 

$DirectoryLocation = '\\Fileserver\SomeDirectory' 

New-Item "FileSystem::$DirectoryLocation" -ItemType directory 

$ACLNeedingModification = Get-ACL "FileSystem::$DirectoryLocation" 

$NewACLRule = New-Object System.Security.AccessControl.FileSystemAccessRule('Domain\Testy Testerson', 'Modify', 'Allow') 

$ACLNeedingModification.SetAccessRule($NewACLRule) #Error occurs here 

Set-ACL "FileSystem::$DirectoryLocation" $ACLNeedingModification 

Теперь, я думаю, был бы я мог бы сделать несколько солянку решения, используя SID пользователя, а и просто заклинивание, что и в ожидании распространения, чтобы завершить соединение. При этом я бы очень хотел найти способ, который позволил бы мне рассказать методу SetAccessRule, чтобы посмотреть на конкретный DC, аналогичный командам AD. Документация для SetAccessRule была довольно скудной по поводу того, как происходит разрешение, поэтому мне было интересно, есть ли у кого-нибудь лучший способ выполнить то, что я пытаюсь сделать.

Спасибо, что посмотрели!

ответ

1

Посмотрите на PowerShell: Script failing because AD objects have not replicated soon enough. У меня тоже такая же проблема, и я попытаюсь разобраться в течение следующих нескольких дней. Если я найду что-нибудь полезное, я обновлю этот ответ. Этот http://ss64.com/ps/set-addomainmode.html может быть полезен, но я еще не уверен.

Редактировать: Я написал командлет, ожидающий, что объект AD будет распространяться на все контроллеры домена.

<# 
.SYNOPSIS 
    Wait for an AD object to propagate to all domain controllers. 

.DESCRIPTION 
    This cmdlet enumerates the domain controllers in the current domain and 
    polls each one in turn until the specified object exists on each one. If 
    the object doesn't propagate completely inside the timeout time span, the 
    cmdlet will throw a System.TimeoutException. 

.PARAMETER LDAPFilter 
    The LDAP filter used to locate the object. 

.PARAMETER Timeout 
    The time span this command should wait before timing out. 

.NOTES 
    Author: Alex Barbur <[email protected]> 
#> 
function Wait-ADObject 
{ 
    [CmdletBinding(SupportsShouldProcess=$True)] 
    param 
    (
    [Parameter(Mandatory=$True)] 
    [string]$LDAPFilter, 
    [TimeSpan]$Timeout = '00:00:30' 
    ) 

    # calculate when we should stop 
    $stop = $(Get-Date) + $Timeout 
    Write-Verbose "Will check until $stop" 

    # iterate through the domain controllers 
    $domain = Get-ADDomain 
    foreach ($server in $domain.ReplicaDirectoryServers) 
    { 
     # wait for the object to replicate 
     Write-Verbose "Checking $server" 

     $object = $Null 
     while($object -eq $Null) 
     { 
      # check if we've timed out 
      $left = New-TimeSpan $(Get-Date) $stop 
      if($left.TotalSeconds -lt 0) 
      { 
       # timeout 
       throw [System.TimeoutException]"Object propagation has timed out." 
      } 

      # wait a bit and check again 
      Start-Sleep -Milliseconds 250 
      $object = Get-ADObject -LDAPFilter $LDAPFilter -Server $server 
     } 
    } 
} 

И вы можете использовать его вот так.

Import-Module ActiveDirectory 
New-ADUser -SamAccountName 'doe.1' 
Wait-ADObject -LDAPFilter '(sAMAccountName=doe.1)' 

Надеюсь, это кому-то полезно.

+0

Благодарим за информацию. Мы закончили тем, что немного ускорили тиражирование, так что это больше не проблема. Я надеялся, что мне не придется прибегать к ручному SID-именованию, чтобы избежать этого, но это перерывы! – AtomicReaction