2010-10-04 5 views
1

J'ai un script qui crée deux groupes, une main pleine de dossiers et définit les autorisations sur ces dossiers. Dans mon environnement de test, tous ces processus fonctionnent sans problème, mais dans mon environnement de production, je rencontre un problème. La définition des autorisations sur les dossiers échoue car les groupes que j'ai créés n'ont pas été répliqués via les 8 contrôleurs de domaine. PowerShell peut-il fonctionner avec un seul contrôleur de domaine afin que je n'ai pas à attendre la réplication? Devrais-je mettre le script en veille pendant X secondes? Ou y at-il un moyen de voir si les groupes sont sur tous les DC ou du moins sur celui que je travaille?PowerShell: échec du script car les objets AD n'ont pas été répliqués suffisamment tôt.

Voilà comment je fais les groupes:

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 

Voilà comment je suis en train de les autorisations sur un des dossiers:

#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 

Répondre

1

Définissez l'autorisation sur le SID du nouveau groupe au lieu de son nom/samaccountname.

+0

Je reçois la même erreur « Exception appelant "Traduire" avec "1" argument (s): " Une partie ou toutes les références d'identité ne peuvent pas être traduits" A: ligne: 36 ombles: 83 + $ Admin_SID = (new-object system.security.principal.NtAccount ($ Admin_GRP)). translate <<<< ([system.security.principal.securityidentifier]). value " – pizzim13

+0

Oui, vous rencontrez le même problème ici, vous devriez lire le SID de l'objet créé (je suppose que $ Admin_GRP est le nom du compte et non un objet) – Remko

0

J'ai décidé d'utiliser une boucle while pour vérifier la réplication de groupe.

#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' 
+0

Dans un environnement AD plus grand, la réplication peut prendre du temps, donc je pense que c'est une mauvaise approche. – Remko

1

Dans le passé, lors de l'écriture des scripts shell, je l'ai appelé Nltest.exe à pointer le PC/serveur en cours à un courant continu spécifique (normalement je choisis l'émulateur PDC). Je ne me souviens pas quel commutateur j'ai utilisé. Je ne sais pas si cela aidera.

0

J'ai eu le même problème. Il s'avère que notre système de fichiers a seulement mis à jour son propre cache de SID toutes les 20 à 30 secondes. Donc, si j'ai créé un nouveau SID et essayé de l'appliquer immédiatement à un dossier, notre système de fichiers dirait que le SID était inconnu. J'ai modifié un paramètre sur notre système de fichiers pour lui permettre d'accepter des SID 'inconnus' (même s'ils étaient connus d'AD et qu'il n'avait pas été mis à jour). Plus d'infos ici:

Issues With New-ADGroup, Set-ACL and Network Folders

Sleeping le script est certainement pas une option lorsque vous avez 7,5 millions de fichiers et dossiers!

Questions connexes