Encuentra cuentas bloqueadas en Active Directory (¡una forma que realmente funciona!)

8

Busqué en Google cómo enumerar cuentas bloqueadas y encontré dos métodos hasta ahora, los cuales no funcionan ...

Consulta guardada (&(&(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))))

Enumera varias cuentas, muchas de las cuales no están bloqueadas. Si desbloqueo uno que sé que está bloqueado, la consulta todavía lo devuelve.

Comando Powershell Search-ADAccount -LockedOut

No hace nada.

Entonces, ¿estoy haciendo algo mal? O bien, ¿hay algún método que realmente funcione?

MrVimes
fuente
Solo una pequeña nota: para administrar el dominio con los comandos incluidos en el módulo AD PowerShell (incluido el uso del comando Search-ADAccount), debe tener instalado el servicio Active Directory Web Services (ADWS) en al menos un controlador de dominio en este dominio. Pero supongo que esto no es un problema porque si no tiene una instancia de ADWS, recibirá un mensaje de error que le notificará al respecto.
Mikhail

Respuestas:

11

No necesariamente confiaría Get-ADUser -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))" -Properties LockedOut, ya que tampoco me está devolviendo resultados confiables, pero tampoco puedo contactarme directamente con mi PDCe en este momento. Para obtener mejores resultados, desearía apuntar directamente a su emulador PDC, ya que siempre tiene la información más actualizada sobre bloqueos de cuentas en todo el dominio.

Es lo que estoy apostando que estás presenciando aquí es un retraso en la replicación:

... el bloqueo de cuenta se replica con urgencia al propietario del rol del emulador del controlador de dominio primario (PDC) y luego se replica con urgencia a lo siguiente:

• Controladores de dominio en el mismo dominio que se encuentran en el mismo sitio que el emulador PDC.

• Controladores de dominio en el mismo dominio que se encuentran en el mismo sitio que el controlador de dominio que manejó el bloqueo de la cuenta.

• Controladores de dominio en el mismo dominio que se encuentran en sitios que se han configurado para permitir notificaciones de cambio entre sitios (y, por lo tanto, replicación urgente) con el sitio que contiene el emulador PDC o con el sitio donde se manejó el bloqueo de la cuenta. Estos sitios incluyen cualquier sitio que esté incluido en el mismo enlace del sitio que contiene el emulador PDC o en el mismo enlace del sitio que contiene el controlador de dominio que manejó el bloqueo de la cuenta.

Además, cuando la autenticación falla en un controlador de dominio que no sea el emulador PDC, la autenticación se vuelve a intentar en el emulador PDC. Por este motivo, el emulador PDC bloquea la cuenta antes del controlador de dominio que manejó el intento de contraseña fallida si se alcanza el umbral de intento de contraseña incorrecta. Para obtener más información sobre cómo el propietario del rol del emulador PDC gestiona los cambios de contraseña y los bloqueos de cuentas, consulte "Administración de operaciones flexibles de maestro único" en este libro.

Así que intenta Search-ADAccount -LockedOut -Server DC-PDCEver si tus resultados son mejores.

Además, aquí hay algo más a tener en cuenta al generar consultas en torno al atributo lockoutTime:

Este valor de atributo solo se restablece cuando la cuenta inicia sesión correctamente. Esto significa que este valor puede ser distinto de cero, pero la cuenta no está bloqueada. Para determinar con precisión si la cuenta está bloqueada, debe agregar la duración del bloqueo a esta hora y comparar el resultado con la hora actual, teniendo en cuenta las zonas horarias locales y el horario de verano.

Editar: a modo de ingeniería inversa Microsoft.ActiveDirectory.Management.dll, puedo decirte que Search-ADAccount -LockedOut, que me parece que produce resultados bastante confiables, ejecuta el siguiente código:

else if ((bool) this._paramSet.LockedOut)
      {
        list.Add(ADAccountFactory<ADAccount>.AttributeTable[cmdletSessionInfo.ConnectedADServerType]["AccountLockoutTime"].InvokeToSearcherConverter(ADOPathUtil.CreateFilterClause(ADOperator.Ge, "AccountLockoutTime", (object) 1), cmdletSessionInfo));
        this.OutputFilterFunction = new ADGetCmdletBase<SearchADAccountParameterSet, ADAccountFactory<ADAccount>, ADAccount>.OutputFilterDelegate(this.FilterIsLockedOut);
      }
      if (list.Count > 0)
        this.OutputSearchResults(list.Count != 1 ? ADOPathUtil.CreateAndClause(list.ToArray()) : list[0]);
      else
        this.OutputSearchResults((IADOPathNode) null);

¡Parece que también Search-ADAccount -LockedOutestá mirando el atributo AccountLockoutTime!

Edite un poco más para una gran justicia: Richard Mueller, Dir. Servicios MVP, dice esto:

No puede usar el atributo userAccountControl para identificar a los usuarios que están bloqueados. Hay un poco de userAccountControl documentado para esto, pero no se usa.

Puedo verificar esto así:

PS C:\Users\ryan> $(Search-ADAccount -LockedOut).Count
11
PS C:\Users\ryan> $(Get-ADUser -LDAPFilter "(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=16))").Count
0

Finalmente, me gustaría terminar en esta publicación de blog sobre el tema , que explica por qué se lockoutTime>=1está acercando a la mejor solución, pero eso es solo una parte de la historia. Debe filtrar aún más la lista para incluir solo a los usuarios en los que su tiempo de bloqueo es superior a $ (la duración de bloqueo de su dominio) minutos en el pasado.

Ryan Ries
fuente
Me interesará encontrar documentación de cuándo ese userAccountControlbit dejó de ser válido. Funcionó bien en el pasado, si la memoria sirve. Me hace preguntarme si la funcionalidad se eliminó en una revisión posterior del código AD. Hmm ...
Evan Anderson
Bueno, odio seguir apelando a la autoridad, pero Richard Mueller dice que no ha funcionado desde Windows 2000.
Ryan Ries
Sospecho que funciona en Windows 2000 cuando hay controladores de dominio de Windows NT 4.0 presentes, porque necesitaría estar allí para facilitar la replicación a DC que tienen un SAM. Ya no tengo un entorno de prueba creado para NT 4.0 (eliminé todas esas máquinas virtuales antiguas) pero definitivamente voy a probarlo. Habría tiene que haber una manera de SAM-DC solamente para poder estar al tanto de la cuenta lockout-- esa es la única manera que puedo ver su funcionamiento.
Evan Anderson
@EvenAnderson Apoyo de todo corazón su investigación y espero con entusiasmo los resultados de sus pruebas. :)
Ryan Ries