在.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版本不同。我甚至想过日期-时间转换问题,但是结果的结构应该与不同的值相同,但它们不是。
提前感谢任何形式的帮助。
我找到答案了!: -)
我修改了c#代码以返回假定的上次登录数据的文件时间,并且还编写了详细的ps脚本来列出用户的每个变量,以便我可以找到c#返回的相关属性。
这是一个PS脚本:
Get-ADUser TestUser | Get-ADObject -Properties *
这一行返回AD中存储的关于给定用户的所有属性。其中有两个值是我关心的:
lastLogon和lastLogonTimestamp
在此之后,我检查了c#返回的lastlogon属性的文件时间版本,结果证明,该值实际上与lastLogonTimestamp相同,并且没有(或我没有找到)方法来请求确切的lastlogon数据。正确的解决方案是重新设计使用LDAP查询而不是API调用操作的代码。这里有一些帮助