DC 上的上次登录时间 return .Net 和 powershell 中的不同值

Lastlogon time on DC return different value in .Net and powershell

我正在编写一个小应用程序,可以审计我们环境中每个 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 都大不相同(不是所有的都与其他的不同,但大多数都不同)。然而,.Net 程序 returns 来自所有 DC 实例的同一时间,此外它 returns 不显示在 PS 脚本中的时间!

现在我很困惑。我相信 PS 脚本是正确的,但我真的不知道我在 .Net 版本中遗漏了什么。

我对程序做了一些调试,但找到的用户只包含程序显示的时间,甚至文件时间值与PS版本不同。 我什至考虑过日期时间转换问题,但结果的结构应该与不同的值相同,但事实并非如此。

提前感谢任何帮助。

我找到答案了! :-)

我将 C# 代码修改为 return 假定上次登录数据的文件时间,还做了一个详细的 ps 脚本来列出用户的每个变量,这样我就可以找到相关的 属性 return由 c# 编写。

这是一个 PS 脚本:

Get-ADUser TestUser | Get-ADObject -Properties *

此行 return 每隔 属性 存储在 AD 中关于给定用户的信息。 其中有两个我关心的值:

lastLogonlastLogonTimestamp

在此之后我检查了 lastlogon 属性 return 的文件时间版本,结果是,这个值实际上是与 lastLogonTimestamp 相同,没有(或者我没有找到)请求确切 lastlogon 数据的方法。

正确的解决方案是重新设计使用 LDAP 查询而不是 API 调用操作的代码。 几乎找不到帮助 here