在.net和powershell中,DC上的最后登录时间返回不同的值

本文关键字:登录 最后 时间 返回 net powershell DC | 更新日期: 2023-09-27 18:01:21

我正在编写一个小应用程序,它可以审计我们环境中每个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程序从所有DC实例返回相同的时间,并且它还返回一个在PS脚本中没有显示的时间!

现在我很困惑。我相信PS脚本是正确的,但后来我真的不知道我在。net版本中错过了什么。

我对程序进行了一些调试,但是找到的用户只包含程序显示的时间,甚至文件时间值与PS版本不同。我甚至想过日期-时间转换问题,但是结果的结构应该与不同的值相同,但它们不是。

提前感谢任何形式的帮助。

在.net和powershell中,DC上的最后登录时间返回不同的值

我找到答案了!: -)

我修改了c#代码以返回假定的上次登录数据的文件时间,并且还编写了详细的ps脚本来列出用户的每个变量,以便我可以找到c#返回的相关属性。

这是一个PS脚本:

Get-ADUser TestUser | Get-ADObject -Properties *

这一行返回AD中存储的关于给定用户的所有属性。其中有两个值是我关心的:

lastLogonlastLogonTimestamp

在此之后,我检查了c#返回的lastlogon属性的文件时间版本,结果证明,该值实际上与lastLogonTimestamp相同,并且没有(或我没有找到)方法来请求确切的lastlogon数据。

正确的解决方案是重新设计使用LDAP查询而不是API调用操作的代码。这里有一些帮助