我正在编写一个小应用程序,它可以审计我们环境中每个 DC 上用户的最后登录时间。在一些帮助下,我能够创建一个代码来迭代所有 DC 并查询用户的最后登录时间。正如我在此值未在 DC 之间同步之前读到的那样,这是 MS 设计的。这是我用来检查每个 DC 上的用户的代码:
foreach (string DCInstance in DC_Collection)
{
try
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain,DCInstance))
{
using (UserPrincipal userPrincipal = new UserPrincipal(context))
{
userPrincipal.Name = "TestUserName";
using (PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal))
{
using (PrincipalSearchResult<Principal> results = searcher.FindAll())
{
foreach (UserPrincipal FoundUser in results)
{
Console.WriteLine(FoundUser.SamAccountName + "," + FoundUser.LastLogon + "," + DCInstance);
}
}
}
}
}
}
catch (PrincipalServerDownException PSDE)
{
MessageBox.Show(PSDE.Message + ": " + DCInstance);
}
}
我知道许多括号是不必要的,但这样对我来说更具可读性。
这是程序的核心。但是我认识到,在每个 DC 实例上找到的用户的最后登录时间都是相同的,这不太可能。为了确定这个问题,我做了一个小 PS 脚本来做同样的事情,所以我可以比较结果。这是PS脚本:
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName -Server $hostname | Get-ADObject -Properties lastLogon
}
同样,这只是使实际工作的脚本的核心。
然而结果却完全不同。PS 脚本的结果与我预期的一样,几乎在每个 DC 上都有很大不同(并非所有 DC 都与其他 DC 不同,但大多数都不同)。然而,.Net 程序从所有 DC 实例返回相同的时间,此外它返回的时间不会显示在 PS 脚本中!
现在我很困惑。我相信 PS 脚本是正确的,但是我真的不知道我在 .Net 版本中错过了什么。
我对程序做了一些调试,但找到的用户只包含程序显示的时间,甚至与 PS 版本不同的文件时间值。我什至考虑过日期时间转换问题,但是结果的结构应该与不同的值相同,但事实并非如此。
提前谢谢任何形式的帮助。