none
Retirar informaçao de um campo do AD RRS feed

  • Pergunta

  • Olá a todos,

     

    Estou com a seguinte necessidade. Tenho uma ambiente AD na empresa, e preciso retirar a informação que fica no campo "Gerente", que fica na guia "Empresa". O Bruno Estrozi, gentilmente me disponibilizou o script abaixo, mas o AD possue uma variável que limita ler somente 1000 usuarios, e o meu ambiente passa de 16.000 usuarios,  distribuído em mais de 1000 OUs, e existem   Ous que tem mais de 1000 usuários.

     

    Gostaria de uma ajuda para uma das opções abaixo:

     

     

    opção 1: O script roda de 1000 em 1000 sempre iniciando da onde parou.

     

    Opção 2: Outra possibilidade seria executar esta limpeza somente nos usuarios que tem informação neste campo (ou seja campo diferente de vazio), com isso o script sempre avançava para mais 1000. Alguém sabe como implementar isso no script? (Recomendável)

     

    Opção 3: Implementar neste script a opção de ler de um arquivo txt ou xls os usuários que devem ser retirado as informações (desta forma eu poderia criar vários arquivos com menos de 1000 usuarios)

     

     

    Const ADS_PROPERTY_CLEAR = 1
    Const ADS_PROPERTY_UPDATE = 2
    Const ADS_PROPERTY_APPEND = 3
    Const ADS_PROPERTY_DELETE = 4

     

    Dim fso
    Dim logNoLimit
    Dim objCommand
    Dim objRecordSet
    Dim objConnection
    Dim strADsPath
    Dim objUser
    Dim manager

    Set fso = CreateObject("Scripting.FileSystemObject")

    dtmCurrentDate = Date
    dtmTargetDate = Year(dtmCurrentDate)

    dtmMonth = Month(dtmCurrentDate)
    If Len(dtmMonth) = 1 Then
     dtmMonth = "0" & dtmMonth
    End If

    dtmTargetDate = dtmTargetDate & dtmMonth

    dtmDay = Day(dtmCurrentDate)
    If Len(dtmDay) = 1 Then
     dtmDay = "0" & dtmDay
    End If

    dtmTargetDate = dtmTargetDate & dtmDay

    Set logNoLimit = fso.CreateTextFile("LogAD_" & dtmTargetDate & ".log", True)

    logNoLimit.WriteLine ("=========================================")
    logNoLimit.WriteLine ("=  Log de alterações de atibutos no AD  =")
    logNoLimit.WriteLine ("=========================================")
    logNoLimit.WriteLine (FormatDateTime(CurrentDate, vbLongTime))
    logNoLimit.WriteLine ("=========================================")
    logNoLimit.WriteLine ("Usuarios Alterados")
    logNoLimit.WriteLine ("=========================================")

    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open "Provider=ADsDSOObject;"

    Set objCommand = CreateObject("ADODB.Command")
    objCommand.ActiveConnection = objConnection

    objCommand.CommandText = "<LDAP://ou=TESTE,dc=dominio,dc=com,dc=br>;(&(objectCategory=person)(objectClass=user));ADsPath;subtree"

    Set objRecordSet = objCommand.Execute

    While Not objRecordset.EOF
     strADsPath        = objRecordset.Fields("ADsPath")
     Set objUser       = GetObject(strADsPath)

     Manager       = ""
     directReports = ""
     Manager       = objUser.Manager
     directReports = objUser.directReports

     logNoLimit.WriteLine (objUser.sAMAccountName)

     objUser.PutEx ADS_PROPERTY_CLEAR, "manager", vbNull
     objUser.SetInfo
     objRecordset.MoveNext
    Wend

    Wscript.Echo "Foram alteradas " & objRecordSet.RecordCount & " contas de usuários."

    logNoLimit.WriteLine("=========================================")
    logNoLimit.WriteLine("Foram alteradas " & objRecordSet.RecordCount & " contas de usuários.")
    logNoLimit.Close

    objConnection.Close
    wscript.echo "Fim"

     

     

     

    Grato,

     

     

    segunda-feira, 5 de novembro de 2007 19:05

