jueves, 25 de noviembre de 2010

Test de Red - Problemas conexiones. Trobleshooting

Con este post pretendo intentar detectar problemas de una manera básica entre nodos de nuestra Lan que tengan por medio switches o routers, problemas que se salgan de lo básico sin llegar a un nivel muy alto mediante comandos estandart de Microsoft.

En función a la prueba obtendremos unos tiempos/latencias diferentes,  ya sea por la electrónica, por el medio de conexiòn que tengamos, etc ... .

[1] Ping básico

Ping en nuestra propia Red. Si este comando no responde, normalmente prodía deberse a que está apagado el host contra el que estamos haciendo ping o tiene algún programa que evite contestar (como por ejermplo un firewall, ACL del switcth...).



Ping a través de una línea externa RDSI



Ping a través de una F.O.


Lo mas significativo de estás 3 imágenes son los tiempos en función a la calidad del servicio de las líneas.

Otro caso de porque no podría responder un ping podría ser debido a que tuviesemos el gateway mal configurado o que algún elemento entre los 2 nodos no sepa devolver el paquete.

[2] Ping –a. Con resolución de nombres DNS

Es importante si accedemos a los nodos por nombre en lugar de por IP.


Puede resolver el nombre aunque tengamos la máquina apagada.


[3] Tracert

Es útil si hay routers por medio.

En nuestra LAN en la que hay switches no aporta mucha información.


Si pasamos por router nos informa por los que hemos pasado para llegar al destino y sus tiempos:


[4] Verificar la MTU

A veces necesitamos verificar la MTU cuando pasamos entre routers, una manera de hacerlo sería modificando el tamaño del paquete.

El tamaño estandar de un paquete ping icmp es de 32 bytes. Si tenemos problemas podemos ir disminuyendo/aumentando hasta encontrar el tamaño con el que pase sin errores.

ping -l tamañoMTP IPDestino
ping -l 1000 172.5.100.1



Lo mejor sería hacerlo sin fragmentar -f


Muchos routers tienen un tamaño de 1500 en su MTU. Si sumamos cierta seguridad a los paquetes eso incrementa su tamaña haciendo que no se corresponda con el definido en los enrutadores ocasionado problemas.

[5] Pathping

Un nuevo comando que apareció a partir de las Windows 2000, es una mezcla de un ping parametrizado y un tracert.



MÁS COSAS A CONSIDERAR:


Entrar en los Switches a través de Telnet/SSH/http/https ...

Sería de gran ayuda verificar los puertos de los routers si establencen la conexión correctamenet:

FD/HD/AUTO
10/100/1000
Bloqueado por alguna regla (ACL)


Con este pantallazo ves si se han incrementado las coincidencias en reglas aplicadas



... que no pertenezca a otra Vlan



Que no haya paquetes perdidos, con errores, bloqueados o retrasmisiones


También se puede hacer através del entorno gráfico, pero misteriosamente no siempre se corresponde.

No puede haber colisiones en conexiones FD.

No pueden haber 2 caminos ACTIVOS para llegar a un host (Peligrosisimo!!)

Existen herramientas que nos pueden ser tremendamente útilies para ver los paquetes que van por nuestra red y/o que máquinas lo están generando como Wireshark o Sysinternals.

También nos puede ser útil el post: http://gonsystem.blogspot.com/2010/10/troubleshooting-problemas-red.html


lunes, 22 de noviembre de 2010

Ultimo logon en el AD

Muchas veces se empiza a llenar nuestro AD de usuarios que ya no trabajan en nuestra empresa ya sea por descuido o porque no nos han avisado van quedando para la posteridad.

Yo gracias al script de Richard L. Mueller de vez en cuando filtro la última vez que un usuario se logeo en nuestro sistema.

Para ejecutarlo copiar el siguiente código en un fichero de texto y ponerle la extensión .vbs luego escribir xxxx.vbs Fichero_de_salida


