¿Cómo obtener programáticamente la configuración de directiva de grupo Enforce Password History?

¿Cómo puedo obtener programáticamente elHacer cumplir el historial de contraseñas configuración de la política de grupo?

Esfuerzo de investigación

Puede encontrar la opción de directiva de grupo en:

** Configuración del equipo \ Configuración de Windows \ Configuración de seguridad \ Políticas de cuenta \ Política de contraseña **

Hacer cumplir el historial de contraseñas

Esta configuración de seguridad determina el número de nuevas contraseñas únicas que deben asociarse con una cuenta de usuario antes de que se pueda reutilizar una contraseña anterior. El valor debe estar entre 0 y 24 contraseñas.

Esta política permite a los administradores mejorar la seguridad al garantizar que las contraseñas antiguas no se reutilicen continuamente.

Como todas las opciones de política de grupo, se almacena en el registro. Lamentablemente, se almacena en una ubicación de registro no documentada:

HKEY_LOCAL_MACHINE \ SAM \ SAM \ Domains \ Account \ F

En unformato de blob binario no documentado.

Ahíes una clase de WMIRSOP_SecuritySettingBoolean, pero sin ningún contexto, es solo un nombre colgando, que no tengo idea de cómo leer a través de COM / native.

NetValidatePasswordPolicy

Windows proporciona unNetValidatePasswordPolicy API eso le permitirá validar su contraseña para cosas como:

demasiados malos intentosbloqueo de cuentabloqueo de reinicio automáticoedad mínima de contraseñaedad máxima de contraseñareutilización de contraseña

y hará todas estas cosas siguiendo la política de grupo vigente en la computadora. Y todo funciona muy bien, excepto el historial de contraseñas.

La función requiere que pase una lista de hashes de contraseña, por ejemplo:

$2aesmACnM5lzNigHMaf7O1py1OLCBgGL4tYUF0N/4rS9CwDsI7ytwL4D6$2aesmACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km$2aformato de blob binario no documentado.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle$2aformato de blob binario no documentadoRo0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm

así como el hash de la nueva contraseña de candidato, por ejemplo:

$2aHKEY_LOCAL_MACHINE \ SAM \ SAM \ Domains \ Account \ F1JsBs47iuMNsV166PKV.u.56hlT5/tRe9V5t5FIdfA0axpDSQuNN

Esto causaráNetValidatePasswordPolicy para verificar si su hash actual coincide con alguno de los hash existentes. Desafortunadamente, todo el concepto de verificar hashes de contraseñas anteriores solo funciona cuando usa un algoritmo de contraseña débil (como PBKDF2 que usa Windows)

Porque uso un moderno,costoso, salado, algoritmo de hash de contraseña (BCrypt / SCrypt), un hash no se puede generar de manera determinista solo a partir de una contraseña; no puedo simplemente verificar la lista anterior. Tendría que volver a mostrar la nueva contraseña del usuariocada sal previamente almacenada.

no solo es una operación costosa; potencialmente tomar 12 segundos para verificar los 24 hashes almacenadosno sé cuándo parar, porque no sé el valor de la política del grupo Historial de contraseñas (por ejemplo, estaría revisando los 24 hashes almacenados, cuando solo necesito verificar cero).

He considerado llamarNetValidatePasswordPolicy con una lista ficticia de 24 hashes de contraseñas almacenadas, por ejemplo:

abcd...vwx

La API me dirá que la contraseña no coincide con ninguna en eln historia. Pero la API también está diseñada para devolverle lo que tiene que conservar. Esopodría luego regrese:

$2aHKEY_LOCAL_MACHINE \ SAM \ SAM \ Domains \ Account \ F1JsBs47iuMNsV166PKV.u.56hlT5/tRe9V5t5FIdfA0axpDSQuNNabc

Y a partir de eso podría inferir que la contraseña es histo, mi longitud escuatro.

Pero aún no he llegado allí.

Llevo tres días en esto y estoy perdiendo la paciencia.

¿Por qué Microsoft ofuscó la política de grupo?¿Por qué Microsoft no permitió que la gente lo leyera?¿Por qué es indocumentado?¿Cómo lo consigo todo igual?

Respuestas a la pregunta(1)

Su respuesta a la pregunta