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 中关于给定用户的信息。
其中有两个我关心的值:
lastLogon 和 lastLogonTimestamp
在此之后我检查了 lastlogon 属性 return 的文件时间版本,结果是,这个值实际上是与 lastLogonTimestamp 相同,没有(或者我没有找到)请求确切 lastlogon 数据的方法。
正确的解决方案是重新设计使用 LDAP 查询而不是 API 调用操作的代码。
几乎找不到帮助 here
我正在编写一个小应用程序,可以审计我们环境中每个 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 中关于给定用户的信息。 其中有两个我关心的值:
lastLogon 和 lastLogonTimestamp
在此之后我检查了 lastlogon 属性 return 的文件时间版本,结果是,这个值实际上是与 lastLogonTimestamp 相同,没有(或者我没有找到)请求确切 lastlogon 数据的方法。
正确的解决方案是重新设计使用 LDAP 查询而不是 API 调用操作的代码。 几乎找不到帮助 here