8
votes

Détecter si l'utilisateur doit réinitialiser le mot de passe dans Active Directory à l'aide de C #

dans Active Directory, si le compte d'utilisateur est désactivé puis activé, par défaut, l'utilisateur doit modifier leur mot de passe sur la première connexion. J'ai du mal à pouvoir détecter cette programmabilité en utilisant c #? Existe-t-il une propriété qui est définie ou quelque chose le long de ces lignes si un utilisateur doit réinitialiser leur propriété?

dire que j'ai un direcotryenterry point pointant sur un utilisateur: xxx < / Pré>

Y a-t-il une propriété que je peux utiliser: xxx


0 commentaires

4 Réponses :


8
votes

La condition est stockée dans deux attributs:

  • pwdlastset: si la valeur est définie sur 0 ...
  • userAccountControl: et le drapeau UF_Dont_Expire_Passwd n'est pas défini.

    de ici .


0 commentaires

6
votes

Voici ce que j'ai écrit pour faire cela. Ne répondez pas exactement à votre question, mais utile aux autres qui la lisent plus tard.

Les bits importants sont originaires de la principaleContext. Tous les trucs ci-dessus, c'est comme ça que j'ai essayé de toujours récupérer l'adname avec la capitalisation correcte exacte. P>

Remarque Ceci est juste que le code fait la première réponse, testez LastPasswordset à la place d'un utilisateur de l'utilisateur au lieu d'une DE. P>

ERIC - P>

     private bool TestAdShouldChangePassword( string adUser )
     {
                    try
                    {
                        string adName = "";
                        MembershipUser mu = Membership.GetUser( adUser );

                        if ( mu != null )
                        {
                            IStudentPortalLoginBLL splBll = ObjectFactory.GetInstance< IStudentPortalLoginBLL >();
                            adName = splBll.GetCleanAdName( adUser );// I wrote this is just pulls outhe name and fixes the caplitalization - EWB

                            PrincipalContext pctx = new PrincipalContext( System.DirectoryServices.AccountManagement.ContextType.Domain );
                            UserPrincipal p = UserPrincipal.FindByIdentity( pctx, adName );

                            if ( p == null )
                                return false;

                            if ( p.LastPasswordSet.HasValue == false && p.PasswordNeverExpires == false )
                            {
                                return true;
                            }
                        }
                    }
                    catch ( MultipleMatchesException mmex )
                    {
                        log.Error ( "TestAdShouldChangePassword( ad user = '" + adUser + "' ) - Exception finding user, can't determine if ad says to change password, returing false : Ex = " + mmex.ToString() );
                    }

                    return false;
      }


2 commentaires

Impressionnant. Je vais essayer cela en ce moment. Question cependant, quelles références cela utilisez-t-il?


Système.directoryservices.accountmanagement; en utilisant system.security.Authentication; Utiliser System.Web.Sécurité; Je n'ai pas besoin de laquelle de ceux-ci il a besoin de bon escient, mais ma meilleure hypothèse est juste s.ds.am



3
votes

a pu l'obtenir à l'aide du code suivant:


 private static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger)
        {
            var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
            var lowPart = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
            return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart;
        }


0 commentaires

1
votes
var username = "radmin";
var adContext = new PrincipalContext(ContextType.Domain, adLocation, adContainer, adAdminUsername, adAdminPassword);
var user = UserPrincipal.FindByIdentity(adContext, username);
Console.WriteLine(user.LastPasswordSet);
If LastPasswordSet has a null value, the "user must change password at next logon". 

1 commentaires

Je souhaite que L'utilisateur ne change pas de mot de passe à la prochaine connexion . comment ?