【问题标题】:PowerShell Active Directory lastLogon/lastLogonTimestamp -- Empty lastLogon with populated lastLogonTimestampsPowerShell Active Directory lastLogon/lastLogonTimestamp -- 带有填充 lastLogonTimestamps 的空 lastLogon
【发布时间】:2021-10-28 03:18:43
【问题描述】:

我了解 lastlogon 是按 DC 存储的,并且 lastlogontimestamp 是复制的,但由于复制周期可能会延迟两周。

我有一个客户想要“实际”最后一次登录,所以我开始编写一个脚本来轮询每个 DC 上的所有用户,以比较他们的“最后一次登录”值、排序并获取最新的。 ...但我发现了一些令人困惑的事情——我发现在所有 DC 中都有帐户没有 DC 具有身份验证记录(lastlogon 为 0/null 值),但该帐户显示 lastlogontimestamp 值...

环境是具有一个子域的林根域。我最初只是使用:

@([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().DomainControllers.Name)

...但假设他们的 AD 站点和服务可能被抬高了——这是我唯一能想出的一个可能的原因,为什么没有 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=person)(objectClass=user))'
$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
}

【问题讨论】:

  • 抱歉格式化,在我提交这个的网络上,我无权访问 SO 上的格式化按钮。
  • 我不得不问这个愚蠢的问题。这些帐户登录后是否有任何域控制器停用?
  • 如您所知,一个属性被复制而一个属性没有被复制。然而,这并不是他们之间的唯一区别。我相信对于用户来说,LastLogon 是当一个帐户登录到加入域的工作站或服务器时。当有人访问文件共享或登录网络邮件时,它不会更新。那时 LastLogonTimeStamp 可能会更新。如果需要,请随时纠正我。这些用户是否有可能从未真正登录到加入域的计算机?
  • 是的,他们都应该对控制台会话执行交互式键盘身份验证,坐在直接连接到网络的加入域的机器前面。
  • 关于退役 DC 的问题——虽然有可能,但 lastlogontimestamps 值显示的是今天的日期...

标签: powershell active-directory


【解决方案1】:

您可以使用我的代码。只需根据您的需要使用或调整即可。

Import-Module ActiveDirectory

$properties = ("Name", "SamAccountName", "mail", "lastLogon", "manager", "company", "createTimeStamp", "department", "logonCount", "pwdLastSet", "userPrincipalName", "physicalDeliveryOfficeName", "employeeID", "accountExpires", "division", "msDS-ResultantPSO")
$users = @{}

foreach ($hostname in (Get-ADDomainController -Filter { IsReadOnly -eq $false } ).HostName) {
    foreach ($user in (Get-ADUser -Server $hostname -Filter 'enabled -eq $true' -properties $properties | Select-Object $properties)) {
        if ( $users.Item($user.SamAccountName)) {
            If ( $user.lastLogon -gt $users.Item($user.SamAccountName).lastLogon ) { $users.Item($user.SamAccountName).lastLogon = $user.lastLogon }
            $users.Item($user.SamAccountName).logonCount += $user.logonCount
        }
        else {
            $users.Add( $user.SamAccountName, $user )
        }
    }
}

$hostname = (Get-ADDomainController -Discover -NextClosestSite).HostName
foreach ( $user in $users.Values ) {
    if ( $user.lastLogon ) { $user.lastLogon = [DateTime]::FromFileTime($user.lastLogon) }
    if ( $user.pwdLastSet ) { $user.pwdLastSet = [DateTime]::FromFileTime($user.pwdLastSet) }
    if ( $user.accountExpires -eq "9223372036854775807" -or $user.accountExpires -eq "0" ) { $user.accountExpires = "never expires" }
    else {
        $user.accountExpires = [DateTime]::FromFileTime($user.accountExpires) 
    }
    if ( $user.manager ) { $user.manager = (Get-ADUser $user.manager -Server "$hostname" -properties Name ).Name }
}

$users.Values | Export-Csv -Path C:\ins\users.csv -NoTypeInformation -Encoding UTF8

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多