PowerShell Active Directory lastLogon / lastLogonTimestamp-空的lastLogon,其中填充了lastLogonTimestamps

时间:2019-09-06 15:20:57

标签: powershell active-directory

我了解到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
}

0 个答案:

没有答案