Mostrando entradas con la etiqueta email. Mostrar todas las entradas
Mostrando entradas con la etiqueta email. Mostrar todas las entradas

miércoles, 27 de mayo de 2026

WINDOWS. GPO. Usuario bloqueado email

Propósito:

Por diferentes motivos las cuentas de nuestros usuarios del AD se bloquean, ya sea de manera automática, por culpa del propio usuario o cualquier otra circunstancia.

Esto al final acaba en tiempo de gestión para los administradores y poca visibilidad e información para los usuarios.

El script que voy a pegar podría hacerse de muchas maneras, en las que aportarían más información, pero he querido que sea sencillo y que no necesite mirar el visor de eventos (que tendría que ir a cada uno de nuestros DC si no están centralizados) y sin crear ningún fichero en el disco.

Al final acaba enviando un email al usuario e informándole que ha sido bloqueado. Te puedes preguntar ¿cómo lo va a leer si tiene el usuario del AD bloqueado?.. buena pregunta. En mi caso las cuentas de correo no están gestionadas por el AD, en otras cuentas de proveedor pongo la externa (no tienen cuenta de correo interna), hay muchos casos.

Esta claro que para que funcione la cuenta del usuario del AD debe tener documentado el email. Otra opción es que siempre que se bloquee, se envíe email solo a IT o con copia a IT.

La idea es que solo envíe una alerta por hora, para no ser muy pesado. Con lo que es importante configurar bien el programador de tareas.

Esto va muy bien sobre todo con proveedores, se dejan sesiones abiertas en los servidores durante mucho tiempo y cuando van a conectar porque les necesitamos no pueden. Con esta medida les llega un email para que cierren las sesiones y eviten este tipo de bloqueo.

En mi caso a los proveedores les caduca la contraseña automáticamente cada 24h, así que si no cierran sesión de un día para otro, esto les supone un bloqueo ya que tienen la sesión abierta con una contraseña caducada.

El resultado sería el siguiente email:


Pasos

El Script :

# ============================================================

# SCRIPT: AD-Lockout-UserNotify.ps1

# ============================================================

# FUNCION:

# Detecta usuarios bloqueados en Active Directory usando

# el atributo lockoutTime, consultando directamente contra

# el PDC Emulator para garantizar consistencia.

#

# ============================================================


Import-Module ActiveDirectory


# ==========================

# VARIABLES DEL USUARIO

# ==========================

$SMTPServer = "smtp.MiDominio.com"

$SMTPPort   = 25

$From       = "Servodorenvio@MiDominio.com"


# ==========================

# OBTENCION DEL PDC

# ==========================

$domain = Get-ADDomain

$PDC = $domain.PDCEmulator


# ==========================

# CONFIGURACION

# ==========================

$now = Get-Date


$startWindow = $now.AddMinutes(-65)

$endWindow   = $now.AddMinutes(-2)


$lockoutDuration = 60


$startFileTime = $startWindow.ToFileTime()

$endFileTime   = $endWindow.ToFileTime()


# ==========================

# BUSQUEDA

# ==========================

$lockedUsers = Get-ADUser -Server $PDC `

-Filter {lockoutTime -gt 0} `

-Properties lockoutTime,mail,displayName,lastLogonDate,lastBadPasswordAttempt,passwordLastSet


