Usuário com melhor resposta
Inclusão de informação no "Display Name" do AD com validação de e-mail

Pergunta
-
Bom dia pessoal,
Segue um desafio para os experts em scripts.
- Preciso incluir uma informação na propriedade "Display name" (Nome para exibição) do AD de mais de 4.000 usuários da minha rede, porém, que se aplique APENAS se o usuário tem conta de e-mail no Exchange, caso não tenha, não faça a inclusão da informação.
Por ex:
User: mmiranda
Display name: Marco Antonio Miranda
Se eu tiver conta de e-mail no Exchange (mmiranda@enchange.com), alterar o "Display name" para:
User: mmiranda
Display name: Marco Antonio Miranda - TESTESxxx
Lembrando, que essa alteração deva ser realizada apenas se o usuário tiver conta de e-mail, pois tenho mais de 100 contas de serviço que não devem sofrer a alteração ok?
Obrigado desde já.
Abraços
Respostas
-
Segue o script....
-------------------------
Const SE_DACL_PROTECTED = 4096
'On Error Resume Next
Dim sDomain
Dim sADsPath
Dim sPDCDim oCon
Dim oCmd
Dim oRst
Set oRst = CreateObject("ADODB.Recordset")
Set oCmd = CreateObject("ADODB.Command")
Set oCon = CreateObject("ADODB.Connection")Dim oRoot
Dim oDomain
Dim oADInfo
Dim oInfoSet oADInfo = CreateObject("ADSystemInfo")
Set oInfo = CreateObject("WinNTSystemInfo")
sPDC = oInfo.PDC & "." & oADInfo.DomainDNSNameoCon.Provider = "ADSDSOObject"
oCon.Open "Active Directory Provider"oCmd.ActiveConnection = oCon
oCmd.Properties("Page Size") = 1200Set oRoot = GetObject("LDAP://rootDSE")
sDomain = oRoot.Get("defaultNamingContext")
Set oDomain = GetObject("LDAP://" & sDomain)
sADsPath = "<" & oDomain.ADsPath & ">"oCmd.CommandText = sADsPath & ";" & _
"(&(objectCategory=user)(objectClass=user)(samAccountName=*)(!userAccountControl:1.2.840.113556.1.4.803:=2));displayName,sAMAccountName,userPrincipalName;Subtree"WScript.Echo "Selecionando os objetos no Active Directory..."
Set oRst = oCmd.Execute
If oRst.RecordCount = 0 Then
WScript.Echo "Nenhum objeto foi encontrato!"
WScript.Quit
End IfnumTotal = 0
Do While Not oRst.EOF
strPesquisaUsuario = QueryActiveDirectory( oRst.Fields( "sAMAccountName" ) )
If Not ( strPesquisaUsuario = "Nao encontrado" ) Then
Set objUser = GetObject("LDAP://" & strPesquisaUsuario )
Set objMailbox = objUser
If Not ( objMailbox.HomeMDB = "" ) ThensDisplayName=objUser.Get("DisplayName") & " - TESTEsxxx"
wscript.echo " [-] " & objUser.Get( "sAMAccountName" ) & " -> " & sDisplayName
' Descomentar as duas linhas abaixo apos os seus testes
' objUser.Put "DisplayName", sDisplayName
' objUser.SetinfonumTotal = numTotal + 1
End If
End If
oRst.MoveNext
Loop
Wscript.echo "Total de Usuários: [" & oRst.RecordCount & "]"
Wscript.echo "Total de Usuários Alterados: [" & numTotal & "]"
Wscript.echo "Total de Usuários Sem Alteração: [" & oRst.RecordCount - numTotal & "]"'-------------------------------------------------------------
Public Function QueryActiveDirectory(sUserMatricula)
QueryActiveDirectory = "Not Found"
if Len(sUserMatricula) > 0 thenDim oAD
Dim oGlobalCatalog
Dim oRecordSet
Dim oConnection
Dim strADsPath
Dim strQuery
Dim strUPNset oRecordSet = CreateObject("ADODB.Recordset")
set oConnection = CreateObject("ADODB.Connection")Set oAD = GetObject("GC:")
For Each oGlobalCatalog In oAD
strADsPath = oGlobalCatalog.AdsPath
NextoConnection.Provider = "ADsDSOObject"
oConnection.Open "ADs Provider"
strQuery = "<" & strADsPath & _
">;(&(objectClass=user)(objectCategory=person)(sAMAccountName=" & _
sUserMatricula & "));userPrincipalName,cn,distinguishedName;subtree"Set oRecordSet = oConnection.Execute(strQuery)
If oRecordSet.EOF And oRecordSet.BOF Then
QueryActiveDirectory = "Not Found"
Else
While Not oRecordSet.EOF
QueryActiveDirectory = oRecordSet.Fields("distinguishedName")
oRecordSet.MoveNext
Wend
End IfEnd If
End Function
- Sugerido como Resposta Fábio JrModerator segunda-feira, 12 de dezembro de 2011 11:58
- Marcado como Resposta Fábio JrModerator terça-feira, 13 de dezembro de 2011 21:34
-
Não percebi o erro quando mandei o script.
Altere desta forma.
' Set oDomain = GetObject("LDAP://OU=Teste," & sDomain)
sADsPath = "<LDAP://OU=Teste," & sDomain & ">"Tenha certeza que a OU esta na raiz o AD.
OU=Teste,DC=dominio, ....
- Marcado como Resposta Marco_AM quarta-feira, 14 de dezembro de 2011 19:19
-
Todas as Respostas
-
Segue o script....
-------------------------
Const SE_DACL_PROTECTED = 4096
'On Error Resume Next
Dim sDomain
Dim sADsPath
Dim sPDCDim oCon
Dim oCmd
Dim oRst
Set oRst = CreateObject("ADODB.Recordset")
Set oCmd = CreateObject("ADODB.Command")
Set oCon = CreateObject("ADODB.Connection")Dim oRoot
Dim oDomain
Dim oADInfo
Dim oInfoSet oADInfo = CreateObject("ADSystemInfo")
Set oInfo = CreateObject("WinNTSystemInfo")
sPDC = oInfo.PDC & "." & oADInfo.DomainDNSNameoCon.Provider = "ADSDSOObject"
oCon.Open "Active Directory Provider"oCmd.ActiveConnection = oCon
oCmd.Properties("Page Size") = 1200Set oRoot = GetObject("LDAP://rootDSE")
sDomain = oRoot.Get("defaultNamingContext")
Set oDomain = GetObject("LDAP://" & sDomain)
sADsPath = "<" & oDomain.ADsPath & ">"oCmd.CommandText = sADsPath & ";" & _
"(&(objectCategory=user)(objectClass=user)(samAccountName=*)(!userAccountControl:1.2.840.113556.1.4.803:=2));displayName,sAMAccountName,userPrincipalName;Subtree"WScript.Echo "Selecionando os objetos no Active Directory..."
Set oRst = oCmd.Execute
If oRst.RecordCount = 0 Then
WScript.Echo "Nenhum objeto foi encontrato!"
WScript.Quit
End IfnumTotal = 0
Do While Not oRst.EOF
strPesquisaUsuario = QueryActiveDirectory( oRst.Fields( "sAMAccountName" ) )
If Not ( strPesquisaUsuario = "Nao encontrado" ) Then
Set objUser = GetObject("LDAP://" & strPesquisaUsuario )
Set objMailbox = objUser
If Not ( objMailbox.HomeMDB = "" ) ThensDisplayName=objUser.Get("DisplayName") & " - TESTEsxxx"
wscript.echo " [-] " & objUser.Get( "sAMAccountName" ) & " -> " & sDisplayName
' Descomentar as duas linhas abaixo apos os seus testes
' objUser.Put "DisplayName", sDisplayName
' objUser.SetinfonumTotal = numTotal + 1
End If
End If
oRst.MoveNext
Loop
Wscript.echo "Total de Usuários: [" & oRst.RecordCount & "]"
Wscript.echo "Total de Usuários Alterados: [" & numTotal & "]"
Wscript.echo "Total de Usuários Sem Alteração: [" & oRst.RecordCount - numTotal & "]"'-------------------------------------------------------------
Public Function QueryActiveDirectory(sUserMatricula)
QueryActiveDirectory = "Not Found"
if Len(sUserMatricula) > 0 thenDim oAD
Dim oGlobalCatalog
Dim oRecordSet
Dim oConnection
Dim strADsPath
Dim strQuery
Dim strUPNset oRecordSet = CreateObject("ADODB.Recordset")
set oConnection = CreateObject("ADODB.Connection")Set oAD = GetObject("GC:")
For Each oGlobalCatalog In oAD
strADsPath = oGlobalCatalog.AdsPath
NextoConnection.Provider = "ADsDSOObject"
oConnection.Open "ADs Provider"
strQuery = "<" & strADsPath & _
">;(&(objectClass=user)(objectCategory=person)(sAMAccountName=" & _
sUserMatricula & "));userPrincipalName,cn,distinguishedName;subtree"Set oRecordSet = oConnection.Execute(strQuery)
If oRecordSet.EOF And oRecordSet.BOF Then
QueryActiveDirectory = "Not Found"
Else
While Not oRecordSet.EOF
QueryActiveDirectory = oRecordSet.Fields("distinguishedName")
oRecordSet.MoveNext
Wend
End IfEnd If
End Function
- Sugerido como Resposta Fábio JrModerator segunda-feira, 12 de dezembro de 2011 11:58
- Marcado como Resposta Fábio JrModerator terça-feira, 13 de dezembro de 2011 21:34
-
-
-
Eugenio,
Salvei o script como .vbs e após alterar a variável conforme indicou para a OU que desejo testar, ocorre o erro abaixo:
- Após aparecer a janela "Selecionando os objetos no Active Directory...", apresenta erro na linha 42, caract. 1, Erro: Tabela inexistente.
Abraço
-
-
Fabio,
Alterei apenas a linha da variável sAdsPath conforme o Eugenio havia passado. Quero testar apenas em uma OU de TESTE primeiro que criei.
de:
sADsPath = "<" & oDomain.ADsPath & ">"
para:
sADsPath = "<OU=TESTE," & oDomain.ADsPath & ">"
-
Entendi,
é porque o oDomain.ADsPaht tem o valor = LDAP://DC=seudominio,DC=com,dc=br e acaba concatenando errado ficando assim <ou=teste,ldap:\\dc=seucomini...)
Faça esta alteração:
sADsPath = "<LDAP://OU=TESTE," & odomain.distinguishedname & ">"
Fábio de Paula Junior -
-
No meu dá esse erro quando eu coloco uma OU que não existe.
Configura o caminho completo da OU.
Para conferir o nome correto da sua OU vá no seu domain controller e digite este comando no prompt
dsquery ou -name "TESTE"
Ele vai listar todas as OU com o nome TESTE.
Qualquer coisa poste aqui a sua linha(adspath) e a saida do dsquery.
Fábio de Paula Junior -
Não percebi o erro quando mandei o script.
Altere desta forma.
' Set oDomain = GetObject("LDAP://OU=Teste," & sDomain)
sADsPath = "<LDAP://OU=Teste," & sDomain & ">"Tenha certeza que a OU esta na raiz o AD.
OU=Teste,DC=dominio, ....
- Marcado como Resposta Marco_AM quarta-feira, 14 de dezembro de 2011 19:19
-
Estamos quase lá pessoal, rodou o script, leu meus usuários na UO certinho, mas não fez a alteração no Display name.
Outro detalhe, minha OU de teste não estava na raiz do domínio, mesmo colocando o caminho completo dela não rodava. Já na raiz rodou mas não fez a alteração. Estou com apenas 2 usuários nesta OU, 1 com e-mail e o outro não...
O que acham agora???
Obrigado pela força!!
-
-
Bom dia pessoal, voltando aos testes!!! Sai mais cedo na sexta-feira, por isso não respondi...
Então, deu certo descomentando as linhas sugeridas... Mas só uma observação...
Vendo os usuários pela console do Active Directory, não aparece a mudança, apenas visualizo se entrar na propriedade do objeto do usuário, falta alguma coisa ainda será??? Ou fica desta forma???
Obrigado
-
-
Olá Eugenio, infelizmente não é suficiente o "F5"... Não seria necessário adicionar no script a propriedade de "Nome completo" também? Porque se eu tento renomear o usuário pela console do AD é nessa propriedade que é alterado para que fique visível tbm..
Outro detalhe, só funciona se deixo a OU na raiz do domínio, mesmo que eu coloque o caminho completo da OU no script não funciona..
Abraço
-
Marco,
Existem dois atributos que você pode testar: cn e name.
Você precisa apenas adcionar a linha antes do .setinfo, tente um de cada vez e avise se funcionou.
objUser.Put "DisplayName", sDisplayName objUser.Put "name",sDisplayName objUser.Setinfo
Fábio de Paula Junior -