用于过滤登录/注销时间的Powershell代码(id 7001、42)

问题描述 投票:0回答:1

我正在尝试在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 

提前谢谢您

powershell authentication time tracking logout
1个回答
0
投票

如果我照原样使用您的脚本,则会得到数天的结果...

但是假设它确实返回了一天的事件,您可以使用以下命令获得第一个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
© www.soinside.com 2019 - 2024. All rights reserved.