L’une des applications les plus courantes de PowerShell que je vois utilisées par les professionnels de l’informatique est la synchronisation des informations avec Active Directory (AD). Il semble que tout le monde dispose d’une source de données externe qui est en corrélation avec certains employés que nous devons intégrer dans AD. On peut s’y attendre car AD est généralement le service informatique le plus utilisé dans une entreprise et offre une excellente fonction non seulement d’authentification mais aussi de dépôt d’informations sur les employés.
Que vos données soient stockées dans une base de données SQL personnalisée ou dans un système RH sophistiqué, il est pénible de devoir vérifier deux endroits pour obtenir des informations telles que le département de l’employé, les groupes dont cet employé devrait être membre, etc. Lorsque vous commencez à synchroniser ces données, le système source peut modifier son schéma, changer d’API, de serveurs, etc. Pour que la source de données à partir de laquelle vous effectuez la synchronisation reste toujours la même et qu’elle puisse être facilement créée à partir d’un certain nombre de systèmes, il est conseillé d’obtenir ces données dans un fichier CSV.
Un simple fichier CSV peut être exporté à partir d’à peu près n’importe quel logiciel ou base de données et, dans ce format, l’administrateur dispose d’une copie qu’il peut modifier autant que nécessaire, évitant ainsi les demandes d’une autre équipe pour modifier une base de données quelque part.
Nous allons utiliser un script simple que vous pouvez utiliser aujourd’hui pour voir comment nous pouvons synchroniser un attribut à partir d’un CSV vers un compte AD.
Pour préparer le terrain, disons que j’ai un fichier CSV appelé C:Employees.csv. Ce fichier CSV comporte trois colonnes : FirstName (Prénom), LastName (Nom) et Department (Département). Vous aimeriez un script qui puisse trouver le compte AD associé à ce prénom et à ce nom, puis modifier le département en fonction de ce qui figure dans le fichier CSV.
Ce script, comme tout script de synchronisation, se compose principalement de trois « phases » Ces « phases » consistent à lire les données source (CSV dans cet exemple), à trouver l’identifiant unique des données source de destination correspondant aux données source (AD samAccountName dans cet exemple), et enfin à écrire les attributs associés à ce compte.
La première tâche consiste à lire le fichier CSV.
$csvUsers = Import-Csv -Path 'C:Employees.csv'
Fait. L’étape suivante consiste à trouver l’identifiant unique qui correspond à chaque ligne du fichier CSV. Comme nous n’avons pas d’identifiant unique dans le CSV, nous devons en créer un à la volée. Pour obtenir cet identifiant unique, nous allons partir du principe que l’initiale du prénom et le nom de famille d’un employé correspondent toujours à un nom de compte AD samAccountName. Nous devons créer cette recherche samAccountName, puis effectuer une requête AD pour voir si un compte existe.
Remarque : Avant d’aller plus loin, assurez-vous d’avoir téléchargé et installé les outils d’administration de serveur à distance pour votre système d’exploitation. Vous obtiendrez ainsi le module Active Directory PowerShell qui contient les cmdlets Get-AdUser et Set-AdUser que nous allons utiliser.
foreach ($csvUser in $csvUsers) { $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName if ($adUser = Get-AdUser -Filter "samAccountName -eq $userName" -Properties $attributesToSync) { ## Notre "identifiant unique" a été trouvé. Procéder à la lecture des données CSV et à l'écriture des attributs } else { Write-Warning -Message 'Correspondance avec utilisateur non trouvée' } }
Une fois que nous disposons d’un compte AD, nous pouvons lire chaque attribut associé au nom de l’employé dans le fichier CSV et écrire ces informations dans le compte AD trouvé. Remarquez ci-dessous que je définis la variable $attributesToSync et que je la lis par la suite. J’ai fait cela pour pouvoir ajouter des attributs supplémentaires qui pourraient se trouver dans le CSV afin de les synchroniser également à l’avenir. L’exemple ci-dessous vérifie d’abord si l’attribut est le même. Si ce n’est pas le cas, il utilise Set-AdUser pour le modifier.
$attributesToSync = 'Department' foreach ($csvUser in $csvUsers) { $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName if ($adUser = Get-AdUser -Filter "samAccountName -eq $userName" -Properties $attributesToSync) { foreach ($attr in $attributesToSync) { if ($csvUser.$_ -ne $adUser.$_) { $setParams = @{$_ = $csvUser.$_} $adUser | Set-AdUser @setParams } } } else { Write-Warning -Message 'Correspondance avec utilisateur non trouvée' } }
Cet exemple ne fonctionnera qu’avec les attributs qui sont des valeurs de chaîne dans AD. Faites attention aux attributs tels que le gestionnaire, la date d’expiration du compte, etc. Ces attributs exigent qu’un objet du bon type soit construit avant d’être écrit dans AD. Il faudrait une autre série d’articles pour aborder les subtilités de la synchronisation AD et du travail avec les différents attributs, mais j’ai créé un PowerShell appelé PSADSync qui vous aide dans cette tâche. Il peut être trouvé en le prenant de la galerie PowerShell avec Install-Module PSADSync.
Adam Bertram est un MVP (Microsoft Most Valuable Professional) Microsoft Windows Cloud et Datacenter Management. Il est l’auteur de plusieurs cours de formation, contribue régulièrement à de nombreuses publications imprimées et en ligne et fait des présentations dans divers groupes d’utilisateurs et conférences. Vous pouvez retrouver Adam sur adamtheautomator.com ou sur Twitter à @adbertram.