Nov 26 2010

Powershell: Editer permissions sur une GPO

Afin de changer les permissions sur une GPO vous pouvez utiliser le CmdLet Set-GPPermissions disponible avec les RSAT (import-module grouppolicy). Ce CmdLet ne permet pas de mettre des permissions du type “deny” ou de remplacer directement des permissions. Nous allons voir comment remplacer des permissions à l’aide du Security Descriptor Definition Language qui est utilisé pour éditer les permissions de tous types d’objets (système de fichiers, objets AD…). Pour mieux appréhender ce langage et un outil pour lire le contenu d’une chaine SDDL je vous conseille cet article.

L’opération de remplacement de permission sur une GPO peut servir quand un administrateur d’une OU créé une GPO, il en est alors propriétaire et ne donne pas les droits en contrôle total au groupe d’administration auquel il appartient. Sur notre domaine composé de deux sites, un par OU, nous avons deux types de GPOs:

  • Les GPOs nommés “GLOBAL-*” créés par les administrateurs du domaine, et communes au SITE1 et au SITE2, elles ne sont pas modifiables par les administrateurs de site:

  • Les GPOs nommés “SITEx-*” créés par les administrateurs de l’OU SITE1 ou SITE2, lors de leur création par l’administrateur de site c’est le compte utilisateur de ce dernier (par ex: Site1-UserAdmin1 pour le SITE1) qui a les permissions sur la GPO:

Il faut alors remplacer les permissions de l’utilisateur Site1-UserAdmin1 avec le groupe SITE1-ADM pour que tous les administrateurs puissent modifier la GPO:

Le pack PowerShell utilisé sera Active Roles Management Shell for AD de Quest, le but du script est de remplacer les permissions des GPOs nommés “SITE1-*” si le groupe SITE1-ADM n’a pas de droits d’administration sur ces dernières (critère utilisé: peut effacer la GPO).

Une fois les GPOs nommés “SITE1-*” trouvées nous utilisons le CmdLet Get-QADPermission pour lire les permissions sur celles ci. Si le groupe SITE1-ADM n’a pas de droits d’administration sur une GPO, alors nous cherchons le compte ($AdminAccount) qui a les droits “effacer” sur celle ci à l’aide de la commande:

Get-QADPermission $gpo  |  foreach-object {if (( $_.AccountName -like $domain + '\*' ) -and ($_.Rights -like '*delete*')){$AdminAccount = $_.AccountName}}

Une fois le compte $AdminAccount trouvé il nous faut récupérer son SID ($oldsid) et exporter les permissions de la GPO au format SDDL, ceci grâce au CmdLet Get-QADObjectSecurity. Puis il faut remplacer dans la chaîne SDDL le SID du compte administrateur Site1-UserAdmin1 ($oldsid) par le SID du groupe d’administration SITE1-ADM ($newsid), enfin il nous faut injecter les nouvelles permissions dans la GPO grâce aux commandes suivantes, trouvées sur un post de BSonPoSH:

$sddlgpc2 = $sddlgpc.replace($oldsid,$newsid)
$DE = [ADSI]"LDAP://$gpodn"
$DE.psbase.ObjectSecurity.SetSecurityDescriptorSddlForm($sddlgpc2)
$DE.psbase.commitchanges()

A ce stade là vous avez édité la sécurité sur une seule partie de la GPO: Le Group Policy Container. Si vous allez sur la GPO dans GPMC vous aurez le message d’erreur suivant:

Le remplacement de permissions est à faire aussi sur la partie SYSVOL de la GPO (répertoire identifié par son GUID) à savoir le Group Policy Template. Cela se fait à l’aide du CmdLet Set-acl et la fonction SetSecurityDescriptorSddlForm comme décrit dans cet article.

Vous pouvez télécharger le script ici:

Il vous faudra remplacer les éléments suivants:

  • $domain: Nom NetBios du domaine.
  • $domainFQDN: FQDN du domaine.
  • $siteadmgrp: Groupe d’administration du site.
  • $gpoprefix: Préfixe du nom des GPOs gérées par les administrateurs de site.

Lancer le script REPLACE_SDDL_GPO.ps1, vous serez prompté avant le remplacement de la permission, le nom de la GPO et des comptes AD concernés sera affiché:

This post is also available in: Anglais

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs