Active Directory : changer le propriétaire d'objet en masse

Originally published at: Active Directory : changer le propriétaire d'objet en masse - RDR-IT

Vous trouvez ci-dessous des scripts, qui vont vous permettre de changer en masse le propriétaire de différents objets Active Directory comme : UtilisateursGroupesUnité d’OrganisationOrdinateurs Dans une situation “normale”, le propriétaire d’objets Active Directory est : Admins du domaineAdministrateurs de l’entrepriseBUILTIN\AdministrateursAUTORITE NT\Système Quand un objet est créé par un utilisateur non membre d’un des groupes ci-dessus…

Bonjour,

Trés bon article je suis entrain de creuser un peu plus la dessus pour prévenir les attaques par déléguations, qui passent par cet attribut, j’aimerai aussi signalé des erreurs sur le script,

Ligne 64 : ```
Admins du domaine") -and ($_.Owner -ne "$Domain\Enterprise Admins

Vous utilisez Admins du domaine pour les serveurs en français et Entreprise Admins pour la version anglaise !!! cette erreur sur le meme script est repetée dans plusieurs blogs.

Je vais ré écrire le script en l'automatisant pour éviter de saisir des valeurs en durs et qu'il devient compatible toutes version d'os.

Cordialement,

La solution passe par l’utilisation des « Well-Known SID » au lieu d’utiliser les « Name » -qui dépendent de la Culture) pour les Groupes/comptes à exclure. Ce sont tous des comptes/groupes Builtin.

Une autre chose à prendre en compte (notamment pour les comptes Utilisateurs) : Eviter d’utiliser une Array mais privililégier une GenericList et la methode .add pour ajouter le PSObject à chaque tour du foreach.
En effet, une array à une taille définie, à chaque tour, l’Array est reconstruite, sur 1000 tours (ou plus bien entendu. Mais 1000 Objets dans un AD, ce n’est pas grand chose :-)), la différence en terme de performance s’avère non négligeable.
$Test1 = (Measure-Command -Expression {
# Initialisation
$Result = [System.Collections.Generic.List[PSCustomObject]]::new()
for ($i = 1; $i -lt 1000; $i++)
{
$Result.add($i)
}
}).TotalMilliseconds

$Test2 = (Measure-Command -Expression {
# Initialisation
$Result = @()
for ($i = 1; $i -lt 1000; $i++)
{
$Result+=$i
}
}).TotalMilliseconds

$Test3 = (Measure-Command -Expression {
# Initialisation
$Result = [System.Collections.Generic.List[PSCustomObject]]::new()
for ($i = 1; $i -lt 10000; $i++)
{
$Result.add($i)
}
}).TotalMilliseconds

$Test4 = (Measure-Command -Expression {
# Initialisation
$Result = @()
for ($i = 1; $i -lt 10000; $i++)
{
$Result+=$i
}
}).TotalMilliseconds
Write-Host « Building GenericList from 1000 loops : $Test1 ms »
Write-Host « Building Array from 1000 loops : $Test2 ms »
Write-Host « Building GenericList from 10000 loops : $Test3 ms »
Write-Host « Building Array from 10000 loops : $Test4 ms »
<#
Building GenericList from 1000 loops : 3.3463 ms
Building Array from 1000 loops : 16.7284 ms
Building GenericList from 10000 loops : 14.3137 ms
Building Array from 10000 loops : 1253.0278 ms
#>
Il n’y a pas photo. :slight_smile: