用于检查 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-ADUser
和Get-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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
使用 Powershell 清理孤立的 Active Directory 用户配置文件文件夹
根据 Active Directory 策略检查密码 [重复]
在 Java 应用程序中检查使用 Active Directory 登录的用户