首页 > 解决方案 > 登录时间脚本 | 如何覆盖上次登录Powershell

问题描述

我在我的 GPO 上配置了一个脚本,用于跟踪某个用户组的登录时间,这些用户组的登录时间已导出到 csv。

现在我得到了问题,让它只显示最后一次登录时间。

目前它只记录每个登录时间,但他们只想要最后一个。

有没有办法让它覆盖它?

假设 user1 登录了 3 次,我只想显示最后一个,以及该组中的每个用户。

我目前拥有的脚本是一个非常简单的脚本:

"logon {0} {1} {2:DD-MM-YYYY HH:mm:ss}" -f (Get-Date),$env:username, $env:computername >> \\server\folder\file.csv

如果有人能告诉我是否可能,将不胜感激!

标签: powershelldatetimeauthentication

解决方案


首先,您要在不是 CSV 文件的文本文件中附加一行,因为这些值不是由分隔符分隔的。然后,您还为 Format 运算符使用了错误的值顺序-f:虽然模板字符串清楚地将日期作为 中的最后一个占位符{2:DD-MM-YYYY HH:mm:ss},但您将其作为第一个值提供。

另请注意,日期格式区分大小写,因此您需要更改DD-MM-YYYY HH:mm:ssdd-MM-yyyy HH:mm:ss

我建议将您现在必须的脚本更改为:

[PsCustomObject]@{
    User      = $env:USERNAME
    Computer  = $env:COMPUTERNAME
    LogonDate = '{0:dd-MM-yyyy HH:mm:ss}' -f (Get-Date)
} | Export-Csv -Path '\\server\folder\UserLogon.csv' -NoTypeInformation -Append

然后,当归结为读取该文件并仅保留最新登录时,您可以这样做

$data = Import-Csv -Path '\\server\folder\UserLogon.csv' | Group-Object User | ForEach-Object {
    $_.Group | Sort-Object {[datetime]::ParseExact($_.LogonDate, 'dd-MM-yyyy HH:mm:ss', $null)} |
               Select-Object -Last 1
}

# output on screen
$data

# overwrite the CSV file to keep only the last logons
$data | Export-Csv -Path '\\server\folder\UserLogon.csv' -NoTypeInformation

推荐阅读