• 首页
  • PowerShell
  • 如何使用 PowerShell 获取 AD 用户的最后登录信息

如何使用 PowerShell 获取 AD 用户的最后登录信息

检索 AD 用户的最后登录信息有助于管理员识别不活跃的用户帐户、跟踪用户登录历史并检测异常的用户登录模式。虽然管理员可以使用 PowerShell 来完成此操作,但 Active Directory 存储登录数据的方法存在独特的挑战,因为有多个属性:LastLogon、LastLogonDate 和 LastLogonTimestamp,每个属性都有其用途和限制。本文将探讨如何有效使用 PowerShell 获取 AD 最后登录信息,并介绍如何使用 AD last logon reportsADManager Plus 中轻松检索这些信息,AD reporting tool

获取 AD 用户最后登录:PowerShell 与 ADManager Plus 对比

下表比较了使用 PowerShell 和 ADManager Plus 查找 AD 用户最后登录值的方法。

Windows PowerShell

开始之前,请确保:

  • 已安装 Active Directory PowerShell 模块。
  • 已配置正确的 PowerShell 执行策略。
  • 您使用的帐户至少具有查询目标 AD 域的读取权限。

要使用 PowerShell 获取 AD 用户的最后登录信息,请以管理员身份打开 Windows PowerShell 并执行以下脚本:

Get-ADUser -Filter * -Properties LastLogonTimestamp

要使用 lastLogon 属性获取 AD 用户的最后登录信息,请使用以下脚本:

Get-ADUser -Identity "John" -Properties LastLogon | Select-Object Name, lastLogon

要使用 lastLogon 属性获取 AD 用户的最后登录信息,请使用以下脚本:

Get-ADUser -Identity "John" -Properties LastLogonDate | Select-Object Name, lastLogonDate
ADManager Plus

使用 ADManager Plus 查找 AD 用户最后登录值的方法:

  1. 登录 ADManager Plus。
  2. 导航至 Reports > User Reports > Logon Reports > Real Last Logon
  3. 选择所需的域、用户或 OU,然后点击 Generate.

示例与用例

以下是一些变体和实际用例:

示例 1:使用 PowerShell 获取特定用户的 LastLogonTimeStamp

要获取单个用户的最后登录时间,需要在 PowerShell 中查询 LastLogonTimeStamp 属性,并将其从原始 FileTime 格式转换为可读日期。

Get-ADUser -Identity "John" -Properties LastLogonTimeStamp | Select-Object Name, @{Name='LastLogon';Expression={[datetime]::FromFileTime($_.LastLogonTimeStamp)}}

示例 2:基于 LastLogonTimeStamp 值在 PowerShell 中查找所有不活跃用户

此脚本查找过去 90 天内未登录的所有用户:

$inactiveDays = 90
$cutoffDate = (Get-Date).AddDays(-$inactiveDays)
# Convert the cutoff date to FileTime format for the AD filter
$cutoffFileTime = $cutoffDate.ToFileTime()
Get-ADUser -Filter "LastLogonTimeStamp -lt '$cutoffFileTime'" -Properties LastLogonTimeStamp, EmailAddress | Select-Object Name, SamAccountName, EmailAddress, @{Name='LastLogon';Expression={[datetime]::FromFileTime($_.LastLogonTimeStamp)}}

示例 3:通过查询所有域控制器 (DC) 查找真实的最后登录时间

由于 LastLogon 属性不进行复制,获取绝对最新登录时间的唯一方法是查询每个 DC 并找到最新值。此脚本较为高级,但提供最高准确性。

$userName = "jdoe"
$latestLogon = $null
$logonDC = ""

$domainControllers = Get-ADDomainController -Filter *
foreach ($dc in $domainControllers) {
$user = Get-ADUser -Identity $userName -Server $dc.HostName -Properties LastLogon
if ($user.LastLogon -gt 0) {
$currentLogon = [datetime]::FromFileTime($user.LastLogon)
if ($currentLogon -gt $latestLogon) {
$latestLogon = $currentLogon
$logonDC = $dc.HostName
}
}
}

Write-Host "User: $userName"
Write-Host "Most recent logon: $latestLogon on DC: $logonDC"

使用 PowerShell 获取用户最后登录信息的限制

虽然可以使用 PowerShell 获取用户的最后登录详情,但存在多个限制。

  • 信息不准确: 理解 LastLogon、LastLogonTimeStamp 和 LastLogonDate 属性之间的差异至关重要,但通常令人困惑。
  • 复杂性: 编写脚本查询所有 DC、处理日期转换和正确格式化数据既耗时又容易出错。
  • 安全风险: 直接对 DC 运行脚本需要提升权限,将此任务委派给初级管理员或帮助台人员可能带来重大安全风险。

使用 ADManager Plus 获取 AD 用户最后登录详情的优势

ADManager Plus 是一款全面的 AD reporting solution,帮助管理员克服 PowerShell 的限制,轻松生成 AD 用户报告。

  • 准确的最后登录报告:ADManager Plus 中的 Real Last Logon 报告查询所有 DC,呈现最准确的最后登录信息。
  • 预置 AD 报告: 即刻访问 200 多个报告,包括不活跃用户、最近登录用户和从未登录用户的报告,无需编写脚本。
  • 安全且细粒度的委派: 通过基于角色的访问控制,安全地将报告任务委派给帮助台技术人员、经理或人力资源人员,无需授予对 DC 的直接访问权限。

使用 ADManager Plus 获取 AD 用户的最后登录信息

常见问题解答

你可以使用 [datetime]::FromFileTime() 方法转换原始 FileTime 值。例如:

@{Name='LastLogon';Expression={[datetime]::FromFileTime($_.LastLogonTimeStamp)}}.

AD 本身不在用户对象上存储最后登录计算机信息。这是一个复杂的任务,需要编写脚本、在所有 DC 上拥有适当权限,并且在大型环境中可能较慢。要使用 PowerShell 查找此信息,必须查询所有 DC 的安全事件日志。

至少需要对 AD 中的用户对象具有读取权限才能获取用户的最后登录详情。查询多个 DC 时,确保你的账户能够认证到每个 DC。

Active Directory管理与报告的一站式解决方案
电子邮件下载链接 Email the ADManager Plus download link