从Active Directory中提取LastLogon并使用C#将其设置为lastlog.txt文本框

时间:2014-10-24 21:01:59

标签: c# winforms active-directory ldap directoryservices

我有一个名为user extract的应用程序,因为名称建议应用程序的目标是通过从列表框中选择用户来提取关于用户的每一个可能的信息,samsaccount名称被选中并作为值进入txtusersearcher.text文本框,我正在做一个SearchUserName.PerformClick();我有一个为每个属性创建的文本框,并且该属性的值设置为等于文本框。

我尝试过的事情

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,我希望在单击每个用户时更改此值。我知道主要原因是lastlogon值存储为integer8,其他值是字符串。当你使用value.tostring();它没有工作,我得到System.__ComObject错误。人们建议使用演员,但我是这项技术的新手,我会非常感谢一个示例演员代码,并且非常感谢这个问题的解决方法谢谢你们!!!!!!!!!!!!

3 个答案:

答案 0 :(得分:1)

要将lastLogon值作为可读日期时间属性获取,首先需要将其从“ComObject”转换为long类型,然后将此long值转换为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

答案 1 :(得分: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";
    }
}

希望它有所帮助!

答案 2 :(得分:0)

如果从DirectoryEntry读取,例如“rs.GetDirectoryEntry()。Properties [”lastLogon“]。Value”,LastLogon属性是一个可以强制转换为IADsLargeInteger的COM对象。

但如果直接从SearchResult阅读,例如“rs.Properties [”lastLogon“] [0]”,LastLogon属性是Integer8。假设“lastLogon”被添加到DirectorySearcher中的PropertiesToLoad。

但请注意,LastLogon仅记录DC上的最后登录时间,并且不会复制。 即用户使用DC2登录时,DC1上的LastLogon值不会更新。