Active Directory (LDAP) - Conta de cheque bloqueada / Senha expirada

Atualmente eu autentico usuários contra algum AD usando o seguinte código:

DirectoryEntry entry = new DirectoryEntry(_path, username, pwd);

try
{
    // Bind to the native AdsObject to force authentication.
    Object obj = entry.NativeObject;

    DirectorySearcher search = new DirectorySearcher(entry) { Filter = "(sAMAccountName=" + username + ")" };
    search.PropertiesToLoad.Add("cn");
    SearchResult result = search.FindOne();
    if (result == null)
    {
        return false;
    }
    // Update the new path to the user in the directory
    _path = result.Path;
    _filterAttribute = (String)result.Properties["cn"][0];
}
catch (Exception ex)
{
    throw new Exception("Error authenticating user. " + ex.Message);
}

Isso funciona perfeitamente para validar uma senha contra um nome de usuário.

O problema é que um erro genérico sempre é retornado "Falha de logon: nome de usuário desconhecido ou senha incorreta". quando a autenticação falhar.

No entanto, a autenticação também pode falhar quando uma conta é bloqueada.

Como eu saberia se está falhando por causa disso ser bloqueado?

Eu me deparei com artigos dizendo que você pode usar:

Convert.ToBoolean(entry.InvokeGet("IsAccountLocked"))

ou fazer algo como explicadoAqui

O problema é que, sempre que você tentar acessar qualquer propriedade no DirectoryEntry, o mesmo erro será lançado.

Alguma outra sugestão de como chegar ao motivo real de que a autenticação falhou? (conta bloqueada / senha expirada / etc)

O AD ao qual me conecto pode não ser necessariamente um servidor Windows.

questionAnswers(4)

yourAnswerToTheQuestion