sábado, 20 de novembro de 2010

Consultas (QUERY) Active Directory

Recentemente tive que fazer consultas no Active Directory para listar usuários que possuem acesso VPN, Contas que irão expirar, Contas Expiradas, Usuários Bloqueados, Usuários desativados entre outras que possam a vir ser necessárias dentro da organização da empresa.

Não existe uma documentação da microsoft, pelo menos nas pesquisas realizadas não foi encontrada, mas pesquisando alguns sites foi possível reunir informações importantes referentes a estas consultas e desta forma elaborar Query no AD sem a necessidade de visualizar informações de cada usuário o que levaria um certo tempo.

Este tipo de consulta é muito interessante para agilizar na administração do AD quanto a gerência e administração dos usuários e de certa forma ser preventivo ao que ocorreu ou ocorrerá e você poderá atuar antes que o usuaário lhe ligue reclamando.

Estas consultas você poderá adequar conforme as políticas da sua empresa. Vamos a prática então.

Para você criar as consultas, é necessário que tenha permissão de consulta no Active Directory de sua organização e a ferramenta de administração do AD em sua estação para realizar as consultas.

Abra a Ferramenta "Usuários e Computadores do Active Directory" e veja que logo abaixo do primeiro item existe um link chamado de "Consultas Salvas" ou em inglês "Queries Saved".










Para criar uma nova consulta, clique com o botão direito do mouse sobre a link "Consultas Salvas" e selecione a opção Novo > Consulta.









Na tela que surgir você informa um nome e uma descrição e clique em definir consulta.
Agora você deve selecionar na opção de Localizar o item "Pesquisa Personalizada" e selecione a guia Avançado.

Nesa guia Avançado é que você irá informar a sua pesquisa LDAP para ser executada no AD. Para isto criei algumas consultas de teste como segue abaixo:

Usuários Bloqueados: esta consulta irá listar todos os usuários que estão com a conta bloqueada. Isto ocorre muitas vezes pela política de bloqueio de conta quando o usuário erra a senha por 3 vezes dependendo da organização.
(&(objectCategory=person)(objectClass=user)(lockoutTime:1.2.840.113556.1.4.804:=4294967295))
Usuários Desativados: esta consulta irá listar todos os usuários que estão com a conta desativada. Isto ocorre quando o usuário é desvinculado da organização e não presta mais serviços à organização.
(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))
Usuários com Acesso VPN: esta consulta irá listar todos os usuários que possuem permissão de acesso VPN na rede corporativa da organização.
(&(objectCategory=person)(objectClass=user)(msNPAllowDialin=TRUE))
Usuários sem Expiração de Conta: esta consulta irá listar os usuários que não possuem expiração de conta.
(&(objectCategory=Person)(objectClass=User)(accountExpires=0))
Usuários que a Conta vai Expirar:  esta consulta lista os usuários que irão expirar até a ata de 31/12/2010.
(&(&(&(objectCategory=Person)(objectClass=User)(!accountExpires=0)(!accountExpires=125912520000000000)(!accountExpires=127517832000000000)(accountExpires<=129383208000000000))))

Explicação Consulta:
(!accountExpires=0) - Seleciona usuários que não estão com a conta expirada.
(!accountExpires=125912520000000000) - Seleciona usuários que não estão em férias (Data 01/02/2005)
(!accountExpires=127517832000000000) - Seleciona usuários que não estão demitidos (Data 01/01/2000)
(accountExpires<=129383208000000000) - Seleciona usuários que a conta vai expirar até o fim do ano (Data 31/12/2010)
Estas foram algumas das consultas que montei e deram o resultado esperados, mas para terminar aprenda como converter o valor data para um valor Integer8 64bits que é a forma que deve ser informada na pesquisa LDAP que você notou. Esta foi a maior dificuldade além de aprender a fazer as consultas no AD.

