登录时间脚本|如何覆盖上次登录Powershell

登录时间脚本|如何覆盖上次登录Powershell,powershell,datetime,authentication,Powershell,Datetime,Authentication,我在GPO上配置了一个脚本,用于跟踪某个用户组的登录时间,并将其导出到csv 现在我得到了一个问题,让它只显示上次登录的时间 目前,它只写下每一次登录时间,但他们只希望最后一次 有没有办法让它覆盖它呢 假设user1登录了3次,我只想显示最后一次,这对于这个组中的每个用户都是如此 我目前的剧本非常简单: "logon {0} {1} {2:DD-MM-YYYY HH:mm:ss}" -f (Get-Date),$env:username, $env:computername

我在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

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

我必须重申其他人对这不是解决此问题的最佳方法的评论,但是,考虑到您拥有的输出文件,您可以这样处理它以获得给定用户的最后一条记录:

$last = @{} ; Get-Content \\server\folder\file.csv |% { $token = $_ -split ' ' ; $last.$($token[3]) = $_ }
$last
它创建一个以用户名为键的散列,并使用文件中的最后一行对其进行更新。您还可以访问
$last.foo
以获取用户
foo
的最后一个条目

我还要注意的是,您的CSV不是CSV,这使得它更难处理。您最好使用
导出CSV
,或者至少加上逗号。此外,虽然仍然不是最佳方法,但您可以为每个用户创建一个文件,您可以在他们每次登录时覆盖该文件,因此:

new-object  PSObject -Property @{ 'date'= (Get-Date); 'username'= $env:username; 'Computer' = $env:computername } | Export-CSV -Path "\\server\folder\$($env:username).csv" -NoTypeInformation
您可以通过以下操作导入所有要处理的内容:

gci \\server\folder\*.csv  |% { import-csv $_ }

我必须重申其他人对这不是解决此问题的最佳方法的评论,但是,考虑到您拥有的输出文件,您可以这样处理它以获得给定用户的最后一条记录:

$last = @{} ; Get-Content \\server\folder\file.csv |% { $token = $_ -split ' ' ; $last.$($token[3]) = $_ }
$last
它创建一个以用户名为键的散列,并使用文件中的最后一行对其进行更新。您还可以访问
$last.foo
以获取用户
foo
的最后一个条目

我还要注意的是,您的CSV不是CSV,这使得它更难处理。您最好使用
导出CSV
,或者至少加上逗号。此外,虽然仍然不是最佳方法,但您可以为每个用户创建一个文件,您可以在他们每次登录时覆盖该文件,因此:

new-object  PSObject -Property @{ 'date'= (Get-Date); 'username'= $env:username; 'Computer' = $env:computername } | Export-CSV -Path "\\server\folder\$($env:username).csv" -NoTypeInformation
您可以通过以下操作导入所有要处理的内容:

gci \\server\folder\*.csv  |% { import-csv $_ }

我认为一个箭头应该是覆盖一个文件

还有一个名为
Out File
的命令,其中包含覆盖文件的参数

有关PowerShell文档的更多信息,

我认为一个箭头应该是覆盖一个文件

还有一个名为
Out File
的命令,其中包含覆盖文件的参数

有关PowerShell文档的更多信息,

首先,您要在不是CSV文件的文本文件中添加一行,因为值之间没有分隔符。 然后,您还为
-f
格式运算符使用了错误的值顺序:虽然模板字符串在
{2:DD-MM-YYYY HH:MM:ss}
中明确地将日期作为最后一个占位符,但您将其作为第一个值馈送

还请注意,日期格式区分大小写,因此需要将
DD-MM-yyyyy HH:MM:ss
更改为
DD-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

首先,您要在不是CSV文件的文本文件中添加一行,因为值之间没有分隔符。 然后,您还为
-f
格式运算符使用了错误的值顺序:虽然模板字符串在
{2:DD-MM-YYYY HH:MM:ss}
中明确地将日期作为最后一个占位符,但您将其作为第一个值馈送

还请注意,日期格式区分大小写,因此需要将
DD-MM-yyyyy HH:MM:ss
更改为
DD-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

这不是一个好主意,如果有很多记录,所有这些问题都会出现,数据库就是为这些问题而发明的,在一个文件中向多个用户写入数据本身就不好。我建议使用任何数据库来实现这些目的,比如SQLLite、MSSQL Express或任何其他。没有那么多记录,这是关于扫描仪用户的。我想大概只有10-15个。这就是为什么很容易看到扫描器的最后一次登录,并使其覆盖自身,而不是添加每个登录。这不是一个好主意,如果有很多记录,所有这些问题都会出现,而数据库是为这些问题而发明的,在一个文件中写入多个用户本身就不好。我建议使用任何数据库来实现这些目的,比如SQLLite、MSSQL Express或任何其他。没有那么多记录,这是关于扫描仪用户的。我想大概只有10-15个。这就是为什么很容易看到扫描器的最后一次登录,并使其覆盖自身,而不是添加每个登录。非常感谢!我仍然是一个有点像超级地狱的傻瓜,必须要学很多东西。希望我能及时赶到那里。再次感谢!非常感谢!我仍然是一个有点像超级地狱的傻瓜,必须要学很多东西。希望我能及时赶到那里。再次感谢!