4 votes

ASP.NET C# Active Directory - Voir combien de temps avant l'expiration du mot de passe d'un utilisateur

J'ai un problème intéressant, j'écris une page web/service de gestion de mot de passe et j'essaie de trouver un moyen de déterminer quand le mot de passe d'un utilisateur va expirer afin de pouvoir réinitialiser manuellement ses autres mots de passe avec ce mot de passe et envoyer un email, etc.

Le problème que je rencontre est qu'en essayant de parcourir mes utilisateurs en boucle, je constate que la plupart d'entre eux n'ont pas d'attribut pwdlastset et que je ne peux donc pas déterminer la date d'expiration de l'attribut.

Je pense donc que je cherche des idées sur une bonne façon de vérifier quand le mot de passe d'un utilisateur va expirer en dehors de l'utilisation de la propriété pwdlastset et du calcul du temps restant.

Merci beaucoup.

8voto

marc_s Points 321990

C'est en fait un peu plus compliqué qu'il n'y paraît à première vue...

  • Pour connaître la durée de validité d'un mot de passe, vous devez lire une "politique de domaine" et la découvrir de cette manière.

Ensuite :

  • si l'utilisateur a le drapeau "UF_DONT_EXPIRE_PASSWD" dans son "userAccountControl", son mot de passe n'expirera jamais
  • si la valeur "pwdLastSet" (une valeur "ADSLargeInteger" ou Int64, qui est assez difficile à lire) est 0, l'utilisateur devra changer son mot de passe lors de sa prochaine connexion.
  • si la valeur "pwdLastSet" est -1, le mot de passe n'a jamais été défini
  • seulement si aucune des valeurs ci-dessus n'est vraie, la valeur "pwdLastSet" contient la date à laquelle le mot de passe a été défini pour la dernière fois, à laquelle vous pouvez ajouter la valeur "MaxPasswordAge" de la politique du domaine, ce qui vous donnera la date à laquelle le mot de passe de l'utilisateur va expirer.

Ouf ! Vous pensiez que ce serait aussi difficile ? :-)

Marc

PS : Si vous vous intéressez sérieusement à la programmation AD basée sur .NET, vous devez posséder ce livre :

DevGuide

Le guide du développeur .NET pour la programmation des services d'annuaire

Le livre contient toutes les informations utiles, comme la détermination des dates d'expiration des mots de passe des utilisateurs, la détermination de l'état de verrouillage des comptes utilisateurs et bien d'autres choses encore - à recommander vivement ! Joe et Ryan ont fait un travail remarquable en rassemblant toutes ces informations et en les expliquant de manière à ce que même un programmeur moyen comme moi puisse les comprendre :-)

0voto

Jeff Siver Points 4710

Pour autant que je sache, si pwdlastset est égal à zéro ou absent, l'utilisateur est tenu de modifier son mot de passe lors de la prochaine connexion ou son compte est configuré avec un mot de passe qui n'expire pas. Cela pourrait-il être la cause de ce que vous observez ?

0voto

Tawab Wakil Points 355

Voici une autre approche :

public static DateTime GetPasswordExpirationDate(UserPrincipal user)
{
    DirectoryEntry deUser = (DirectoryEntry)user.GetUnderlyingObject();
    ActiveDs.IADsUser nativeDeUser = (ActiveDs.IADsUser)deUser.NativeObject;
    return nativeDeUser.PasswordExpirationDate;
}

Vous devrez ajouter une référence à la bibliothèque COM ActiveDS, généralement située à l'adresse suivante C:\Windows\System32\activeds.tlb.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X