{"id":776641,"date":"2026-03-31T14:21:03","date_gmt":"2026-03-31T14:21:03","guid":{"rendered":"https:\/\/www.ninjaone.com\/?post_type=script_hub&#038;p=776641"},"modified":"2026-03-31T14:21:03","modified_gmt":"2026-03-31T14:21:03","slug":"import-users-active-directory-csv","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/pt-br\/script-hub\/import-users-active-directory-csv\/","title":{"rendered":"Como importar usu\u00e1rios para o Active Directory a partir de um arquivo CSV usando o PowerShell"},"content":{"rendered":"<p>Um dos aplicativos mais comuns do PowerShell que vejo os profissionais de TI usarem \u00e9 a sincroniza\u00e7\u00e3o de informa\u00e7\u00f5es com o Active Directory (AD). Parece que todo mundo tem alguma fonte de dados externa que se correlaciona com alguns funcion\u00e1rios que precisamos colocar no AD. Isso \u00e9 de se esperar, pois o AD normalmente \u00e9 o servi\u00e7o de TI mais usado em uma organiza\u00e7\u00e3o e oferece um excelente recurso n\u00e3o apenas como autentica\u00e7\u00e3o, mas tamb\u00e9m como reposit\u00f3rio de informa\u00e7\u00f5es dos funcion\u00e1rios.<\/p>\n<p>Independentemente de voc\u00ea ter dados armazenados em um banco de dados SQL personalizado ou em algum sistema de RH sofisticado, \u00e9 uma chatice ter que verificar dois pontos se precisar de informa\u00e7\u00f5es como o departamento do funcion\u00e1rio, os grupos dos quais o funcion\u00e1rio deve ser membro e assim por diante. Quando voc\u00ea come\u00e7a a sincronizar esses dados, o sistema de origem pode mudar seu esquema, pode mudar as APIs, os servidores e assim por diante, o que significa um retrabalho de c\u00f3digo. Para garantir que a fonte de dados da qual voc\u00ea est\u00e1 sincronizando permane\u00e7a sempre a mesma e possa ser facilmente criada a partir de qualquer n\u00famero de sistemas, \u00e9 uma boa ideia colocar esses dados em um arquivo CSV.<\/p>\n<p>Um simples arquivo CSV pode ser exportado de praticamente qualquer software ou banco de dados e, quando nesse formato, fornece ao administrador uma c\u00f3pia que pode ser ajustada conforme necess\u00e1rio, evitando as solicita\u00e7\u00f5es de outra equipe para alterar um banco de dados em algum lugar.<\/p>\n<p><!--more--><\/p>\n<p>Vamos usar um script simples que voc\u00ea pode usar hoje para ver como podemos sincronizar um atributo de um CSV com uma conta do AD.<\/p>\n<p>Para preparar o cen\u00e1rio, digamos que eu tenha um CSV chamado C:Employees.csv. Esse CSV tem tr\u00eas colunas: FirstName, LastName e Department. Voc\u00ea deseja um script que possa localizar a conta do AD associada a esse nome\/sobrenome e, em seguida, alterar o departamento para o que estiver no CSV.<\/p>\n<p>Esse script, como qualquer script de sincroniza\u00e7\u00e3o, consistir\u00e1 basicamente em tr\u00eas &#8220;fases&#8221; Essas &#8220;fases&#8221; s\u00e3o a leitura dos dados de origem (CSV, neste exemplo), a localiza\u00e7\u00e3o da ID exclusiva dos dados de origem de destino que correspondem aos dados de origem (AD samAccountName, neste exemplo) e, por fim, a grava\u00e7\u00e3o dos atributos associados vinculados a essa conta.<\/p>\n<p>A primeira tarefa \u00e9 ler o arquivo CSV.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$csvUsers = Import-Csv -Path 'C:Employees.csv'<\/pre>\n<p>Feito. A pr\u00f3xima parte \u00e9 encontrar o ID exclusivo para fazer a correspond\u00eancia com cada linha do arquivo CSV. Como n\u00e3o temos o ID exclusivo dentro do CSV, temos que criar um na hora. Para criar esse ID exclusivo, vamos presumir que a primeira inicial\/o \u00faltimo nome de um funcion\u00e1rio sempre ser\u00e1 um samAccountName do AD. Precisaremos criar essa pesquisa samAccountName e, em seguida, realizar uma consulta ao AD para verificar se existe uma conta.<br \/>\nObserva\u00e7\u00e3o: Antes de prosseguirmos, certifique-se de ter baixado e instalado as <a href=\"https:\/\/learn.microsoft.com\/en-us\/troubleshoot\/windows-server\/system-management-components\/remote-server-administration-tools\" target=\"_blank\" rel=\"noopener\">ferramentas de administra\u00e7\u00e3o do servidor remoto<\/a> para o seu sistema operacional. Isso lhe dar\u00e1 o m\u00f3dulo do Active Directory PowerShell que cont\u00e9m os cmdlets Get-AdUser e Set-AdUser que usaremos.<\/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    se ($adUser = Get-AdUser -Filter \"samAccountName -eq $userName\" -Properties $attributesToSync) {\r\n        ## Nosso \"ID exclusivo\" foi encontrado. Prossiga para ler os dados CSV e gravar atributos\r\n    } else {\r\n        Write-Warning -Message 'User match not found' (correspond\u00eancia de usu\u00e1rio n\u00e3o encontrada)\r\n    }\r\n}<\/pre>\n<p>Quando tivermos uma conta do AD para trabalhar, poderemos ler cada atributo associado ao nome do funcion\u00e1rio no arquivo CSV e gravar essas informa\u00e7\u00f5es na conta do AD encontrada. Observe abaixo que estou definindo a vari\u00e1vel $attributesToSync e lendo-a posteriormente. Fiz isso para que eu possa adicionar outros atributos que possam estar no CSV para sincroniz\u00e1-los tamb\u00e9m no futuro. O exemplo abaixo est\u00e1 verificando primeiro se o atributo \u00e9 o mesmo. Caso contr\u00e1rio, ele est\u00e1 usando o Set-AdUser para alter\u00e1-lo.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$attributesToSync = 'Department' (Departamento)\r\nforeach ($csvUser in $csvUsers) {\r\n    $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName\r\n    se ($adUser = Get-AdUser -Filter \"samAccountName -eq $userName\" -Properties $attributesToSync) {\r\n        foreach ($attr in $attributesToSync) {\r\n            se ($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 'User match not found' (correspond\u00eancia de usu\u00e1rio n\u00e3o encontrada)\r\n    }\r\n}<\/pre>\n<p>Este exemplo s\u00f3 funcionar\u00e1 com atributos que sejam valores de cadeia de caracteres dentro do AD. Fique atento a esses atributos, como o gerente, a data de expira\u00e7\u00e3o da conta e assim por diante. Esses atributos exigem que um objeto do tipo correto seja criado antes de ser gravado no AD. Seria necess\u00e1ria outra s\u00e9rie de artigos para analisar os meandros da sincroniza\u00e7\u00e3o do AD e trabalhar com diferentes atributos, mas criei um PowerShell chamado PSADSync que ajuda voc\u00ea com isso. Ele pode ser encontrado retirando-o da Galeria do PowerShell com <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 \u00e9 MVP de gerenciamento de data center e nuvem do Microsoft Windows e \u00e9 autor de v\u00e1rios cursos de treinamento, colaborador regular de v\u00e1rias publica\u00e7\u00f5es impressas e on-line e faz apresenta\u00e7\u00f5es em v\u00e1rios grupos de usu\u00e1rios e confer\u00eancias. Voc\u00ea pode encontrar Adam em <a href=\"https:\/\/adamtheautomator.com\/\" target=\"_blank\" rel=\"noopener\">adamtheautomator.com<\/a> ou no Twitter em @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":[12435],"class_list":["post-776641","script_hub","type-script_hub","status-publish","hentry","script_hub_category-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/script_hub\/776641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/comments?post=776641"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/media?parent=776641"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/operating_system?post=776641"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/pt-br\/wp-json\/wp\/v2\/use_cases?post=776641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}