【问题标题】:Trying to count the time passed between a start and stop events in PowerShell尝试计算PowerShell中开始和停止事件之间经过的时间
【发布时间】:2020-05-27 18:03:32
【问题描述】:

我正在尝试在以下输出中获取每个启动和停止操作之间的时间差:

User    Computer   Time                Event      Action
----    --------   ----                -----      ------
TEST\me TEST-DC-01 27/05/2020 14:45:06 Logoff     Stop
TEST\me TEST-DC-01 27/05/2020 14:44:56 Unlock     Start
TEST\me TEST-DC-01 27/05/2020 14:44:49 Lock       Stop
TEST\me TEST-DC-01 27/05/2020 14:44:40 Reconnect  Start
TEST\me TEST-DC-01 27/05/2020 14:43:17 Disconnect Stop
TEST\me TEST-DC-01 27/05/2020 14:43:07 Logon      Start

我一直在使用 New-Timespan cmdlet,但在尝试将其与上述输出所源自的脚本(如下)集成时似乎在绕圈子。

理想情况下,我希望看到以下附加内容:

Total active time: 00:00:29

任何人都可以就最佳方法提出建议(通过与现有脚本完全集成或导入 CSV 格式的输出)。

非常感谢任何指导。

#
# GROUP POLICY (TO ENABLE 480x AND 477x EVENTS):
# 
#   COMPUTER CONFIGURATION
#   -  WINDOWS SETTINGS
#      -  SECURITY SETTINGS
#         -  ADVANCED AUDIT POLICY CONFIGURATION
#            -  SYSTEM AUDIT POLICIES - LOCAL GROUP POLICY OBJECT
#               -  LOGON/LOGOFF
#                  -  AUDIT OTHER LOGON/LOGOFF EVENTS
#                     -  SUCCESS
#
$OU = "OU=Domain Controllers,DC=test,DC=local"
   # WHERE TO SEARCH FOR COMPUTERS IN ACTIVE DIRECTORY
$days = "-1"
   # HOW MANY DAYS TO SEARCH BACK THROUGH
$directory = "C:\"
   # LOCATION OF FAILED CONNECTIONS FILE
$computers = Get-ADComputer -Filter * -SearchBase $OU
$logs = @()
$timestamp = ((Get-Date).ToString("yyyyMMdd_HHmmss"))
$output = ForEach ($computer in $computers){
   try{
      $logs += get-eventlog `
         -LogName system `
         -ComputerName $computer.Name `
         -After (Get-Date).AddDays($days) 
      $logs += get-eventlog `
         -LogName security `
         -ComputerName $computer.Name `
         -After (Get-Date).AddDays($days)
      $res = @()
      ForEach ($log in $logs){
         if($log.instanceid -eq 7001){
            $type = "Logon"
            $user = 
               try{
                  (New-Object System.Security.Principal.SecurityIdentifier(
                     $log.ReplacementStrings[1])).Translate(
                     [System.Security.Principal.NTAccount]).value
               }
               catch{
                  $log.ReplacementStrings[1]
               }
            $action = "Start"
         }
         Elseif ($log.instanceid -eq 7002){
            $type = "Logoff"
            $user = 
               try{
                  (New-Object System.Security.Principal.SecurityIdentifier(
                     $log.ReplacementStrings[1])).Translate(
                     [System.Security.Principal.NTAccount]).value
               }
               catch{
                  $log.ReplacementStrings[1]
               }
            $action = "Stop"
         }
         Elseif ($log.instanceid -eq 4800){
            $type = "Lock"
            $user = $log.ReplacementStrings[2] + "\" + 
               $log.ReplacementStrings[1]
            $action = "Stop"
         }
         Elseif ($log.instanceid -eq 4801){
            $type = "Unlock"
            $user = $log.ReplacementStrings[2] + "\" + 
               $log.ReplacementStrings[1]
            $action = "Start"
         }
         Elseif ($log.instanceid -eq 4778){
            $type = "Reconnect"
            $user = $log.ReplacementStrings[1] + "\" + 
               $log.ReplacementStrings[0]
            $action = "Start"
         }
         Elseif ($log.instanceid -eq 4779){
            $type = "Disconnect"
            $user = $log.ReplacementStrings[1] + "\" + 
               $log.ReplacementStrings[0]
            $action = "Stop"
         }
         Else {
            Continue
         }
         $hash = [ordered]@{
            "User" = $user
            "Computer" = $computer.Name
            "Time" = $log.TimeWritten
            "Event" = $type
            "Action" = $action
         }
         $res += New-Object PSObject -Property $hash
      }
      $res
   }
   Catch {
      Add-Content -Path "${directory}${timestamp}_failed.txt" $computer.Name
   }
}
$TimeDescending = @{
   Expression = 'Time'
   Descending = $true
}
$EventDescending = @{
   Expression = 'Event'
   Descending = $true
}
$output |
   sort User,Computer,$TimeDescending,$EventDescending |
   ? User -like "*me" |
   ft

【问题讨论】:

  • $stopEvent.Time - $startEvent.Time 会让你与众不同
  • 您好 Mathias,感谢您的回复。我不确定我是否遵循,对不起。我从哪里获得这些变量?

标签: windows powershell events time active-directory


【解决方案1】:

您可以使用New-TimeSpan cmdlet:

$start = Get-Date

# Do some stuff here

$end = Get-Date

$timeTaken = (New-TimeSpan -Start $start -End $end).TotalSeconds

【讨论】:

  • 您好重试,感谢您的建议。根据顶部的输出,此页面被导出为 CSV,然后由另一个脚本导入(我很确定有一种方法可以一次性完成所有操作,但我最初尝试将其分解,因为它更容易让我咀嚼!),我怎样才能让该脚本在“开始”之后找到第一个“停止”,计算差异,保持该值,从下一个开始重复,然后在最后计算总数。我知道我想说什么,只是不确定如何表述。
  • 我尝试了一种替代解决方案作为临时措施,以尝试通过使用 Excel 来可视化我想在 PowerShell 中执行的操作。如果我将以下公式放入单元格 F3 中(如果将上述输出导入 Excel,则单元格 F3 将位于最上面的“停止”的右侧 - 删除屏幕截图会容易得多,但似乎不能能够),然后在底部总共向下拖动,我得到了我想要的。 =IF(E3="Stop",SUM(C3-C4),0) 请原谅我的尝试太粗鲁了。有什么方法可以用 PowerShell 模拟这个?
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 2015-03-13
  • 2020-11-06
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多