' VBScript program to determine when each user in the domain last logged
' on.
'
' ----------------------------------------------------------------------
' Copyright (c) 2002 Richard L. Mueller
' Hilltop Lab web site -
http://www.rlmueller.net
' Version 1.0 - December 7, 2002
' Version 1.1 - January 17, 2003 - Account for null value for lastLogon.
' Version 1.2 - January 23, 2003 - Account for DC not available.
' Version 1.3 - February 3, 2003 - Retrieve users but not contacts.
' Version 1.4 - February 19, 2003 - Standardize Hungarian notation.
' Version 1.5 - March 11, 2003 - Remove SearchScope property.
' Version 1.6 - May 9, 2003 - Account for error in IADsLargeInteger
'                             property methods HighPart and LowPart.
' Version 1.7 - January 25, 2004 - Modify error trapping.
' Version 1.8 - July 6, 2007 - Modify how IADsLargeInteger interface
'                              is invoked.
'
' Because the lastLogon attribute is not replicated, every Domain
' Controller in the domain must be queried to find the latest lastLogon
' date for each user. The lastest date found is kept in a dictionary
' object. The program first uses ADO to search the domain for all Domain
' Controllers. The AdsPath of each Domain Controller is saved in an
' array. Then, for each Domain Controller, ADO is used to search the
' copy of Active Directory on that Domain Controller for all user
' objects and return the lastLogon attribute. The lastLogon attribute is
' a 64-bit number representing the number of 100 nanosecond intervals
' since 12:00 am January 1, 1601. This value is converted to a date. The
' last logon date is in UTC (Coordinated Univeral Time). It must be
' adjusted by the Time Zone bias in the machine registry to convert to
' local time.
'
' You have a royalty-free right to use, modify, reproduce, and
' distribute this script file in any way you find useful, provided that
' you agree that the copyright owner above has no warranty, obligations,
' or liability for such use.

Option Explicit
Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery
Dim adoRecordset, objDC
Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
Dim strDN, dtmDate, objDate, objList, strUser
Dim strBase, strFilter, strAttributes, lngHigh, lngLow

' Use a dictionary object to track latest lastLogon for each user.
Set objList = CreateObject("Scripting.Dictionary")
objList.CompareMode = vbTextCompare

' 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

' Determine configuration context and DNS domain from RootDSE object.
Set objRootDSE = GetObject("
LDAP://RootDSE")
strConfig = objRootDSE.Get("configurationNamingContext")
strDNSDomain = objRootDSE.Get("defaultNamingContext")

' Use ADO to search Active Directory for ObjectClass nTDSDSA.
' This will identify all Domain Controllers.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

strBase = "<LDAP://" & strConfig & ">"
strFilter = "(objectClass=nTDSDSA)"
strAttributes = "AdsPath"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"

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

Set adoRecordset = adoCommand.Execute
' Enumerate parent objects of class nTDSDSA. Save Domain Controller
' AdsPaths in dynamic array arrstrDCs.
k = 0
Do Until adoRecordset.EOF
    Set objDC = _
        GetObject(GetObject(adoRecordset.Fields("AdsPath").Value).Parent)
    ReDim Preserve arrstrDCs(k)
    arrstrDCs(k) = objDC.DNSHostName
    k = k + 1
    adoRecordset.MoveNext
Loop
adoRecordset.Close

' Retrieve lastLogon attribute for each user on each Domain Controller.
For k = 0 To Ubound(arrstrDCs)
    strBase = "<LDAP://" & arrstrDCs(k) & "/" & strDNSDomain & ">"
    strFilter = "(&(objectCategory=person)(objectClass=user))"
    strAttributes = "distinguishedName,lastLogon"
    strQuery = strBase & ";" & strFilter & ";" & strAttributes _
        & ";subtree"
    adoCommand.CommandText = strQuery
    On Error Resume Next
    Set adoRecordset = adoCommand.Execute
    If (Err.Number <> 0) Then
        On Error GoTo 0
        Wscript.Echo "Domain Controller not available: " & arrstrDCs(k)
    Else
        On Error GoTo 0
        Do Until adoRecordset.EOF
            strDN = adoRecordset.Fields("distinguishedName").Value
            On Error Resume Next
            Set objDate = adoRecordset.Fields("lastLogon").Value
            If (Err.Number <> 0) Then
                On Error GoTo 0
                dtmDate = #1/1/1601#
            Else
                On Error GoTo 0
                lngHigh = objDate.HighPart
                lngLow = objDate.LowPart
                If (lngLow < 0) Then
                    lngHigh = lngHigh + 1
                End If
                If (lngHigh = 0) And (lngLow = 0 ) Then
                    dtmDate = #1/1/1601#
                Else
                    dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
                        + lngLow)/600000000 - lngBias)/1440
                End If
            End If
            If (objList.Exists(strDN) = True) Then
                If (dtmDate > objList(strDN)) Then
                    objList.Item(strDN) = dtmDate
                End If
            Else
                objList.Add strDN, dtmDate
            End If
            adoRecordset.MoveNext
        Loop
        adoRecordset.Close
    End If
Next

' Output latest lastLogon date for each user.
For Each strUser In objList.Keys
    Wscript.Echo strUser & " ; " & objList.Item(strUser)
Next

' Clean up.
adoConnection.Close
Set objRootDSE = Nothing
Set adoConnection = Nothing
Set adoCommand = Nothing
Set adoRecordset = Nothing
Set objDC = Nothing
Set objDate = Nothing
Set objList = Nothing
Set objShell = Nothing



Verificado en Windows 2003. Noviembre 2010

Espero os sea igual de útil que a mi lo está siendo.