Abaixo segue um código de um VBSCRIPT que realiza a conversão de forma simples para que você consiga definir a data corretamente. Copie o código abaixo e cole no editor de texto (notepad) e salve o arquivo com extensão VBS. Após salvar localize o arquivo e execute clicando duas vezes sobre o arquivo.
'Início Código VBSCRIPT
Option Explicit

Dim dtinput, dtmDateValue, dtmAdjusted, lngSeconds, str64Bit
Dim objShell, lngBiasKey, lngBias, k, hrinput
Dim objFSO, objFolder, objTextFile, objFile
Dim strDirectory, strFile, strText, aFile

strDirectory = "c:"
strFile = "\DatetoInteger8.txt"


'Usuário defini a data para conversão
dtinput = INPUTBOX("Informe a Data (DD/MM/AAAA)")

'Usuário informa o horário para o complemento da conversão
hrinput = INPUTBOX("Informe a Hora 12H(HH:MM AM/PM)")
If (hrinput = "") Then
    hrinput = "11:58:58 PM"
End If

dtinput = dtinput & " " & hrinput
dtmDateValue = dtinput

'MSGBOX("Data Selecionada: "& dtmDateValue)

' Obtain local Time Zone bias from machine registry.
Set objShell = CreateObject("Wscript.Shell")
lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
    & "TimeZoneInformation\ActiveTimeBias")
If (UCase(TypeName(lngBiasKey)) = "LONG") Then
    lngBias = lngBiasKey
ElseIf (UCase(TypeName(lngBiasKey)) = "VARIANT()") Then
    lngBias = 0
    For k = 0 To UBound(lngBiasKey)
        lngBias = lngBias + (lngBiasKey(k) * 256^k)
    Next
End If

' Convert datetime value to UTC.
dtmAdjusted = DateAdd("n", lngBias, dtmDateValue)

' Find number of seconds since 1/1/1601.
lngSeconds = DateDiff("s", #1/1/1601#, dtmAdjusted)

' Convert the number of seconds to a string
' and convert to 100-nanosecond intervals.
str64Bit = CStr(lngSeconds) & "0000000"
MSGBOX("Integer8 value: " & str64Bit)
strText = str64Bit

' Create the File System Object
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Check that the strDirectory folder exists
If objFSO.FolderExists(strDirectory) Then
   Set objFolder = objFSO.GetFolder(strDirectory)
Else
   Set objFolder = objFSO.CreateFolder(strDirectory)
   MSGBOX("Just created " & strDirectory)
End If

If objFSO.FileExists(strDirectory & strFile) Then
    'delete
    Set aFile = objFSO.GetFile(strDirectory & strFile)
    aFile.Delete
    Set objFolder = objFSO.GetFolder(strDirectory)
Else
   Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
   MSGBOX("Just created " & strDirectory & strFile)
End If

set objFile = nothing
set objFolder = nothing
' OpenTextFile Method needs a Const value
' ForAppending = 8 ForReading = 1, ForWriting = 2
Const ForAppending = 8

Set objTextFile = objFSO.OpenTextFile _
(strDirectory & strFile, ForAppending, True)

' Writes strText every time you run this VBScript
objTextFile.WriteLine(strText)
objTextFile.Close

' Bonus or cosmetic section to launch explorer to check file
If err.number = vbEmpty then
   Set objShell = CreateObject("WScript.Shell")
   objShell.run ("Explorer" &" " & strDirectory & "\" )
Else MSGBOX("VBScript Error: " & err.number)
End If

WScript.Quit

' Final do VBScript
Espero ter ajudado com estas informações. Agora você pode com base nisto criar outros tipos de consultas.

5 comentários:

@@ Lilico @@ disse...

muito bom

Unknown disse...

VALEU, AJUDOU MUITO!!!

Unknown disse...

Funcionou que é uma beleza. Muito obrigado.

Unknown disse...

Parabéns, foi de grande ajuda.
Obrigado!

JOÃO disse...

Como mudo a data de 2010 (SENHA EXPIRA EM)?