none
Criando vários usuários no AD via Power Shell RRS feed

  • Pergunta

  • Bom dia,

    Gostaria de saber se alguém consegue me ajudar na criação de vários usuários de AD via Power Shell.

     

    Tentei criar via CSVDE mas obtive sucesso apenas criando com 3 atributos.

    Os usuários que vou criar são no mínimo com 10 atributos (pois leva tempo para eu editar cada um dos 3.000 usuários depois).

     

    Se tiverem alguma idéia ou exemplo, agradeço.

     

    Obrigado galera.

    Enio Jr.

    quarta-feira, 28 de setembro de 2011 11:04

Respostas

  • Enio,

    Veja se essa .VBS te atende.

    Obs.: a finalidade dela é criar os usuários se baseando em um usuário de espelho. No caso, você cria uma pasta na raiz do C:\ do AD com qq nome. Dentro dela crie os arquivos, status.txt e usuarios.txt sendo que o arquivo status é vazio (será preenchido pela bat com o status final) e o arquivo usuarios deve conter os usuários (nome do funcionário e login de rede) da seguinte forma:

    Login de rede;nome do usuário

    Caso vc tenha isso em uma planilha, salve como .csv e abra com o notepad.

     

     

     

    Const ForReading = 1
    Const ForAppending = 8
    Const FORWriting = 2
    Const ADS_SCOPE_SUBTREE = 2
    
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    
    
    Set objRoot = GetObject("LDAP://RootDSE")  
    varDomainNC = objRoot.Get("DefaultNamingContext")  
    Set objDomain = GetObject("LDAP://" & varDomainNC)  
    ADDominio = "LDAP://" &varDomainNC
    'wscript.echo AdDominio
    'wscript.echo VarDomainNc
    
    ADUPN = Replace(varDomainNC,"DC=",".")
    ADUPN1 = Replace(ADUPN, ",","")
    ADUPN2 = Replace(ADUPN1, ".","",1,1)
    ADUPN3 = "@"&ADUPN2
    
    
    Do Until achei = 1
    
    	nome =     InputBox("Coloque o login do usuuario espelho" & _
        vbCrLf & "(Ex: Joao.silva)", , "usuario1")
    	If nome = "" Then WScript.Quit(1)    
    	   objCommand.CommandText = _ 
            "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM '" &AdDominio&"'  " & _
            "WHERE objectCategory='user' AND sAMAccountName =  '" & nome & "'"  
    
    '        "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM 'LDAP://dc=fredb,dc=casa,dc=br' " & _
    '        "WHERE objectCategory='user' AND sAMAccountName =  '" & nome & "'"  
    
    
       Set objRecordSet = objCommand.Execute
    
    '	objCommand.ActiveConnection = objConnection
    '	objCommand.CommandText = "<LDAP://"&varDomainNC&">;(&(objectCategory=User)" & "(samAccountName=" & nome & "));samAccountName;subtree"
    '	Set objRecordSet = objCommand.Execute
    	If objRecordset.RecordCount = 0 Then
    		Wscript.echo "Nome de usuário nao existe no AD"		
    		achei = 0
    	Else
            ADscript_logon = objRecordSet.Fields("scriptPath").Value
    '		wscript.echo objRecordSet.Fields("distinguishedname").Value
    		ADou =  objRecordSet.Fields("distinguishedname").Value
    		ADLocalTrab =  objRecordSet.Fields("physicalDeliveryOfficeName").Value
    
    
    		ADDescricao = objRecordSet.Fields("description") 
    	    If Not IsNULL(ADDescricao) Then
    			' Wscript.Echo "Description: " & ADDescricao(0)
    	    End If
    	  arrGroups = objRecordSet.Fields("memberOf").Value
    	  If IsNull(arrGroups) Then
    		 ' Wscript.Echo "-- Não pertence a grupo"
    	  Else
    	    For Each ADGrupo In arrGroups
    	    '  Wscript.Echo "-- Membro do grupo " & ADGrupo
    	    Next
    	  End If
    		achei = 1
    	End if
    loop
    
    
    Set objDomain = GetObject("LDAP://" & varDomainNC)  
    'wscript.echo "DOMINIO=> " &varDomainNC
    
      
    'wscript.echo adou
    b=(InStr(adou,","))
    c=len(adou)
    d=c-b
    'wscript.echo b
    'wscript.echo c
    Adou1=(right(adou,d))
    
      
    Set objOU = GetObject("LDAP://" & ADou1) 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set ts = objFSO.OpenTextFile("c:\vbs\usuarios.txt", ForReading) 
    
    FileWrite = "c:\vbs\status.txt"
    Set tsFW = CreateObject("Scripting.FileSystemObject") 
    Set tsFW = objFSO.OpenTextFile(FileWrite,FORWriting) 
    
    
    Do until ts.AtEndOfStream 
    	strL = ts.ReadLine 
    	spl1 = Split(strL, ";") 
    '	wscript.echo "samAccountName = " & (spl1(0)) 
    '	wscript.echo "CN = " & (spl1(0)) 
    
       objCommand.CommandText = _
       "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM '" &AdDominio&"'  " & _
        "WHERE objectCategory='user' AND sAMAccountName =  '" & spl1(0) & "'"  
    
    '   "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM 'LDAP://dc=fredb,dc=casa,dc=br' " & _
    '    "WHERE objectCategory='user' AND sAMAccountName =  '" & spl1(0) & "'"  
         Set objRecordSet = objCommand.Execute
    
        If objRecordset.RecordCount = 0 Then
    
    	Set objOU = GetObject("LDAP://" & ADou1) 
    '	Set objUser = objOU.Create("User", "cn =" & Ucase(spl1(1))) 
    	Set objUser = objOU.Create("User", "cn =" & Propercase(spl1(0))) 
    	objUser.Put "displayName", (spl1(1))' & " " & (spl1(3)) 
    	objUser.Put "sAMAccountName", (spl1(0)) 
    	objUser.Put "givenName", (spl1(1)) 
    '	objUser.Put "UserPrincipalName", (spl1(0)) & "@FREDB.CASA.BR"
    	objUser.Put "UserPrincipalName", (spl1(0)) & ADUPN3
    
    	If Not IsNULL(ADscript_logon) then
    		objUser.Put "scriptPath", ADscript_logon
    	End if
    	If Not IsNULL(ADDescricao) then
    		objUser.Put "description", ADDescricao
    	End If
    	If Not IsNull(ADLocalTrab) then
    		objUser.Put "physicalDeliveryOfficeName", ADLocalTrab
    	End if 
       objUser.SetInfo	
       If IsNull(arrGroups) Then
    
       Else
    		For Each ADGrupo In arrGroups
    		Grupo1 = Adgrupo
    		Set ObjGrupo = GetObject("LDAP://" & Grupo1)  
    '		ObjGrupo.add(objUser.ADsPath) 
    		'Wscript.echo "-- TESTE: *** "  &Grupo1
    	    'Wscript.Echo "-- Membro do Grupo: *** " & ADGrupo
    		ObjGrupo.add(objUser.AdsPath) 
    		Next
    	End if
    
    
    '		 objGrupo.PutEx ADS_PROPERTY_APPEND, "member", Array(Grupo1)
    '		 objGrupo.SetInfo
        
    	
      
    	Set objFSO = CreateObject("Scripting.FileSystemObject") 
     
    	objUser.AccountDisabled = FALSE  
    
    	objUser.SetPassword("tivit123") 
    	objUser.Put "pwdLastSet", 0
    	objUser.SetInfo   
    	tsFW.write "Usuário Criado com Sucesso    : " &spl1(0)
    	tsFW.writeline 
    	AdCriado = AdCriado + 1
    	Else 
    	tsFW.write "Ja existe este usuário Criado : " &spl1(0)
    	tsFW.writeline 
    	AdNCriado = AdNCriado + 1
    	End if	
    
    
    Loop 
    If AdCriado = 0 Then
       Adcriado = 0
    End if
    If AdNCriado = 0 Then
       AdNcriado = 0
    End if
    
    
    X=MsgBox("Usuarios criados com Sucesso .: " & AdCriado & chr(13) & "Usuarios com problema .........: " &AdNcriado& chr(13) & "Verificar Arquivo C:\VBS\STATUS.TXT",64, "Estatisticas")
    wscript.echo "FIM"
    
    
    
    Function ProperCase(sString)
    Dim lTemp
    Dim sTemp, sTemp2
    Dim x
    sString = LCase(sString)
    	If Len(sString) Then
    		sTemp = Split(sString, ".")
    		lTemp = UBound(sTemp)
    		For x = 0 To lTemp
    			sTemp2 = sTemp2 & UCase(Left(sTemp(x), 1)) & Mid(sTemp(x), 2) & " " 
    		Next
    		'ProperCase = trim(sTemp2)
    		ProperCase = Replace(trim(sTemp2)," ",".")
    	Else
    		ProperCase = sString
    	End If
    End Function


     

     


    quarta-feira, 23 de novembro de 2011 19:00

