我了解到lastlogon是每个DC存储的,并且lastlogontimestamp已复制,但由于复制周期可能会缩短两个星期。
我有一个客户想要“实际的”上次登录,因此我开始编写脚本以轮询每个DC上的所有用户,以比较他们的“ lastlogon”值,进行排序并获取最新的值。 ...但是我发现有些困惑-我发现在所有DC中,有一个帐户没有DC进行身份验证的记录(lastlogon为0 /空值),但是该帐户显示的是lastlogontimestamp值... >
环境是具有一个子域的林根域。我最初只是使用:
@([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().DomainControllers.Name)
...但是假设他们的AD站点和服务可能会被盗用-这是我唯一想提供的可能原因,为什么没有DC显示报告的“ lastlogon”时间,而所有DC都显示“ lastlogontimestamp”值。因此,我开始查询:
@([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().GlobalCatalogs.Name)
...但是最终得到了相同的结果:某些帐户报告lastlogon的全零,但显示了lastlogontimestamp的实际时间戳!是什么?!
有人能为我消除这种疯狂吗?
$DCs = @([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().DomainControllers.Name)
$DCs = @([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().GlobalCatalogs.Name)
$LdapFilter = '(&(objectCategory=user)(objectClass=person))'
$Properties = 'distinguishedname','lastlogon','samaccountname','lastlogontimestamp'
$t = [System.Collections.ArrayList]::new()
foreach ($dc in $DCs) {
$s = [adsisearcher]"$LDAPFilter"
$s.PageSize = 9999
$s.SearchRoot = [adsi]"LDAP://$dc"
[void] $s.PropertiesToLoad.AddRange($Properties)
$r = @($s.FindAll())
if ($r.Count -gt 0) {
$r | ForEach-Object {
$temp = [pscustomobject]@{
'samaccountname' = $_.Properties['samaccountname'][0]
'server' = $dc
'lastlogon' = ([int64]$_.Properties['lastlogon'][0])
'lastlogontimestamp' = ([int64]$_.Properties['lastlogontimestamp'][0])
}
[void]$t.Add($temp)
}
}
}
foreach ($g in ($t | Group-Object -Property samaccountname)) {
$x = $g.Group | Sort-Object -Property lastlogon -Descending
$x
}