我正在尝试在Powershell中创建代码,该代码将使用ID代码7001(登录)和42(计算机进入睡眠状态)来跟踪用户的登录/注销时间,然后将其导出为csv。
我当前的问题是,有时用户会全天登录/注销,但是我只想最早登录和最新注销,这样我就可以跟踪总时间。
我当前的代码有效,但是它获得了当天的所有登录/注销事件,如下所示:
$startDate = (get-date).AddDays(-1)
$FileName = "Y:\Powershell_ " + $startDate.ToString('MMddyy') + ".csv"
$log_time = get-WinEvent -FilterHashtable @{logname='system';id='7001', '42'}
$log_time| Select Id, MachineName, Message, TimeCreated | export-csv $FileName
提前谢谢您
如果我照原样使用您的脚本,则会得到数天的结果...
但是假设它确实返回了一天的事件,您可以使用以下命令获得第一个7001事件和最后一个42事件:
$Results =[System.Collections.Generic.List[PSObject]]::new()
$log_time = get-WinEvent -FilterHashtable @{logname='system';id='7001', '7000'}
$FirstLogin = $log_time.Where({$_.id -eq 7001},'first') | Select -First 1
$LastLogout = $log_time.Where({$_.id -eq 42},'last') | Select -First 1
$Results.Add($FirstLogin)
$Results.Add($LastLogout)
$Results | Select Id, MachineName, Message, TimeCreated | export-csv -Path $Filename
代替Get-WinEvent
,它将不考虑日期返回所有对应的事件,而可以使用Get-Eventlog
来确保仅检索当天的事件。
$Results =[System.Collections.Generic.List[PSObject]]::new()
$Date = (get-date).Date
$FirstLogin = Get-EventLog -LogName System -InstanceId 7001 -After $Date -Before $Date.AddDays(1) | Select -Last 1
$LastLogout = Get-EventLog -LogName System -InstanceId 42 -After $Date -Before $Date.AddDays() -Newest 1
$Results.Add($FirstLogin)
$Results.Add($LastLogout)
$Results | Select Id, MachineName, Message, TimeCreated | export-csv -Path $Filename