2014-10-24 5 views
0

У меня есть приложение с именем user extract, так как название предполагает, что цель приложения - извлечь каждую возможную информацию о пользователе, просто выбрав пользователь из окна списка, имя samsaccount будет выбрано и передано как значение в текстовое поле txtusersearcher.text, и я делаю SearchUserName.PerformClick();. У меня есть текстовое поле, созданное для каждого свойства, и значение свойства устанавливается равным текстовое окно.извлечь LastLogon из Active Directory и установить его равным текстовому полю lastlog.txt с помощью C#

Вещи, которые я попробовал

1)

private void GetUserInformation(string username, string passowrd, string domain) 
    { 
     Cursor.Current = Cursors.WaitCursor; 
     SearchResult rs = null; 
     if (txtSearchUser.Text.Trim().IndexOf("@") > 0) 
      rs = SearchUserByEmail(GetDirectorySearcher(username, passowrd, domain), txtSearchUser.Text.Trim()); 
     else 
      rs = SearchUserByUserName(GetDirectorySearcher(username, passowrd, domain), txtSearchUser.Text.Trim()); 

     if (rs != null) 
     { 
      showuserinfo(); 
      ShowUserInformation(rs); 
     } 
     else 
     { 
      MessageBox.Show("User not found!!!", "Search Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
    } 

private void ShowUserInformation(SearchResult rs) {if (rs.GetDirectoryEntry().Properties["lastLogon"].Value != null) lastlog.Text = rs.GetDirectoryEntry().Properties["lastLogon"].Value.ToString();

2)

if (rs.GetDirectoryEntry().Properties["lastLogon"].Value != null) 
      lastlog.Text = (rs.GetDirectoryEntry().Properties["lastLogon"].Value.ToString()); 
      int x; 
       x = Int32.Parse(lastlog.Text); 
       lastlog.Text = x.ToString(); 

3) Я читал в Интернете, что использование основного контекста, UserPrincipal и главный искатель делает трюк и попробовал это

PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
     UserPrincipal qbeuser = new UserPrincipal(ctx); 
     PrincipalSearcher srch = new PrincipalSearcher(qbeuser); 
     foreach (var found in srch.FindAll()) 
     { 
      UserPrincipal founduser = found as UserPrincipal; 
      { 
       if (founduser.LastLogon != null) 
        lastlog.Text = founduser.LastLogon.ToString(); 

      } 
     } 

Это работает, но это приводит к последнему логову первого пользователя в списке, я хочу, чтобы это значение менялось при каждом щелчке каждого пользователя. Я знаю, что основная причина заключается в том, что значение lastlogon сохраняется как целое число 8, где остальные строки. когда вы используете value.tostring(); он не работает, и я получаю ошибку System.__ComObject. Люди предложили использовать бросок, но я новичок в этой технологии, образец кода литья был бы очень оценен, и обходной путь к этой проблеме будет очень ценен. Спасибо, ребята !!!!!!!!!!!

+0

@DJKRAZE если ваш интересно эти вопросы на самом деле то же самое, что и тот, о котором я спрашивал раньше, я думал, что проблема была исправлена. Я не знал, что если бы только возвращал последнее время для первого пользователя в списке, для любого пользователя, который был выбран, текстовое поле имело тот же самый значение, поэтому любые предложения о том, как я могу изменить текст в текстовом поле lastlog для каждого пользователя. –

ответ

0

Кажется, что вы можете получить информацию из AD при нажатии на имя пользователя. Я предлагаю последний метод, но ищу конкретный пользователь с именем пользователя.

private void UpdateLastLogonField(string userName) 
{ 
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
    UserPrincipal qbeuser = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, userName); 
    if (qbeuser != null && qbeuser.lastlogon != null) 
    { 
     lastlog.Text = qbeuser.LastLogon.ToString(); 
    } else { 
     lastLog.Text = "Could not get last logon info"; 
    } 
} 

Надеюсь, это поможет!

0

Если вы читаете из DirectoryEntry, например. "rs.GetDirectoryEntry(). Свойства [" lastLogon "]. Значение", атрибут LastLogon - это COM-объект, который может быть передан в IADsLargeInteger.

Но если вы читаете непосредственно из SearchResult, например. "rs.Properties [" lastLogon "] [0]", атрибут LastLogon - это Integer8. Это предполагает, что «lastLogon» добавляется в PropertyToLoad в DirectorySearcher.

Но обратите внимание, что LastLogon записывает только последнее время входа в систему DC и не реплицируется. При входе пользователя в систему с использованием DC2 значение LastLogon на DC1 не обновляется.

0

Чтобы получить значение lastLogon как читаемый время даты атрибута необходимо преобразовать его из «ComObject» для длинного типа, во-первых, а затем преобразовать это длинное значение DateTime:

DirectoryEntry de = New DirectoryEntry(ldap, logon, password) // get user as DirectoryEntry object 
object adsLargeInteger = de.Properties["lastLogon"].Value; 
if (adsLargeInteger == null) 
{ 
    // todo 
} 
long highPart = 
      (Int32) 
       adsLargeInteger.GetType() 
        .InvokeMember("HighPart", BindingFlags.GetProperty, null, adsLargeInteger, null); 
long lowPart = 
      (Int32) 
       adsLargeInteger.GetType() 
        .InvokeMember("LowPart", BindingFlags.GetProperty, null, adsLargeInteger, null); 
long lastLogonL = (long)((uint)lowPart + (((long)highPart) << 32)); // Get value as long 
DateTime lastLogonStr = DateTime.FromFileTime(lastLogonL); // get value as DateTime string