Todas as Respostas

  • Diversas forma de fazer isto:

    http://www.petri.co.il/create_users_for_testing_purposes.htm

     

    Com Powershell

    $users = import-csv "C:\usersToBeCreated.csv"
    $container = [ADSI] "LDAP://cn=Users,dc=YourDomain,dc=local"
    $users | foreach {
        $UserName = $_.UserName
        $newUser = $container.Create("User", "cn=" + $UserName)
        $newUser.Put("sAMAccountName", $UserName)
        $newUser.SetInfo()
        $newUser.psbase.InvokeSet('AccountDisabled', $false)
        $newUser.SetInfo()
        $newUser.SetPassword("P@55w0rd")
    }
    
    

    Ref.: http://thejoyofcode.com/Creating_AD_user_accounts_in_PowerShell.aspx

    Outros exemplos:

    import-module activedirectory 
    
    import-csv .\newuser.csv | %{new-aduser -name $_.Name -DisplayName $_.DisplayName -GivenName $_.GivenName -SamAccountName $_.SamAccountName -UserPrincipalName $_.UserPrincipalName -Description $_.Description -Path ‘CN=Users,DC=contoso,DC=com -CannotChangePassword $true -ChangePasswordAtLogon $false ; Set- ADAccountPassword -identity $_.name -NewPassword (ConvertTo-SecureString -AsPlainText $_.AccountPassword -Force) -Reset ; Enable-ADAccount -identity $_.name}
     
    
    ## Make sure the newuser.csv file contains….
     
    ## Name,DisplayName,GivenName,SamAccountName,UserPrincipalName,Description
    
    

    Ref.: http://dmitrysotnikov.wordpress.com/2008/01/21/ad-user-provisioning-from-csv-got-easier/


    Fábio de Paula Junior
    quinta-feira, 29 de setembro de 2011 00:56
    Moderador
  • Olá Fábio,

     

    Me desculpe a ignorância, mas é que não tenho mesmo intimidade com o Power Shell.

     

    Eu tenho centenas de usuários empilhados em um .txt da seguinte forma:

     

    DN,sAMAccountName,userPrincipalName,userAccountControl,givenName,sn,accountExpires,displayName,title,description,Office,objectClass

    "CN=PABLO CARDOZO,OU=import_santana,DC=contoso,DC=corp",pablo.cardozo,pablo.cardozo@contoso.corp,66048,PABLO,CARDOZO,0,PABLO CARDOZO,Engenheiro,Engenheiro,Santana,user

    "CN=ANGELINA JOLIE,OU=import_santana,DC=contoso, DC=corp",angelina.jolie,angelina.jolie@contoso.corp,66048,ANGELINA,JOLIE,0,ANGELINA JOLIE,Recepcionista,Recepcionista,Santana,user

    Como consigo importar estes 2 usuários para o meu AD WS2K8 via Power Shell?

    Obrigado.

    Enio Jr 

    quinta-feira, 29 de setembro de 2011 15:09
  • Enio,

    Veja se essa .VBS te atende.

    Obs.: a finalidade dela é criar os usuários se baseando em um usuário de espelho. No caso, você cria uma pasta na raiz do C:\ do AD com qq nome. Dentro dela crie os arquivos, status.txt e usuarios.txt sendo que o arquivo status é vazio (será preenchido pela bat com o status final) e o arquivo usuarios deve conter os usuários (nome do funcionário e login de rede) da seguinte forma:

    Login de rede;nome do usuário

    Caso vc tenha isso em uma planilha, salve como .csv e abra com o notepad.

     

     

     

    Const ForReading = 1
    Const ForAppending = 8
    Const FORWriting = 2
    Const ADS_SCOPE_SUBTREE = 2
    
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    
    
    Set objRoot = GetObject("LDAP://RootDSE")  
    varDomainNC = objRoot.Get("DefaultNamingContext")  
    Set objDomain = GetObject("LDAP://" & varDomainNC)  
    ADDominio = "LDAP://" &varDomainNC
    'wscript.echo AdDominio
    'wscript.echo VarDomainNc
    
    ADUPN = Replace(varDomainNC,"DC=",".")
    ADUPN1 = Replace(ADUPN, ",","")
    ADUPN2 = Replace(ADUPN1, ".","",1,1)
    ADUPN3 = "@"&ADUPN2
    
    
    Do Until achei = 1
    
    	nome =     InputBox("Coloque o login do usuuario espelho" & _
        vbCrLf & "(Ex: Joao.silva)", , "usuario1")
    	If nome = "" Then WScript.Quit(1)    
    	   objCommand.CommandText = _ 
            "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM '" &AdDominio&"'  " & _
            "WHERE objectCategory='user' AND sAMAccountName =  '" & nome & "'"  
    
    '        "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM 'LDAP://dc=fredb,dc=casa,dc=br' " & _
    '        "WHERE objectCategory='user' AND sAMAccountName =  '" & nome & "'"  
    
    
       Set objRecordSet = objCommand.Execute
    
    '	objCommand.ActiveConnection = objConnection
    '	objCommand.CommandText = "<LDAP://"&varDomainNC&">;(&(objectCategory=User)" & "(samAccountName=" & nome & "));samAccountName;subtree"
    '	Set objRecordSet = objCommand.Execute
    	If objRecordset.RecordCount = 0 Then
    		Wscript.echo "Nome de usuário nao existe no AD"		
    		achei = 0
    	Else
            ADscript_logon = objRecordSet.Fields("scriptPath").Value
    '		wscript.echo objRecordSet.Fields("distinguishedname").Value
    		ADou =  objRecordSet.Fields("distinguishedname").Value
    		ADLocalTrab =  objRecordSet.Fields("physicalDeliveryOfficeName").Value
    
    
    		ADDescricao = objRecordSet.Fields("description") 
    	    If Not IsNULL(ADDescricao) Then
    			' Wscript.Echo "Description: " & ADDescricao(0)
    	    End If
    	  arrGroups = objRecordSet.Fields("memberOf").Value
    	  If IsNull(arrGroups) Then
    		 ' Wscript.Echo "-- Não pertence a grupo"
    	  Else
    	    For Each ADGrupo In arrGroups
    	    '  Wscript.Echo "-- Membro do grupo " & ADGrupo
    	    Next
    	  End If
    		achei = 1
    	End if
    loop
    
    
    Set objDomain = GetObject("LDAP://" & varDomainNC)  
    'wscript.echo "DOMINIO=> " &varDomainNC
    
      
    'wscript.echo adou
    b=(InStr(adou,","))
    c=len(adou)
    d=c-b
    'wscript.echo b
    'wscript.echo c
    Adou1=(right(adou,d))
    
      
    Set objOU = GetObject("LDAP://" & ADou1) 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set ts = objFSO.OpenTextFile("c:\vbs\usuarios.txt", ForReading) 
    
    FileWrite = "c:\vbs\status.txt"
    Set tsFW = CreateObject("Scripting.FileSystemObject") 
    Set tsFW = objFSO.OpenTextFile(FileWrite,FORWriting) 
    
    
    Do until ts.AtEndOfStream 
    	strL = ts.ReadLine 
    	spl1 = Split(strL, ";") 
    '	wscript.echo "samAccountName = " & (spl1(0)) 
    '	wscript.echo "CN = " & (spl1(0)) 
    
       objCommand.CommandText = _
       "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM '" &AdDominio&"'  " & _
        "WHERE objectCategory='user' AND sAMAccountName =  '" & spl1(0) & "'"  
    
    '   "SELECT sAMAccountName,userPrincipalName,physicalDeliveryOfficeName,scriptPath,memberOf,Description,distinguishedname,instanceType FROM 'LDAP://dc=fredb,dc=casa,dc=br' " & _
    '    "WHERE objectCategory='user' AND sAMAccountName =  '" & spl1(0) & "'"  
         Set objRecordSet = objCommand.Execute
    
        If objRecordset.RecordCount = 0 Then
    
    	Set objOU = GetObject("LDAP://" & ADou1) 
    '	Set objUser = objOU.Create("User", "cn =" & Ucase(spl1(1))) 
    	Set objUser = objOU.Create("User", "cn =" & Propercase(spl1(0))) 
    	objUser.Put "displayName", (spl1(1))' & " " & (spl1(3)) 
    	objUser.Put "sAMAccountName", (spl1(0)) 
    	objUser.Put "givenName", (spl1(1)) 
    '	objUser.Put "UserPrincipalName", (spl1(0)) & "@FREDB.CASA.BR"
    	objUser.Put "UserPrincipalName", (spl1(0)) & ADUPN3
    
    	If Not IsNULL(ADscript_logon) then
    		objUser.Put "scriptPath", ADscript_logon
    	End if
    	If Not IsNULL(ADDescricao) then
    		objUser.Put "description", ADDescricao
    	End If
    	If Not IsNull(ADLocalTrab) then
    		objUser.Put "physicalDeliveryOfficeName", ADLocalTrab
    	End if 
       objUser.SetInfo	
       If IsNull(arrGroups) Then
    
       Else
    		For Each ADGrupo In arrGroups
    		Grupo1 = Adgrupo
    		Set ObjGrupo = GetObject("LDAP://" & Grupo1)  
    '		ObjGrupo.add(objUser.ADsPath) 
    		'Wscript.echo "-- TESTE: *** "  &Grupo1
    	    'Wscript.Echo "-- Membro do Grupo: *** " & ADGrupo
    		ObjGrupo.add(objUser.AdsPath) 
    		Next
    	End if
    
    
    '		 objGrupo.PutEx ADS_PROPERTY_APPEND, "member", Array(Grupo1)
    '		 objGrupo.SetInfo
        
    	
      
    	Set objFSO = CreateObject("Scripting.FileSystemObject") 
     
    	objUser.AccountDisabled = FALSE  
    
    	objUser.SetPassword("tivit123") 
    	objUser.Put "pwdLastSet", 0
    	objUser.SetInfo   
    	tsFW.write "Usuário Criado com Sucesso    : " &spl1(0)
    	tsFW.writeline 
    	AdCriado = AdCriado + 1
    	Else 
    	tsFW.write "Ja existe este usuário Criado : " &spl1(0)
    	tsFW.writeline 
    	AdNCriado = AdNCriado + 1
    	End if	
    
    
    Loop 
    If AdCriado = 0 Then
       Adcriado = 0
    End if
    If AdNCriado = 0 Then
       AdNcriado = 0
    End if
    
    
    X=MsgBox("Usuarios criados com Sucesso .: " & AdCriado & chr(13) & "Usuarios com problema .........: " &AdNcriado& chr(13) & "Verificar Arquivo C:\VBS\STATUS.TXT",64, "Estatisticas")
    wscript.echo "FIM"
    
    
    
    Function ProperCase(sString)
    Dim lTemp
    Dim sTemp, sTemp2
    Dim x
    sString = LCase(sString)
    	If Len(sString) Then
    		sTemp = Split(sString, ".")
    		lTemp = UBound(sTemp)
    		For x = 0 To lTemp
    			sTemp2 = sTemp2 & UCase(Left(sTemp(x), 1)) & Mid(sTemp(x), 2) & " " 
    		Next
    		'ProperCase = trim(sTemp2)
    		ProperCase = Replace(trim(sTemp2)," ",".")
    	Else
    		ProperCase = sString
    	End If
    End Function


     

     


    quarta-feira, 23 de novembro de 2011 19:00
  • Agora com eu faço para ele ler um campo em comum, como exemplo o "sn" em uma planilha excel e já preenchido o company também, mas lá no AD não tenho o company?

    Quero fazer o insert desse campo através da leitura do excel para o AD.

    Seria possível?

    Grato.


    Grato, Trentini

    segunda-feira, 13 de agosto de 2012 21:49