none
Script para saber do ultimo acesso do micro no AD

    Question

  • Bom dia a todos,

    Por acaso vocês saberiam me indicar alguma ferramenta ou mesmo me passar um script que possa me trazer informações sobre o ultimo acesso ao servidor (DC)

    +/- assim, estou tentando fazer uma manutenção no AD, e queria saber quais as maquinas não estão mais na rede ( qual foi o ultimo acesso delas no AD) etc,

    E das maquinas que estão na rede qual o usuário esta logado na maquina.

    Bom se não tiver como saber dos usuários logados, não tem problema, se não existir script ou ferramenta para nenhum dos dois, fico agradecido pela atenção.

    Desde já obrigado.

    Wednesday, July 18, 2007 1:18 PM

Answers

  • Olá,

    já experimentou usar algum site de busca?

    http://www.google.com.br/search?q=OLDCMP&ie=utf-8&oe=utf-8&aq=t&rls=org.mozillaStick out tonguet-BRSurprisefficial&client=firefox-a

    []s,

    Vinicius
    Tuesday, November 13, 2007 10:56 AM
    Moderator

All replies

  •  

    Para verificar o último acesso ao AD eu vou pesquisar...

     

    E para verificar qual usuário está logado em qual máquina, segue abaixo script.

     

    É só salvar como .vbs .

     

    obs.: Ele pode demorar um pouco para retornar os nomes, mas é normal...

     

    Substitua a parte em vermelho pelo adspath do seu domínio... ex.:  meu.com.br   será    dc=meu,dc=com,dc=br

     

    Code Snippet

    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.CommandText = "Select Name,Location from 'LDAP://DC=meu, DC=com' Where objectClass='computer'" 


    objCommand.Properties("Page Size") = 100
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst


    Do Until objRecordSet.EOF


     Dim objWMIService, objComputer, localizar
     Dim strLogonUser, strLogonUser1, strComputer


     strComputer = objRecordSet.Fields("Name").Value


    on error resume next
     Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"& strComputer & "\root\cimv2")


    if err.number=0 then
     Set localizar = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
      For Each objComputer in localizar 
      if Not isNull(objComputer.UserName) Then 
       strLogonUser = Split(objComputer.UserName,"\")
       strLogonUser(1) = UCase(Left(strLogonUser(1),1)) & Trim(Mid(strLogonUser(1),2,20))
       Wscript.Echo strLogonUser(1) & " esta logando em " & strComputer
      End If
    objRecordset.MoveNext()
     Next
    else
    objRecordset.MoveNext()
    end if


    LOOP

     

     o.0 =D

    Thursday, July 19, 2007 7:40 PM
    Moderator
  • O script abaixo irá mover os computadores que não se autenticam no dominio a mais de X dias, este valor será especificado por você. O script também irá perguntar para qual OU os computadores serão movidos. Na verdade o script verifica a ultima vez que a estação validou sua senha com o domain controller, isso ocorre periodicamente e através deste atributo é possivel saber se uma estação não loga no dominio a mais de X dias.

     

    Code Snippet

    Option Explicit

    Dim strFilePath, objFSO, objFile, adoConnection, adoCommand
    Dim objRootDSE, strDNSDomain, strFilter, strQuery, adoRecordset
    Dim strComputerDN, objShell, lngBiasKey, lngBias
    Dim lngDate, objDate, dtmPwdLastSet, k
    Dim intDays, strTargetOU, objTargetOU, objComputer
    Dim intTotal, intInactive, intNotMoved, intNotDisabled

    ' Specify the log file. This file will be created if it does not
    ' exist. Otherwise, the program will append to the file.
    strFilePath = InputBox("Especifique o destino do log.")

    ' Specify the minimum number of days since the password was last set for
    ' the computer account to be considered inactive.
    intDays = InputBox(Especifique a quantidade de dias para que o computador seja considerado inativo.")

    ' Specify the Distinguished Name of the Organizational Unit into
    ' which inactive computer objects will be moved.
    strTargetOU = InputBox("Especifique o caminho (FQDN) da OU que os computadores serão movidos.")

    ' Bind to target Organizational Unit.
    On Error Resume Next
    Set objTargetOU = GetObject("LDAP://" & strTargetOU)
    If (Err.Number <> 0) Then
        On Error GoTo 0
        Wscript.Echo "Organization Unit not found: " & strTargetOU
        Wscript.Quit
    End If
    On Error GoTo 0

    ' Open the log file for write access. Append to this file.
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
    Set objFile = objFSO.OpenTextFile(strFilePath, 8, True, 0)
    If (Err.Number <> 0) Then
        On Error GoTo 0
        Wscript.Echo "File " & strFilePath & " cannot be opened"
        Set objFSO = Nothing
        Wscript.Quit
    End If
    On Error GoTo 0

    ' 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

    ' Use ADO to search the domain for all computers.
    Set adoConnection = CreateObject("ADODB.Connection")
    Set adoCommand = CreateObject("ADODB.Command")
    adoConnection.Provider = "ADsDSOOBject"
    adoConnection.Open "Active Directory Provider"
    Set adoCommand.ActiveConnection = adoConnection

    ' Determine the DNS domain from the RootDSE object.
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("DefaultNamingContext")

    ' Filter to retrieve all computer objects.
    strFilter = "(objectCategory=computer)"

    ' Retrieve Distinguished Name and date password last set.
    strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter _
        & ";distinguishedName,pwdLastSet;subtree"

    adoCommand.CommandText = strQuery
    adoCommand.Properties("Page Size") = 100
    adoCommand.Properties("Timeout") = 30
    adoCommand.Properties("Cache Results") = False

    ' Write information to log file.
    objFile.WriteLine "Procurando computadores inativos..."
    objFile.WriteLine "Iniciado: " & Now
    objFile.WriteLine "Procurando em: " & strDNSDomain
    objFile.WriteLine "Arquivo de log: " & strFilePath
    objFile.WriteLine "Computadores serão considerados como inativos com mais de: " & intDays & " dias"
    objFile.WriteLine "Computadores inativos serão movidos para: " & strTargetOU
    objFile.WriteLine "----------------------------------------------"

    ' Initialize totals.
    intTotal = 0
    intInactive = 0
    intNotMoved = 0
    intNotDisabled = 0

    ' Enumerate all computers and determine which are inactive.
    Set adoRecordset = adoCommand.Execute
    Do Until adoRecordset.EOF
        strComputerDN = adoRecordset.Fields("distinguishedName")
        intTotal = intTotal + 1
        ' Determine date when password last set.
        lngDate = adoRecordset.Fields("pwdLastSet")
        Set objDate = lngDate
        dtmPwdLastSet = Integer8Date(objDate, lngBias)
        ' Check if computer object inactive.
        If (DateDiff("d", dtmPwdLastSet, Now) > intDays) Then
            ' Computer object inactive.
            intInactive = intInactive + 1
            objFile.WriteLine "Inativo: " & strComputerDN _
                & " - password last set: " & dtmPwdLastSet
            ' Move computer object to the target OU.
            On Error Resume Next
            Set objComputer = objTargetOU.MoveHere("LDAP://" _
                & strComputerDN, vbNullString)
            If (Err.Number <> 0) Then
                On Error GoTo 0
                intNotMoved = intNotMoved + 1
                objFile.WriteLine "Não foi possivel mover: " & strComputerDN
            End If
            ' Disable the computer account.
            On Error Resume Next
            objComputer.AccountDisabled = True
            ' Save changes to Active Directory.
            objComputer.SetInfo
            If (Err.Number <> 0) Then
                On Error GoTo 0
                intNotDisabled = intNotDisabled + 1
                objFile.WriteLine "Não foi possivel desabilitar: " & strComputerDN
            End If
            On Error GoTo 0
        End If
        adoRecordset.MoveNext
    Loop
    adoRecordset.Close

    ' Write totals to log file.
    objFile.WriteLine "Finalizado: " & Now
    objFile.WriteLine "Total de computadores encontrados: " & intTotal
    objFile.WriteLine "Inativos:                          " & intInactive
    objFile.WriteLine "Contas inativas não movidas:       " & intNotMoved
    objFile.WriteLine "Contas inativas não desativadas:   " & intNotDisabled
    objFile.WriteLine "----------------------------------------------"

    ' Display summary.
    Wscript.Echo "Computadores encontrados:        " & intTotal
    Wscript.Echo "Inativos:                        " & intInactive
    Wscript.Echo "Contas inativas não movidas:     " & intNotMoved
    Wscript.Echo "Contas inativas não desativadas: " & intNotDisabled
    Wscript.Echo "Veja o Log:                      " & strFilePath

    ' Clean up.
    objFile.Close
    adoConnection.Close
    Set objFile = Nothing
    Set objFSO = Nothing
    Set objShell = Nothing
    Set adoConnection = Nothing
    Set adoCommand = Nothing
    Set objRootDSE = Nothing
    Set adoRecordset = Nothing
    Set objComputer = Nothing

    Wscript.Echo "Done"

    Function Integer8Date(objDate, lngBias)
        ' Function to convert Integer8 (64-bit) value to a date, adjusted for
        ' time zone bias.
        Dim lngAdjust, lngDate, lngHigh, lngLow
        lngAdjust = lngBias
        lngHigh = objDate.HighPart
        lngLow = objDate.LowPart
        ' Account for bug in IADsLargeInteger property methods.
        If (lngHigh = 0) And (lngLow = 0) Then
            lngAdjust = 0
        End If
        lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
            + lngLow) / 600000000 - lngAdjust) / 1440
        Integer8Date = CDate(lngDate)
    End Function

     

     

    Friday, August 31, 2007 1:41 AM
  •  

    Filipe,

     

    Rodei seu script mas está ocorrendo o seguinte erro.

     

    Linha 16

    carct 1

    Erro Tabela inexistente

    Código 80040E37

    Origem provider

     

     

    Vc poderia me ajudar?

     

    Abs

    Monday, September 03, 2007 1:36 PM
  • Você está executando esse script em uma máquina com qual versão de Windows? Ela está no domínio? Pelo que eu entendi, o problema foi o ADODB não conseguir fazer a consulta direto no AD.

    []s,

    --
    Vinicius Canto <scripterbr_at_gmail_dot_com>
    MVP Windows Server - Admin Frameworks
    MCP Windows 2000 Server, Windows XP e SQL Server 2000
    Bacharelando em Ciências da Computação - USP

    Blog sobre Scripting e Windows Powershell: http://viniciuscanto.blogspot.com
    Wednesday, September 05, 2007 11:27 AM
    Moderator
  • Cara, tem uma ferramenta muito simples de usar, chama-se OLDCMP. É um executavel que lista quais maquinas estao inativas no seu AD. Muito facil de usar

    Thursday, November 08, 2007 7:58 PM
  • No meu caso retornou o mesmo erro do colega, e eu rodei no servidor de dominio.

     

    Tem idéia do que pode estar acontecendo?

     

    Obrigado

    Friday, November 09, 2007 10:41 AM
  •  

    Boas,

     

    Pode me dizer onde posso fazer o download dessa aplicação OLDCMP? Ou é um aplicativo do Windows 2003 Server?

     

    Cumps,

    Pedro

    Tuesday, November 13, 2007 2:39 AM
  • Olá,

    já experimentou usar algum site de busca?

    http://www.google.com.br/search?q=OLDCMP&ie=utf-8&oe=utf-8&aq=t&rls=org.mozillaStick out tonguet-BRSurprisefficial&client=firefox-a

    []s,

    Vinicius
    Tuesday, November 13, 2007 10:56 AM
    Moderator
  • Ricardo qual o comando exato usando oldcmp para identificar as estações inativas por um periodo de 30 dias....

     

    estou utilizando comandos mas o resultado nao esta sendo o esperado.

     

    obrigado.

     

    Friday, April 11, 2008 7:45 PM
  • Nesse script onde mudo a OU para ele exportar e onde adiciono o meu dominio ?

     

    Show o script

     

    Thursday, May 15, 2008 8:48 PM
  • dsquery -inactive 30


    []s,


    Vinicius Canto
    MVP Admin Frameworks
    Blog sobre scripting: http://viniciuscanto.blogspot.com
    Wednesday, August 13, 2008 1:43 PM
    Moderator
  • Esse script esta com erro na linha 16 para funcionar você deverá colocar uma aspa antes da frase que será exibida.

     

    Abaixo tem a linha 16 como a correção do erro

     

    intDays = InputBox("Especifique a quantidade de dias para que o computador seja considerado inativo.")

    Wednesday, August 13, 2008 10:37 PM
  • cara, eu naum consigo fazer o script reconhecer a OU desejada.... como seria o caminho???
    felipe-tecnico@hotmail.com

    grato...

    felipe.
    Monday, June 29, 2009 8:21 PM
  • Pessoal eu vi a resposta do Vinicius:
    dsquery -inactive 30

    Só fiz um ajuste =>dsquery computer -inactive 30.

    Ele lista nas ultimas 30 semanas as maquinas que não reportaram nada para o AD, ai eu apaguei essas maquinas, achei bem mais fácil.

    Monday, November 16, 2009 11:41 AM
  • Olá pessoal ...

    Tenho uma necessidade similar e algumas dúvidas:

    1- Preciso que os "usuários" que não efetuam logon há mais de 60 dias, sejam movidos para uma OU em específico e ao mesmo tempo, sejam bloqueados ( OU Bloqueados, exemplo )

    2- Se o usuário não loga há 90 dias desde que foi criado, ele deve ser excluído !

    Eu tentei executar os scripts acima apenas para análise, mas os comandos não foram reconhecidos ( Windows 2000 ) ... é preciso instalar algum aplicativo para que o dsquery funcione, por exemplo ?

    Agradeço desde já !

    Abraços !

    ---

    EDIT

    Galera, o OLDCMP serve apenas para consulta, ou tbém para movimentar contas entre OU, ou até desabilitá-las ?

    Abraços !


    Wednesday, November 18, 2009 2:14 PM
  • Olá Filipe,

     

    Tentei rodar seu script na minha rede mas ele retornou o seguinte erro:

     

    Linha: 1

    Caract: 1

    Erro: Tipos imconpatíveis: 'Code'

    Código: 800A000D

    Origem: Erro de tempo de execução do Microsoft VBScript

     

    Poderia me ajudar?

     

    Valeu!!!

    Thursday, July 07, 2011 1:38 PM
  • Olá,

     

    Eis o link para baixar o OldCmp: http://www.joeware.net/freetools/tools/oldcmp/index.htm

     

    Até mais!

    • Proposed as answer by Breno Carvalho Monday, January 20, 2014 6:11 PM
    Thursday, July 07, 2011 1:52 PM