English - note to reader: as I'm bilingual, I wanted to write a series of blog posts about Active Directory management with Powershell (4.0) - but in French. I intend to continue blogging in English as well, perhaps with a hybrid migration to Exchange Online - Office 365 (after the staged migration that you can find in my previous posts).
In the title of the blog post, I'll add the prefix "FR (French)" to distinguish them from my posts in English.
Feel free to translate the page with Google Translate or make comments if you'd like me to clarify something (in French or in English).
Google Translate
Créer une UO
La création d'une UO (unité d'organisation - OU en anglais) est simple. Si nous n'avons rien de plus à préciser (une description, par exemple), nous pouvons le faire avec l'applet suivant :
New-ADOrganizationalUnit "Laptops"
Par défaut, les UO sont protégées contre la suppression accidentelle. Si nous voulions que l'on puisse les supprimer plus facilement, nous pourrions désactiver cette protection ainsi :
New-ADOrganizationalUnit "Desktops" -ProtectedFromAccidentalDeletion:$false
Protéger une UO contre la suppression accidentelle
Si nous voulons protéger une UO (ou un autre objet) non-protégée, nous pouvons activer la protection avec l'applet suivant :
Afficher les propriétés d'une UO
A la différence d'autres objets, si nous voulons afficher les propriétés d'une UO, nous devons mettre le nom distingué (DN).
Par exemple, ceci ne donne rien :
Contrairement à l'applet Get-ADUser :
Get-ADUser Vik.Kirby
DistinguishedName : CN=Vik.Kirby,OU=ExchangeUsers,DC=mynet,DC=lan
Enabled : True
GivenName : Vik
Name : Vik.Kirby
[...]
En outre, si nous voulons afficher toutes les propriétés d'un objet (ceci est valable pour d'autres objets), il faut indiquer -properties *.
Dans ce cas, je veux afficher le nom et la valeur du paramètre "ProtectedFromAccidentalDeletion" mais ceci ne donne rien de plus que le nom :
Get-ADOrganizationalUnit "OU=Laptops,dc=mynet,dc=lan" | fl name,*protect*
name : Laptops
Mais si j'ajoute -propreties * ou même -prop *, j'ai l'élément que je voulais :
name : Laptops
ProtectedFromAccidentalDeletion : True
Dresser la liste des UO dans le domaine
Get-ADOrganizationalUnit -filter * | fl name
name : Domain Controllers
name : Microsoft Exchange Security Groups
name : ExchangeUsers
name : Servers
name : Laptops
name : Desktops
Remarquons qu'il faut mettre le paramètre -filter, quitte à ne mettre qu'un astérisque après. Sinon, PowerShell nous demandera des précisions :
Get-ADOrganizationalUnit | fl name
cmdlet Get-ADOrganizationalUnit at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter:
Il en va de même d'ailleurs pour Get-ADUser, Get-ADGroup et Get-ADComputer :
cmdlet Get-ADUser at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter: PS C:\>
cmdlet Get-ADGroup at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter: PS C:\>
cmdlet Get-ADComputer at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter:
Encore une fois, si je veux afficher les propriétés aussi, je dois ajouter -properties *
Note : je mets en raccourci -prop *, ce que PowerShell admet.
Get-ADOrganizationalUnit -prop * -filter * | fl name,*prot*
[...]
name : Laptops
ProtectedFromAccidentalDeletion : True
name : Desktops
ProtectedFromAccidentalDeletion : True
Dresser la liste des objets contenus dans une UO
Si nous ne savons pas quel type d'objet se trouve dans l'UO, nous pouvons les afficher tous avec la commande suivante. Je limite la recherche à l'UO "Lyon" avec le paramètre -SearchBase.
name objectClass
---- -----------
Lyon organizationalUnit
John.Thompson user
Kathy.Zuiker user
PC5 computer
Accounting group
Jane.Martin user
Note : "select" (Select-Object) a pour effet de n'afficher que les propriétés d'objet qui m'intéressent. "ft" (Format-Table) présente les données d'une certaine façon.
Compter le nombre d'objets dans une UO
Il s'agit ici de les compter littéralement au lieu d'en dresser la liste. C'est l'applet Measure-Object qui nous permet de le faire :
Count : 6
[...]
Ce compte inclut l'UO elle-même ainsi que les objets énumérés dans l'exemple précédent : trois utilisateurs, un groupe et un ordinateur.
Si nous voulons ne pas compter le conteneur, nous pouvons recourir au paramètre -SearchScope et indiquer "OneLevel" :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -SearchScope OneLevel -filter * | Measure-Object
Count : 5
[...]
Déplacer des objets entre deux UO
Si nous voulons déplacer les objets contenus dans une UO vers une autre, il est essentiel de bien cerner l'étendue de la recherche, comme dans l'exemple ci-dessus. Sinon, PowerShell inclura le conteneur (l'UO) lui-même et passera cet objet aussi à l'applet Move-ADObject. Cela pose plusieurs problèmes. D'abord, nous ne voulons sans doute pas déplacer l'UO elle-même à l'intérieur d'une autre UO. Ensuite, une opération de déplacement ("move") signifie, en fait, que l'objet à déplacer est copié dans le nouvel emplacement et supprimé dans l'emplacement d'origine. Or, les UO sont protégées contre la suppression et l'opération échouera. Si on tenait vraiment à déplacer l'UO, il faudrait désactiver cette protection au préalable.
Voici un exemple :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter * | Move-ADObject -TargetPath "OU=Nice,DC=mynet,DC=lan"
Move-ADObject : Access is denied
Nous pouvons écarter cet obstacle en précisant l'étendue ("scope") de la recherche comme ceci :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -SearchScope OneLevel -filter * | Move-ADObject -TargetPath "OU=Nice,DC=mynet,DC=lan"
Filtrer les résultats selon le type d'objet
Si nous souhaitons afficher les objets contenus dans l'UO en fonction de leur type, nous pouvons remplacer l'astérisque après le paramètre -filter par le type d'objet.
Voici les résultats sans filtre :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -SearchScope OneLevel -filter * | select name,objectClass | ft -auto
name objectClass
---- -----------
Jane.Martin user
John.Thompson user
Kathy.Zuiker user
PC5 computer
Note: le groupe "Accounting" n'y figure plus (il a été déplacé). L'UO elle-même n'y figure pas non plus en raison du paramètre -SearchScope et de la valeur "OneLevel".
Maintenant, nous allons rechercher seulement les objets de type "user" :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter {ObjectClass -eq "User"} | select name,objectClass | ft -auto
name objectClass
---- -----------
John.Thompson user
Kathy.Zuiker user
PC5 computer
Jane.Martin user
A notre grande surprise (peut-être), la recherche retourne aussi un ordinateur (PC5). C'est parce que la classe "computer" est en fait une sous-classe de la classe "user".
Afin d'exclure les ordinateurs, nous devons affiner notre filtrage :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter {(ObjectClass -eq "User") -and (ObjectCategory -eq "Person")} | select name,objectClass | ft -auto
name objectClass
---- -----------
John.Thompson user
Kathy.Zuiker user
Jane.Martin user
***
Créer une UO
La création d'une UO (unité d'organisation - OU en anglais) est simple. Si nous n'avons rien de plus à préciser (une description, par exemple), nous pouvons le faire avec l'applet suivant :
New-ADOrganizationalUnit "Laptops"
Par défaut, les UO sont protégées contre la suppression accidentelle. Si nous voulions que l'on puisse les supprimer plus facilement, nous pourrions désactiver cette protection ainsi :
New-ADOrganizationalUnit "Desktops" -ProtectedFromAccidentalDeletion:$false
Protéger une UO contre la suppression accidentelle
Si nous voulons protéger une UO (ou un autre objet) non-protégée, nous pouvons activer la protection avec l'applet suivant :
Set-ADOrganizationalUnit "OU=Desktops,DC=mynet,DC=lan" -ProtectedFromAccidentalDeletion:$true
Afficher les propriétés d'une UO
A la différence d'autres objets, si nous voulons afficher les propriétés d'une UO, nous devons mettre le nom distingué (DN).
Par exemple, ceci ne donne rien :
Get-ADOrganizationalUnit "Laptops"
Get-ADOrganizationalUnit : Cannot find an object with identity: 'Laptops' under: 'DC=mynet,DC=lan'.
Contrairement à l'applet Get-ADUser :
Get-ADUser Vik.Kirby
DistinguishedName : CN=Vik.Kirby,OU=ExchangeUsers,DC=mynet,DC=lan
Enabled : True
GivenName : Vik
Name : Vik.Kirby
[...]
En outre, si nous voulons afficher toutes les propriétés d'un objet (ceci est valable pour d'autres objets), il faut indiquer -properties *.
Dans ce cas, je veux afficher le nom et la valeur du paramètre "ProtectedFromAccidentalDeletion" mais ceci ne donne rien de plus que le nom :
Get-ADOrganizationalUnit "OU=Laptops,dc=mynet,dc=lan" | fl name,*protect*
name : Laptops
Mais si j'ajoute -propreties * ou même -prop *, j'ai l'élément que je voulais :
Get-ADOrganizationalUnit "OU=Laptops,dc=mynet,dc=lan" -prop * | fl name,*protect*
name : Laptops
ProtectedFromAccidentalDeletion : True
Dresser la liste des UO dans le domaine
Get-ADOrganizationalUnit -filter * | fl name
name : Domain Controllers
name : Microsoft Exchange Security Groups
name : ExchangeUsers
name : Servers
name : Laptops
name : Desktops
Remarquons qu'il faut mettre le paramètre -filter, quitte à ne mettre qu'un astérisque après. Sinon, PowerShell nous demandera des précisions :
Get-ADOrganizationalUnit | fl name
cmdlet Get-ADOrganizationalUnit at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter:
Il en va de même d'ailleurs pour Get-ADUser, Get-ADGroup et Get-ADComputer :
cmdlet Get-ADUser at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter: PS C:\>
cmdlet Get-ADGroup at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter: PS C:\>
cmdlet Get-ADComputer at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter:
Encore une fois, si je veux afficher les propriétés aussi, je dois ajouter -properties *
Note : je mets en raccourci -prop *, ce que PowerShell admet.
Get-ADOrganizationalUnit -prop * -filter * | fl name,*prot*
[...]
name : Laptops
ProtectedFromAccidentalDeletion : True
name : Desktops
ProtectedFromAccidentalDeletion : True
Dresser la liste des objets contenus dans une UO
Si nous ne savons pas quel type d'objet se trouve dans l'UO, nous pouvons les afficher tous avec la commande suivante. Je limite la recherche à l'UO "Lyon" avec le paramètre -SearchBase.
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter * | select name,objectClass | ft -auto
name objectClass
---- -----------
Lyon organizationalUnit
John.Thompson user
Kathy.Zuiker user
PC5 computer
Accounting group
Jane.Martin user
Note : "select" (Select-Object) a pour effet de n'afficher que les propriétés d'objet qui m'intéressent. "ft" (Format-Table) présente les données d'une certaine façon.
Compter le nombre d'objets dans une UO
Il s'agit ici de les compter littéralement au lieu d'en dresser la liste. C'est l'applet Measure-Object qui nous permet de le faire :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter * | Measure-Object
Count : 6
[...]
Ce compte inclut l'UO elle-même ainsi que les objets énumérés dans l'exemple précédent : trois utilisateurs, un groupe et un ordinateur.
Si nous voulons ne pas compter le conteneur, nous pouvons recourir au paramètre -SearchScope et indiquer "OneLevel" :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -SearchScope OneLevel -filter * | Measure-Object
Count : 5
[...]
Déplacer des objets entre deux UO
Si nous voulons déplacer les objets contenus dans une UO vers une autre, il est essentiel de bien cerner l'étendue de la recherche, comme dans l'exemple ci-dessus. Sinon, PowerShell inclura le conteneur (l'UO) lui-même et passera cet objet aussi à l'applet Move-ADObject. Cela pose plusieurs problèmes. D'abord, nous ne voulons sans doute pas déplacer l'UO elle-même à l'intérieur d'une autre UO. Ensuite, une opération de déplacement ("move") signifie, en fait, que l'objet à déplacer est copié dans le nouvel emplacement et supprimé dans l'emplacement d'origine. Or, les UO sont protégées contre la suppression et l'opération échouera. Si on tenait vraiment à déplacer l'UO, il faudrait désactiver cette protection au préalable.
Voici un exemple :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter * | Move-ADObject -TargetPath "OU=Nice,DC=mynet,DC=lan"
Move-ADObject : Access is denied
Nous pouvons écarter cet obstacle en précisant l'étendue ("scope") de la recherche comme ceci :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -SearchScope OneLevel -filter * | Move-ADObject -TargetPath "OU=Nice,DC=mynet,DC=lan"
Filtrer les résultats selon le type d'objet
Si nous souhaitons afficher les objets contenus dans l'UO en fonction de leur type, nous pouvons remplacer l'astérisque après le paramètre -filter par le type d'objet.
Voici les résultats sans filtre :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -SearchScope OneLevel -filter * | select name,objectClass | ft -auto
name objectClass
---- -----------
Jane.Martin user
John.Thompson user
Kathy.Zuiker user
PC5 computer
Note: le groupe "Accounting" n'y figure plus (il a été déplacé). L'UO elle-même n'y figure pas non plus en raison du paramètre -SearchScope et de la valeur "OneLevel".
Maintenant, nous allons rechercher seulement les objets de type "user" :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter {ObjectClass -eq "User"} | select name,objectClass | ft -auto
name objectClass
---- -----------
John.Thompson user
Kathy.Zuiker user
PC5 computer
Jane.Martin user
A notre grande surprise (peut-être), la recherche retourne aussi un ordinateur (PC5). C'est parce que la classe "computer" est en fait une sous-classe de la classe "user".
Afin d'exclure les ordinateurs, nous devons affiner notre filtrage :
Get-ADObject -SearchBase "OU=Lyon,DC=mynet,DC=lan" -filter {(ObjectClass -eq "User") -and (ObjectCategory -eq "Person")} | select name,objectClass | ft -auto
name objectClass
---- -----------
John.Thompson user
Kathy.Zuiker user
Jane.Martin user
Thank you for reading the article about FR (French) - Powershell 4.0 - Active Directory management - Organizational Units on the blog NEW TECH If you want to disseminate this article on please list the link as the source, and if this article was helpful please bookmark this page in your web browser by pressing Ctrl + D on your keyboard keys.