Определите, должен ли пользователь сбросить пароль в Active Directory с помощью C # - PullRequest
8 голосов
/ 08 ноября 2011

В Active Directory, если учетная запись пользователя отключена, а затем включена, по умолчанию пользователь должен изменить свой пароль при первом входе в систему. Я изо всех сил пытаюсь обнаружить это программно с помощью C #? Есть ли свойство, которое установлено или что-то в этом духе, если пользователь должен сбросить свое свойство?

Скажем, у меня есть DirecotryEntry объект, указывающий на пользователя:

DirectoryEntry user = ...

Есть ли свойство, которое я могу использовать:

user.Properties[someProperty];

Ответы [ 4 ]

8 голосов
/ 08 ноября 2011

Условие хранится в двух атрибутах:

  • pwdLastSet: если значение установлено в 0 ...
  • userAccountControl: и флаг UF_DONT_EXPIRE_PASSWD не установлен.

С здесь .

6 голосов
/ 08 ноября 2011

Вот что я написал для этого.Не совсем отвечает на ваш вопрос, но полезен для тех, кто читает его позже.

Важные биты от PrincipalContext on.Все вышеперечисленное - это то, как я всегда пытался вернуть AdName с правильной прописной буквой.

Обратите внимание, что это всего лишь код, который делает первый ответ, протестируйте LastPasswordSet с использованием принципала пользователя вместо DE.

Эрик-

     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;
      }
3 голосов
/ 09 ноября 2011

удалось получить его, используя следующий код:


        public bool PasswordRequiresChanged(string userName)
        {
            DirectoryEntry user = GetUser(userName); //A directory entry pointing to the user
            Int64 pls;
            int uac;

            if (user != null && user.Properties["pwdLastSet"] != null && user.Properties["pwdLastSet"].Value != null)
            {
                pls = ConvertADSLargeIntegerToInt64(user.Properties["pwdLastSet"].Value);           
            }
            else
            {
                throw new Exception("Could not determine if password needs reset");
            }

            if (user != null && user.Properties["UserAccountControl"] != null && user.Properties["UserAccountControl"].Value != null)
            {
                uac = (int)user.Properties["UserAccountControl"].Value;
            }
            else
            {
                throw new Exception("Could not determine if password needs reset");
            }

            return (pls == 0) && ((uac & 0x00010000) == 0) ? true : false;
        }


 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;
        }

1 голос
/ 31 мая 2012
var username = "radmin";
var adContext = new PrincipalContext(ContextType.Domain, adLocation, adContainer, adAdminUsername, adAdminPassword);
var user = UserPrincipal.FindByIdentity(adContext, username);
Console.WriteLine(user.LastPasswordSet);

Если LastPasswordSet имеет нулевое значение, «пользователь должен сменить пароль при следующем входе в систему».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...