2012-03-19 2 views
0

У меня есть список ADUsers, но foreach ADUSER Я хочу получить его свойство «LastPasswordSet», которое доступно только (не уверен, есть ли другой способ) через UserPrincipal.Получение UserPrincipal из ADUser

Если я использовать этот код,

PrincipalContext l_objContext = new PrincipalContext(ContextType.Domain, l_strDomain, l_strUserOU); 

foreach (ADUser ADuser in Users) 
      { 
       UserPrincipal usr = UserPrincipal.FindByIdentity(l_objContext, ADuser.CommonName.ToString()); 

       if (usr.LastPasswordSet.HasValue) 
       { 
        EmailString(usr.LastPasswordSet.ToString()); 
       } 
      } 

Теперь я не хочу, чтобы обеспечить любую вещь, чтобы потом UserPrincipal другой Любой из имущества ADUser, и приведенный выше код не работает, либо, проблема заключается в том, что его отправьте несколько писем, а затем натолкнетесь где-нибудь, где они появляются, и ошибка и сервис прекратятся, что, вероятно, из-за некоторой неопределенной даты (я не хочу исправлять ее, просто заявил, что вы получите представление о том, что я делаю)

+0

похоже, что ваш вопрос похож на этот - http://stackoverflow.com/questions/2905277/setting-the-lastpasswordset-date-for-a-user-in-active-directory –

+0

Я уже проверил этот вопрос , но там они меняют свою ценность с помощью UserPrincipal в любом случае, и если вы снова прочитаете мой вопрос, в нем говорится, как я могу получить userPrincipal с помощью свойств ADUser .... –

ответ

2

может создать свой собственный PrincipalContext, а затем использовать UserPrincipal.FindByIdentity, чтобы получить основную сумму. Отсюда, как я подозреваю, вы уже знаете, вы можете позвонить в LastPasswordSet.

public static DateTime? GetLastPasswordSet(string domain, string userName) 
{ 
    using (var context = new PrincipalContext(ContextType.Domain, domain)) 
    { 
     var userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userName); 
     return userPrincipal.LastPasswordSet; 
    } 
} 

Примечание: вам нужно будет добавить ссылку на System.DirectoryServices.AccountManagement

[EDIT: в ответ на дополнительный вопрос в комментарии]

Чтобы проверить, если пароль был последний набор в течение месяца назад - примерно так:

if (lastPasswordSet < DateTime.Now.AddMonths(-1)) 
{ 
    // Password last set over a month ago. 
} 

Одна вещь иметь в виду, что месяц является неоднозначной длиной времени - его длина зависит от того, в каком месяце (и году) вы находитесь. В зависимости от того, что вы пытаетесь сделать, может быть более подходящим иметь фиксированный период, такой как 28 дней.

+0

как я могу сравнить это свойство с текущей датой и посмотреть, затем месяц с сегодняшнего дня –

Смежные вопросы