O módulo ActiveDirectory
tem uma lógica inteligente que calcula propriedades "populares", como se uma conta de usuário é Enabled
ou tem PasswordNeverExpires
definido e as apresenta como atributos regulares.
Internamente, são derivados de atributos reais da conta, como userAccountControl
e pwdLastSet
.
Configurações da conta
userAccountControl
é um campo de bits e contém uma longa lista de configurações relacionadas à segurança da conta, como "O usuário não pode alterar a senha" e a conta "Desativado".
A implementação do LDAP da Microsoft permite filtrar esse atributo com operadores bit a bit, identificados por um identificador de objeto (OID):
-
LDAP_MATCHING_RULE_BIT_AND: 1.2.840.113556.1.4.803
-
LDAP_MATCHING_RULE_BIT_OR : 1.2.840.113556.1.4.804
Para encontrar Disabled
accounts, podemos usar a seguinte sintaxe de filtro:
(&(userAccountControl:1.2.840.113556.1.4.803:=2))
Como sempre, você pode negar uma expressão ldap com !
, neste exemplo recuperando todas as contas Enabled
:
(!(userAccountControl:1.2.840.113556.1.4.803:=2))
Da mesma forma, uma configuração chamada DONT_EXPIRE_PASSWORD
tem valor 65536 (0x10000) e podemos encontrar essas contas com:
(&(userAccountControl:1.2.840.113556.1.4.803:=65536))
Expiração de senha
O cálculo da expiração da senha é um pouco mais complicado . Para ajudar desenvolvedores e integradores, a Microsoft implementou um atributo dinâmico chamado msDS-User-Account-Control-Computed
.
msDS-User-Account-Control-Computed
transparentemente retorna o mesmo valor que userAccountControl
, mas com a adição dos seguintes bits, computados em tempo real no momento da pesquisa:
UF_LOCKOUT 0x0010
UF_PASSWORD_EXPIRED 0x800000
UF_PARTIAL_SECRETS_ACCOUNT 0x4000000
UF_USE_AES_KEYS 0x8000000
Eu não testei isso, mas se a memória me servir corretamente, isso deve ajudá-lo a confiantemente identificar contas com senhas expiradas com este filtro :
(&(msDS-User-Account-Control-Computed:1.2.840.113556.1.4.803:=8388608))
Infelizmente, não é possível usar atributos construídos em filtros de consulta LDAP, portanto, o que você precisará fazer é filtrar as duas primeiras instruções:
(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(!userAccountControl:1.2.840.113556.1.4.803:=65536))
Certifique-se de pedir ao servidor de diretório o valor msDS-User-Account-Control-Computed
e, em seguida, execute sua máscara E bit a bit nos resultados, no lado do cliente.