2015-05-19 3 views
0

Я хотел бы запросить некоторый атрибут пользователя в нашем AD, но на конкретном DC, на C#. У нас есть несколько десятков контроллеров домена, и я подозреваю, что между ними существует проблема с репликацией. Я хотел бы очистить неиспользуемые учетные записи, к которым я хотел бы использовать последний атрибут времени входа в систему, и я хотел бы запросить это на всех контроллерах домена один за другим (я знаю, что это немного похоже на грубое форсирование, однако я не собираюсь делать это слишком часто), поэтому я могу узнать, обновляется ли последнее значение или нет. я имел код для запроса всех контроллеров домена:Запросить данные пользователя из определенного AD DC

  Domain TestDomain = Domain.GetCurrentDomain(); 
      Console.WriteLine("Number of found DCs in the domain {0}", TestDomain.DomainControllers.Count); 
      foreach (DomainController dc in TestDomain.DomainControllers) 
      { 
       Console.WriteLine("Name: " + dc.Name); 
       ///DO STUFF 
      } 

И я также нашел помощь, чтобы построить код, который может запросить пользователь из AD:

PrincipalContext context = new PrincipalContext(ContextType.Domain, "test.domain.com"); 
      string userName = "testusername"; 
      UserPrincipal user = UserPrincipal.FindByIdentity(context, userName); 
      Console.WriteLine(user.LastLogon.Value.ToString());     
      Console.ReadKey(); 

И здесь я застрял. Теперь я хотел бы получить последнюю временную отметку входа пользователя из всех контроллеров домена. В прошлом я уже удалил случайную учетную запись, которая долгое время не использовалась (проверьте только один DC), чем оказалось, что пользователь использует ее каждый день, поэтому информация из DC не была синхронизирована. Я знаю, что наиболее разумным действием было бы проанализировать причину этого неправильного явления синхронизации, однако в моем текущем статусе, который займет возраст и, возможно, закончится без каких-либо находок ... Заранее благодарим за конструктивный ответ/комментарий!

ответ

0

EDIT: После повторного чтения вашего вопроса я понял, в чем проблема на самом деле. Вы считаете, что у вас проблема с репликацией, потому что атрибут Last Logon пользователя не совпадает со всеми контроллерами домена? Это по дизайну! Этот атрибут является специфичным контроллером домена и НЕ РЕЛИКЛИРОВАН. Чтобы проверить истинное время последнего входа пользователя, вы всегда должны запрашивать каждый контроллер домена, чтобы найти последнее время!

Вы почти там, попробуйте следующее:

public static List<UserPrincipal> GetInactiveUsers(TimeSpan inactivityTime) 
{ 
    List<UserPrincipal> users = new List<UserPrincipal>(); 

    using (Domain domain = Domain.GetCurrentDomain()) 
    { 
     foreach (DomainController domainController in domain.DomainControllers) 
     { 
      using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domainController.Name)) 
      using (UserPrincipal userPrincipal = new UserPrincipal(context)) 
      using (PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal)) 
      using (PrincipalSearchResult<Principal> results = searcher.FindAll()) 
      { 
       users.AddRange(results.OfType<UserPrincipal>().Where(u => u.LastLogon.HasValue)); 
      } 
     } 
    } 

    return users.Where(u1 => !users.Any(u2 => u2.UserPrincipalName == u1.UserPrincipalName && u2.LastLogon > u1.LastLogon)) 
     .Where(u => (DateTime.Now - u.LastLogon) >= inactivityTime).ToList(); 
} 

Он не будет показывать людям, которые никогда не вошли в систему, хотя. Если вам это нужно, вы, вероятно, сможете это выяснить.

+0

Спасибо, что работает для меня! Надеюсь, я смогу реализовать остальные ;-) Еще раз спасибо, что помогли мне! – SecThor

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

  • Нет связанных вопросов^_^