用于检查 Active Directory 用户是不是上次登录的 Powershell 脚本

Posted

技术标签:

【中文标题】用于检查 Active Directory 用户是不是上次登录的 Powershell 脚本【英文标题】:Powershell Script to check if Active Directory User Last Logon用于检查 Active Directory 用户是否上次登录的 Powershell 脚本 【发布时间】:2018-09-24 15:15:03 【问题描述】:

我正在尝试编写一个接受用户名作为参数的 powershell 脚本,并显示用户的上次登录时间。如果用户之前没有登录过,应该会显示消息has not logged in before

例如,如果您运行.\lastlogon -username marywong,则会显示消息:

marywong 上次登录时间 13/07/2017

如果你运行.\lastlogon -username guest,我会收到消息:

客人之前没有登录过

下面是我的代码,但是当用户之前没有登录时,它似乎没有循环到 else 循环中。

param (
    [string]$username
)

$user = Get-ADUser -Filter sAMAccountName -eq $username | Get-ADObject -Properties lastLogon

$lastlogontime = $user.lastlogon

If ($user -ne $Null) 
    if($user.LastLogon -gt $time) 
        $displaylastlogon = [datetime]::FromFileTime($lastlogontime)
        Write-Host  $username " last logon time" $displaylastlogon 
    
    else 
        $displaylastlogon = [datetime]::FromFileTime($lastlogontime)
        Write-Host  $username " has not logged in before"
    

else 
    Write-Host  $username " does not exist"

【问题讨论】:

您是否检查过是否为之前未登录的用户返回了 $null? 【参考方案1】:

分别使用Get-ADUserGet-ADObject 可以获得信息。如果用户从未登录过,他们仍然是存在的用户。这与不存在的用户不同。

[CmdletBinding()]
Param (
    [Parameter(Mandatory = $true, Position = 0)]
    [string]$username
)

$user = Get-ADUser -Filter SamAccountName -eq $username
if ($user -ne $null) 
    $userlogon = $user | Get-ADObject -Properties lastLogon
    if ($userlogon.LastLogon -ne $null) 
        $lastlogontime = [DateTime]::FromFileTime($userlogon.LastLogon)
        Write-Host  $username " last logon time" $lastlogontime
     else 
        Write-Host  $username " has not logged in before"
    
 else 
    Write-Host  $username " does not exist"

【讨论】:

【参考方案2】:

当您使用 lastLogon 时,您会得到 AD 使用的格式... 那么当 if 运行时,你会得到

Could not compare "131820853335016078" to "09/24/2018 18:18:57". Error: "Cannot convert value "9/24/2018 6:18:57 PM" to type "System.Int64". Error: "Invalid cast from 'DateTime' to 'Int64'.""

所以它没有到达 else..

尝试使用 LastLogonDate 属性,它会帮助你更多。

尝试使用这个:

$user = Get-ADUser -Filter sAMAccountName -eq $username -Properties LastLogonDate

$lastlogontime = $user.lastlogonDate

编辑:

您的代码还有一些问题:

    您需要删除 displaylastlogon

    你不能用-gt,因为它总是假的。。用户以后不能登录了。。你需要用-lt

这是完整的脚本,正在运行:

$user = Get-ADUser -Filter sAMAccountName -eq $username -Properties LastLogonDate

$lastlogontime = $user.lastlogonDate

If ($user -ne $Null) 

if($lastlogontime -lt $time)
    
          Write-Host  $username " last logon time" $lastlogontime 
    

    else

    
          Write-Host  $username " has not logged in before"
    


else

    
      Write-Host  $username " does not exist"
    

另一个编辑:

我只是注意到它没有回答用户从不登录的情况,因为你会得到 $null 并且 $null 低于当前时间。所以你需要检查 lastlogontime 不为空

把 if 改成这样:

if($lastlogontime -ne $null -and $lastlogontime -lt $time)

【讨论】:

嗨,我试过了,但即使用户之前登录过,但它仍然循环到用户之前没有登录过,我检查过 lastlogontime 不为空。请指教。 嘿@Nyleve,你设置了 $time 参数了吗?我没有将它包含在我的脚本中,因为我在你的脚本中缝制了你已经包含了它。如果没有,在第二行中添加 $time = get-date 。让我知道它是否对您有帮助。

以上是关于用于检查 Active Directory 用户是不是上次登录的 Powershell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Active Directory - 检查用户名/密码

使用 Powershell 清理孤立的 Active Directory 用户配置文件文件夹

根据 Active Directory 策略检查密码 [重复]

在 Java 应用程序中检查使用 Active Directory 登录的用户

是否有用于选择 Active Directory 用户的通用对话框?

如果我更改我的 web 应用程序用于身份验证的 Active Directory 应用程序,注册用户会发生啥情况?