我正在尝试在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
提前谢谢你
你必须按你首先工作的日期进行过滤。
由于您可以使用参数捕获每个循环的输出,因此这是实现目标的一种方式:
$startDate = (get-date).AddDays(-1).GetDateTimeFormats()[0]
$FileName = "somepath.csv"
$log_time = get-WinEvent -FilterHashtable @{logname='system';id='7001', '42'}
$daily_events = foreach($event in $log_time)
{
if ($event.timecreated.GetDateTimeFormats()[0] -like "*$startDate*"){$event}
}
$daily_events | Select Id, MachineName, Message, TimeCreated | export-csv -Path $Filename
您可以添加以下内容以跟踪执行时的第一个和最后一个:
#The sort is by default from newer to older
$first_event = $daily_events[-1].TimeCreated #last element of the array
$last_event = $daily_events[0].TimeCreated #first element of the array
Write-Host "First event was $first_event in and the last event was in $last_event"
您可以使用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