{"id":269208,"date":"2024-06-06T12:03:55","date_gmt":"2024-06-06T12:03:55","guid":{"rendered":"https:\/\/www.ninjaone.com\/?post_type=script_hub&#038;p=269208"},"modified":"2024-06-06T12:03:55","modified_gmt":"2024-06-06T12:03:55","slug":"importer-des-utilisateurs-dans-active-directory-csv","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/fr\/script-hub\/importer-des-utilisateurs-dans-active-directory-csv\/","title":{"rendered":"Comment importer des utilisateurs dans Active Directory \u00e0 partir d&rsquo;un fichier CSV avec PowerShell ?"},"content":{"rendered":"<p>L&rsquo;une des applications les plus courantes de PowerShell que je vois utilis\u00e9es par les professionnels de l&rsquo;informatique est la synchronisation des informations avec Active Directory (AD). Il semble que tout le monde dispose d&rsquo;une source de donn\u00e9es externe qui est en corr\u00e9lation avec certains employ\u00e9s que nous devons int\u00e9grer dans AD. On peut s&rsquo;y attendre car AD est g\u00e9n\u00e9ralement le service informatique le plus utilis\u00e9 dans une entreprise et offre une excellente fonction non seulement d&rsquo;authentification mais aussi de d\u00e9p\u00f4t d&rsquo;informations sur les employ\u00e9s.<\/p>\n<p>Que vos donn\u00e9es soient stock\u00e9es dans une base de donn\u00e9es SQL personnalis\u00e9e ou dans un syst\u00e8me RH sophistiqu\u00e9, il est p\u00e9nible de devoir v\u00e9rifier deux endroits pour obtenir des informations telles que le d\u00e9partement de l&#8217;employ\u00e9, les groupes dont cet employ\u00e9 devrait \u00eatre membre, etc. Lorsque vous commencez \u00e0 synchroniser ces donn\u00e9es, le syst\u00e8me source peut modifier son sch\u00e9ma, changer d&rsquo;API, de serveurs, etc. Pour que la source de donn\u00e9es \u00e0 partir de laquelle vous effectuez la synchronisation reste toujours la m\u00eame et qu&rsquo;elle puisse \u00eatre facilement cr\u00e9\u00e9e \u00e0 partir d&rsquo;un certain nombre de syst\u00e8mes, il est conseill\u00e9 d&rsquo;obtenir ces donn\u00e9es dans un fichier CSV.<\/p>\n<p>Un simple fichier CSV peut \u00eatre export\u00e9 \u00e0 partir d&rsquo;\u00e0 peu pr\u00e8s n&rsquo;importe quel logiciel ou base de donn\u00e9es et, dans ce format, l&rsquo;administrateur dispose d&rsquo;une copie qu&rsquo;il peut modifier autant que n\u00e9cessaire, \u00e9vitant ainsi les demandes d&rsquo;une autre \u00e9quipe pour modifier une base de donn\u00e9es quelque part.<\/p>\n<p><!--more--><\/p>\n<p>Nous allons utiliser un script simple que vous pouvez utiliser aujourd&rsquo;hui pour voir comment nous pouvons synchroniser un attribut \u00e0 partir d&rsquo;un CSV vers un compte AD.<\/p>\n<p>Pour pr\u00e9parer le terrain, disons que j&rsquo;ai un fichier CSV appel\u00e9 C:Employees.csv. Ce fichier CSV comporte trois colonnes : FirstName (Pr\u00e9nom), LastName (Nom) et Department (D\u00e9partement). Vous aimeriez un script qui puisse trouver le compte AD associ\u00e9 \u00e0 ce pr\u00e9nom et \u00e0 ce nom, puis modifier le d\u00e9partement en fonction de ce qui figure dans le fichier CSV.<\/p>\n<p>Ce script, comme tout script de synchronisation, se compose principalement de trois \u00ab\u00a0phases\u00a0\u00bb Ces \u00ab\u00a0phases\u00a0\u00bb consistent \u00e0 lire les donn\u00e9es source (CSV dans cet exemple), \u00e0 trouver l&rsquo;identifiant unique des donn\u00e9es source de destination correspondant aux donn\u00e9es source (AD samAccountName dans cet exemple), et enfin \u00e0 \u00e9crire les attributs associ\u00e9s \u00e0 ce compte.<\/p>\n<p>La premi\u00e8re t\u00e2che consiste \u00e0 lire le fichier CSV.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$csvUsers = Import-Csv -Path 'C:Employees.csv'<\/pre>\n<p>Fait. L&rsquo;\u00e9tape suivante consiste \u00e0 trouver l&rsquo;identifiant unique qui correspond \u00e0 chaque ligne du fichier CSV. Comme nous n&rsquo;avons pas d&rsquo;identifiant unique dans le CSV, nous devons en cr\u00e9er un \u00e0 la vol\u00e9e. Pour obtenir cet identifiant unique, nous allons partir du principe que l&rsquo;initiale du pr\u00e9nom et le nom de famille d&rsquo;un employ\u00e9 correspondent toujours \u00e0 un nom de compte AD samAccountName. Nous devons cr\u00e9er cette recherche samAccountName, puis effectuer une requ\u00eate AD pour voir si un compte existe.<br \/>\nRemarque : Avant d&rsquo;aller plus loin, assurez-vous d&rsquo;avoir t\u00e9l\u00e9charg\u00e9 et install\u00e9 les <a href=\"https:\/\/learn.microsoft.com\/en-us\/troubleshoot\/windows-server\/system-management-components\/remote-server-administration-tools\" target=\"_blank\" rel=\"noopener\">outils d&rsquo;administration de serveur \u00e0 distance<\/a> pour votre syst\u00e8me d&rsquo;exploitation. Vous obtiendrez ainsi le module Active Directory PowerShell qui contient les cmdlets Get-AdUser et Set-AdUser que nous allons utiliser.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">foreach ($csvUser in $csvUsers) {\r\n    $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName\r\n    if ($adUser = Get-AdUser -Filter \"samAccountName -eq $userName\" -Properties $attributesToSync) {\r\n        ## Notre \"identifiant unique\" a \u00e9t\u00e9 trouv\u00e9. Proc\u00e9der \u00e0 la lecture des donn\u00e9es CSV et \u00e0 l'\u00e9criture des attributs\r\n    } else {\r\n        Write-Warning -Message 'Correspondance avec utilisateur non trouv\u00e9e'\r\n    }\r\n}<\/pre>\n<p>Une fois que nous disposons d&rsquo;un compte AD, nous pouvons lire chaque attribut associ\u00e9 au nom de l&#8217;employ\u00e9 dans le fichier CSV et \u00e9crire ces informations dans le compte AD trouv\u00e9. Remarquez ci-dessous que je d\u00e9finis la variable $attributesToSync et que je la lis par la suite. J&rsquo;ai fait cela pour pouvoir ajouter des attributs suppl\u00e9mentaires qui pourraient se trouver dans le CSV afin de les synchroniser \u00e9galement \u00e0 l&rsquo;avenir. L&rsquo;exemple ci-dessous v\u00e9rifie d&rsquo;abord si l&rsquo;attribut est le m\u00eame. Si ce n&rsquo;est pas le cas, il utilise Set-AdUser pour le modifier.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$attributesToSync = 'Department'\r\nforeach ($csvUser in $csvUsers) {\r\n    $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName\r\n    if ($adUser = Get-AdUser -Filter \"samAccountName -eq $userName\" -Properties $attributesToSync) {\r\n        foreach ($attr in $attributesToSync) {\r\n            if ($csvUser.$_ -ne $adUser.$_) {\r\n                $setParams = @{$_ = $csvUser.$_}\r\n                $adUser | Set-AdUser @setParams\r\n            }\r\n        }\r\n    } else {\r\n        Write-Warning -Message 'Correspondance avec utilisateur non trouv\u00e9e'\r\n    }\r\n}<\/pre>\n<p>Cet exemple ne fonctionnera qu&rsquo;avec les attributs qui sont des valeurs de cha\u00eene dans AD. Faites attention aux attributs tels que le gestionnaire, la date d&rsquo;expiration du compte, etc. Ces attributs exigent qu&rsquo;un objet du bon type soit construit avant d&rsquo;\u00eatre \u00e9crit dans AD. Il faudrait une autre s\u00e9rie d&rsquo;articles pour aborder les subtilit\u00e9s de la synchronisation AD et du travail avec les diff\u00e9rents attributs, mais j&rsquo;ai cr\u00e9\u00e9 un PowerShell appel\u00e9 PSADSync qui vous aide dans cette t\u00e2che. Il peut \u00eatre trouv\u00e9 en le prenant de la galerie PowerShell avec <a href=\"https:\/\/www.powershellgallery.com\/packages\/PSADSync\/1.2.88\" target=\"_blank\" rel=\"noopener\">Install-Module PSADSync<\/a>.<\/p>\n<p><em>Adam Bertram est un MVP (Microsoft Most Valuable Professional) Microsoft Windows Cloud et Datacenter Management. Il est l&rsquo;auteur de plusieurs cours de formation, contribue r\u00e9guli\u00e8rement \u00e0 de nombreuses publications imprim\u00e9es et en ligne et fait des pr\u00e9sentations dans divers groupes d&rsquo;utilisateurs et conf\u00e9rences. Vous pouvez retrouver Adam sur <a href=\"https:\/\/adamtheautomator.com\/\" target=\"_blank\" rel=\"noopener\">adamtheautomator.com<\/a> ou sur Twitter \u00e0 @adbertram.<\/em><\/p>\n","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":535,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"no","_lmt_disable":""},"operating_system":[4212],"use_cases":[4289],"class_list":["post-269208","script_hub","type-script_hub","status-publish","hentry","script_hub_category-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/script_hub\/269208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/comments?post=269208"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/media?parent=269208"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/operating_system?post=269208"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/use_cases?post=269208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}