获取活动目录中计算机上的上次登录时间
本文关键字:登录 时间 计算机 活动 获取 | 更新日期: 2023-09-27 18:36:07
如何从活动目录中获取用户列表?
请参阅上面的页面。它回答了我的大部分问题,但是当我尝试获取计算机的上次登录时间时,我遇到了问题。抱歉,如果有某种方法可以在该页面上发表评论,而不是提出一个全新的问题,因为我没有找到这样的选项。
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。名称和其他一些属性工作正常,但登录不起作用。我尝试做不同的事情,例如将其转换为日期时间(强制转换失败),但没有任何效果。以上只是导致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<object>(), 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 替换为"名称"。
DS.筛选器 = 字符串格式( "(名称={0})", 用户名 );