如何在PowerShell中没有任何附加模块的情况下获取用户上次登录时间?

时间:2011-09-07 18:18:55

标签: powershell active-directory

我是否可以在不使用任何AD模块或其他管理单元的情况下获取登录到服务器的特定用户登录时间?

3 个答案:

答案 0 :(得分:1)

我建议的最好方法是使用内置的cmdlet解析事件日志

研究Get-EventLogGet-WinEvent

在本地计算机上,类似这样的内容会告诉您用户“TBIRD”成功登录的所有实例

Get-EventLog Security | 
   where {$_.EntryType -match 'Success' 
     -and $_.Message -match 'An account was successfully logged on.'} | 
   where {$_.Message -match 'TBIRD'}

我确信更清晰的可用属性解析会避免通过Message字段解析,这只是一个快速的&肮脏的例子,引导你朝着正确的方向

答案 1 :(得分:1)

您可以使用ADSI。它'内置于Framework .NET 2.0,因此没有snapin,没有模块。

获取lastLogon属性(已编辑或更好lastLoginTimestamp

$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://SRVA.dom.fr/dc=dom,dc=fr","administrateur@dom.fr","admin")

# Look for a user
$Rech = new-object System.DirectoryServices.DirectorySearcher($dn)
$Rech.filter = "((userPrincipalName=phocquet@dom.fr))"
$Rech.SearchScope = "subtree"
$Rech.PropertiesToLoad.Add("distinguishedName");
$Rech.PropertiesToLoad.Add("sAMAccountName");  
$Rech.PropertiesToLoad.Add("lastLogon");  

$liste = $Rech.FindOne()

(编辑)的 @Chritian是对的,你最好使用lastLoginTimestamp而不是lastLogin,因为lastLogin不会在Active Directory域控制器上复制,所以如果你有多个域控制器,用户可以对{{1}进行身份验证只会在当前的身份验证服务器上更新,而lastLogin将在所有域控制器上进行复制。有关详细信息,请参阅“The LastLogonTimeStamp Attribute” – “What it was designed for and how it works”。它解释了lastLoginTimestamp在每次登录时都没有更新,但它只有9-14 dat准确(可以参数化),它更多的是帮助识别不活动的计算机和用户帐户。

如果您正在寻找“实时”登录跟踪,则需要查询DC上的安全事件日志以获取所需的登录事件,即528 -Windows XP \ 2003及更早版本或4624 Windows Vista \ 2008。对近实时数据来说,最好的方法是使用事件日志收集服务将所有域控制器安全事件日志收集到集中式数据库

答案 2 :(得分:0)

如果您对超过15天的登录时间感兴趣,则只能依赖lastLogonTimeStamp。似乎可能有兴趣获得过去15天内的最后登录时间,在这种情况下,lastLogonTimestamp不会给您准确的结果。

通常,执行此操作的正确方法是在域中查询每个DC以获取lastLogon属性,然后比较所有这些值以找出用户的真实上次登录时间。无论上次登录是在15天之前还是之后,这是获得100%准确结果的唯一方法。

您可以编写脚本来从所有DC中获取这些值,然后比较它们以确定用户的真实上次登录,或者您可以使用 True Last Logon Reporting工具为您自动化流程。