foreach ($user in $lockedUsers) {


    if ($user.lockoutTime -gt 0 -and $user.mail) {


        $lockoutDate = [DateTime]::FromFileTime($user.lockoutTime)


        if ($user.lockoutTime -ge $startFileTime -and $user.lockoutTime -le $endFileTime) {


            if ($lockoutDate.AddMinutes($lockoutDuration) -gt $now) {


                # ==========================

                # CONVERSIONES SEGURAS

                # ==========================

                $LastLogon = if ($user.LastLogonDate) { $user.LastLogonDate } else { "No disponible" }

                $LastBadPwd = if ($user.LastBadPasswordAttempt) { $user.LastBadPasswordAttempt } else { "No disponible" }

                $PwdLastSet = if ($user.PasswordLastSet) { $user.PasswordLastSet } else { "No disponible" }


                $remaining = [math]::Round(($lockoutDate.AddMinutes($lockoutDuration) - $now).TotalMinutes)

                if ($remaining -lt 0) { $remaining = 0 }


                # ==========================

                # ASUNTO CORPORATIVO

                # ==========================

                $fecha = Get-Date -Format "yyyyMMdd - HH:mm"

                $Subject = "$fecha. SE. SEGURIDAD. Cuenta bloqueada: $($user.SamAccountName)"

$mail = $($user.mail)


                # ==========================

                # EMAIL HTML

                # ==========================

                $html = @"

<html>

<body style='font-family:Calibri;font-size:14px'>


<p>Hola $($user.displayName),</p>


<p><b>Su cuenta ha sido bloqueada por un proceso automatico.</b></p>


<p>Motivos habituales:</p>


<ul>

<li>Cambio de password reciente</li>

<li>Password caducado</li>

<li>Sesion activa con credenciales antiguas (muy probable)</li>

<li>Servicios o aplicaciones con password antiguo</li>

</ul>


<p>Revise los equipos donde haya iniciado sesion y vuelva a autenticarse.</p>


<p><b>Datos del bloqueo:</b></p>


<ul>

<li>Usuario: $($user.SamAccountName)</li>

<li>Fecha bloqueo: $lockoutDate</li>

<li>Tiempo restante bloqueo: $remaining minutos</li>

</ul>


<p><b>Informacion adicional:</b></p>


<ul>

<li>Ultimo logon: $LastLogon</li>

<li>Ultimo intento fallido: $LastBadPwd</li>

<li>Password cambiado: $PwdLastSet</li>

</ul>


<p>Contacte con IT de soporte@MiDominio.com si persiste.</p>


</body>

</html>

"@


                Send-MailMessage `

                -SmtpServer $SMTPServer `

                -Port $SMTPPort `

                -From $From `

                -To $mail `

                -Subject $Subject `

                -Body $html `

                -BodyAsHtml


            }

        }

    }

}


 


La tarea programada :




Probar con un usuario:


Para probar y ver pon pantalla y si hay algín caso

Import-Module ActiveDirectory

$pdc = (Get-ADDomain).PDCEmulator

$lockedUsers = Search-ADAccount -LockedOut -Server $pdc

if ($lockedUsers) {

    Write-Host "Hay usuarios bloqueados"

    $lockedUsers | ForEach-Object {
        Write-Host $_.SamAccountName
    }

} else {

    Write-Host "No hay usuarios bloqueados"

}


by GoN | Published: May 2026 | Last Updated:

jueves, 20 de agosto de 2020

SECURITY. Check email exposed

 Purpose


Verify if an email account has been exposed.

Steps

Connect to https://haveibeenpwned.com/

Write a email address

The results



by GoN | Published: Aug 20, 2020 | Last Updated:

martes, 14 de febrero de 2017

Informational template

One reporting example to inform that there is a problem



by GoN | Published: Febrary 14, 2017 | Last Updated:

miércoles, 5 de octubre de 2016

Exchange. Queues stops. 451 4.4.0 Primary query Failed



Problem: 

The Exchange queues grow. The emails can't be send


Symptom:


The emails can't be send. The email queues grow.

On the Exchange console we have the message error "451 4.4.0 Primary query Failed”



Solution:


Go to "external DNS lookups" and change the parameter.


If you return to this menu to check it, the option will be  "(Todas las direcciones IPv4 disponibles)"

You could disable and enable someone queue to check.


Gon. October 2016

viernes, 19 de junio de 2015

Exchange. Reglas de Transporte.

Se ha dado el caso que tenemos un buzón compartido en el que varios usuarios tienen control. El responsable del departamento nos ha pedido si podríamos hacer algo desde el servidor de correo para redirigir unos emails con un determinado texto en el cuerpo del mensaje.

Le hemos propuesto la siguiente solución:

Abriendo la consola del Exchange nos hemos ido a :




 

Como veis tiene unas cuantas variaciones con las que podemos parametrizar.

GoN Junio 2015

jueves, 18 de junio de 2015

Deprecated. Envio aviso de evento por email.

Hasta no hace mucho enviar un email cuando aparecía cierto suceso era tan simple como hacer lo siguiente:

Nos vamos al evento, lo elegimos y le damos boton derecho "Attach tack.."



Podemos poner algún dato que nos informe porque lo hacemos.

 Siguiente

 Elegimos poner un email



Ponemos los datos que nos interese


Siguiente


Y nos da un error!!!  2147750704


Con lo que podemos hacer por otra vía. Elegiremos "Start program"





El contenido el script xxxx.ps1 serían las siguiente 2 líneas:

$PSEmailServer = "22.22.22.22"
Send-MailMessage -From "Origen@casa.es" -To "destino@sucasa.es" -Subject "Asunto Problema en el servidor" -Body "Cuerpo Mirar el problema"

Si así no se ejecuta poner

powershell xxxx.ps1

http://gonsystem.blogspot.com.es/2015/01/avisos-del-visor-de-eventos.html


GoN. Junio 2015