在Active Directory中的计算机上获取上次登录时间

如何从活动目录中获取用户列表?

请参阅上面的页面。 它回答了我的大多数问题,但是当我尝试获取计算机的上次登录时间时,我遇到了问题。 很抱歉,如果有一些方法可以对该页面发表评论而不是提出一个全新的问题,因为我没有找到这样的选项。

using (var context = new PrincipalContext(ContextType.Domain, "cat.pcsb.org")) { using (var searcher = new PrincipalSearcher(new ComputerPrincipal(context))) { foreach (var result in searcher.FindAll()) { DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry; Console.WriteLine("Name: " + de.Properties["name"].Value); Console.WriteLine("Last Logon Time: " + de.Properties["lastLogon"].Value); Console.WriteLine(); } } } Console.ReadLine(); 

我用ComputerPrincipal替换了UserPrincipal。 名称和一些其他属性工作正常,但登录没有。 我尝试过做不同的事情,比如将它投射到DateTime(演员表失败),但没有任何效果。 上面的结果只是System .__ ComObject。 那么我该怎么做才能让它正确地获得上次登录时间?

你为什么不只是使用ComputerPrincipal返回的LastLogon属性 ? (ComputerPrincipal是一个AuthenicatablePrincipal)

 using (var context = new PrincipalContext(ContextType.Domain, "cat.pcsb.org")) { using (var searcher = new PrincipalSearcher(new ComputerPrincipal(context))) { foreach (var result in searcher.FindAll()) { var auth = result as AuthenticablePrincipal; if(auth != null) { Console.WriteLine("Name: " + auth.Name); Console.WriteLine("Last Logon Time: " + auth.LastLogon); Console.WriteLine(); } } } } Console.ReadLine(); 

请注意,LastLogon不是复制属性,因此如果您有多个域控制器,则需要查询每个控制器并找出谁给出了最新结果。

您需要遍历所有域控制器并找到最新的登录时间。

以下代码查找用户的上次登录时间。

 public DateTime findlastlogon(string userName) { DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, "domainName"); DateTime latestLogon = DateTime.MinValue; DomainControllerCollection dcc = DomainController.FindAll(context); Parallel.ForEach(dcc.Cast(), dc1 => { DirectorySearcher ds; DomainController dc = (DomainController)dc1; using (ds = dc.GetDirectorySearcher()) { try { ds.Filter = String.Format( "(sAMAccountName={0})", userName ); ds.PropertiesToLoad.Add("lastLogon"); ds.SizeLimit = 1; SearchResult sr = ds.FindOne(); if (sr != null) { DateTime lastLogon = DateTime.MinValue; if (sr.Properties.Contains("lastLogon")) { lastLogon = DateTime.FromFileTime( (long)sr.Properties["lastLogon"][0] ); } if (DateTime.Compare(lastLogon, latestLogon) > 0) { latestLogon = lastLogon; //servername = dc1.Name; } } } catch (Exception) { } } }); return latestLogon; } 

要获取计算机的上次登录时间,请将sAMAccountName替换为Name。

ds.Filter = String.Format(“(Name = {0})”,userName);