Respostas

  • Se você não sabe muito sobre scripts, melhor tomar cuidado.

    Alterei ai. Você só precisa informar o dominio.

    Se quiser testar em alguma OU, altere a linha para: Ex:   OU=ADM,dc=dominio,dc=XXX,dc=XX

     

    '---------------------------------------------------------------------------------------------------------------------------------------------------------

    Const ADS_SCOPE_SUBTREE = 2
    Const ADS_PROPERTY_CLEAR = 1

    On error resume next

    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") = 1200
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

    objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://dc=dominio,dc=XXX,dc=XX' WHERE objectCategory='user'"
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    numCounter = 0
    Do Until objRecordSet.EOF

     objDN=objRecordSet.Fields("distinguishedName").Value

     set objUser = GetObject("LDAP://" & objDN )
     wscript.echo "    [-] " & objUser.DisplayName

     numCounter = numCounter + 1

     objUser.PutEx ADS_PROPERTY_CLEAR, "manager", vbNull
     objUser.SetInfo

     objRecordSet.MoveNext

    Loop

    WScript.Echo "Total: " & numCounter

    WScript.Quit

     

    quarta-feira, 7 de novembro de 2007 21:22

Todas as Respostas

  • Faça um teste com o script abaixo. Se ele funcionar,  ajuste-o para o que você precisa.

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------

    On error resume next

    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") = 1200
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

    objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://dc=dominio,dc=com,dc=br' WHERE objectCategory='user'"
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    numCounter = 0
    Do Until objRecordSet.EOF

     objDN=objRecordSet.Fields("distinguishedName").Value

     set objUser = GetObject("LDAP://" & objDN )
     'WScript.Echo objUser.DisplayName & ";" & objUser.scriptPath

     numCounter = numCounter + 1

     objRecordSet.MoveNext

    Loop

    WScript.Echo "Total: " & numCounter

    WScript.Quit

    quarta-feira, 7 de novembro de 2007 19:24
  • Eugenio,

     

    Obrigado pela ajuda, mas não tenho muita experiencia em scripts, o que preciso é limpar a informação do campo Manager de todos os usuarios da empresa (total 16.000), conforme o script que enviei:

     

    O objeto do AD chama: manager

     

     

    O script que enviei faz outras coisa mas para minha necessidade so interessa a parte do manager. Gostaria de uma ajuda para conseguir zerar a informação, ou pesquisando em uma arquivo ou o script fazendo uma pesquisa no AD e tomando uma ação para todo usurio que tiver este campo preenchido.

     

    Grato pela atenção e espaço.

    quarta-feira, 7 de novembro de 2007 20:19
  • Se você não sabe muito sobre scripts, melhor tomar cuidado.

    Alterei ai. Você só precisa informar o dominio.

    Se quiser testar em alguma OU, altere a linha para: Ex:   OU=ADM,dc=dominio,dc=XXX,dc=XX

     

    '---------------------------------------------------------------------------------------------------------------------------------------------------------

    Const ADS_SCOPE_SUBTREE = 2
    Const ADS_PROPERTY_CLEAR = 1

    On error resume next

    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") = 1200
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

    objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://dc=dominio,dc=XXX,dc=XX' WHERE objectCategory='user'"
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    numCounter = 0
    Do Until objRecordSet.EOF

     objDN=objRecordSet.Fields("distinguishedName").Value

     set objUser = GetObject("LDAP://" & objDN )
     wscript.echo "    [-] " & objUser.DisplayName

     numCounter = numCounter + 1

     objUser.PutEx ADS_PROPERTY_CLEAR, "manager", vbNull
     objUser.SetInfo

     objRecordSet.MoveNext

    Loop

    WScript.Echo "Total: " & numCounter

    WScript.Quit

     

    quarta-feira, 7 de novembro de 2007 21:22