Sunday, October 12, 2014

FR (French) - Powershell 4.0 - Active Directory management - Organizational Units

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 :

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

No comments:

Post a Comment