从 Windows 事件日志导出登录/注销事件

从 Windows 事件日志导出登录/注销事件

环境:带有 Samba 3.5 域和 OpenLDAP 后端的 Windows Server 2008 R2。

背景:在我们之前的终端服务器(Windows Server 2003)上,我们使用登录/注销脚本分别将用户登录和注销记录到网络驱动器上的纯文本文件中。不幸的是,我们无法捕获远程 IP 地址,只能捕获工作站名称。

现在我们正在转向 Server 2008,我们发现事件日志捕获了大量数据 - 包括远程 IP - 但似乎没有简单的方法以我们想要的格式获取我们想要的数据。

有几种资源可能朝着正确的方向迈出了一步:

我的问题是:我是否尝试以人类可读的形式获取某种实时事件导出(以及如何),或者我是否通过计划任务执行定期解析(以及如何)?

答案1

在我看来,如果您真的想要实时数据,那么回到登录/注销脚本会更糟糕。如果您需要客户端计算机的 IP 地址,并且只获取计算机的名称,为什么不简单地在脚本中对其进行 nslookup?根据您使用的脚本语言,甚至可能有一个内置函数来执行查找。

我确信很多人会有不同的想法,但如果您确实想解析事件日志,无论是出于这个原因还是其他原因,Perl 不仅拥有模块,而且在处理数据方面也无可匹敌。如果您选择这条路,无论您选择使用哪种语言,我建议您将您感兴趣的数据发送到数据库,这样就可以更轻松地对其进行操作、搜索等。同样,Perl 使这一切变得简单。

答案2

PowerShell(保存 Get-LogonFailures.ps1 并运行)

param (
  $ComputerName = $Env:ComputerName,
  $Records = 10
)
function Get-FailureReason {
  Param($FailureReason)
    switch ($FailureReason) {
      '0xC0000064' {"Account does not exist"; break;}
      '0xC000006A' {"Incorrect password"; break;}
      '0xC000006D' {"Incorrect username or password"; break;}
      '0xC000006E' {"Account restriction"; break;}
      '0xC000006F' {"Invalid logon hours"; break;}
      '0xC000015B' {"Logon type not granted"; break;}
      '0xc0000070' {"Invalid Workstation"; break;}
      '0xC0000071' {"Password expired"; break;}
      '0xC0000072' {"Account disabled"; break;}
      '0xC0000133' {"Time difference at DC"; break;}
      '0xC0000193' {"Account expired"; break;}
      '0xC0000224' {"Password must change"; break;}
      '0xC0000234' {"Account locked out"; break;}
      '0x0' {"0x0"; break;}
      default {"Other"; break;}
  }
}
Get-EventLog -ComputerName $ComputerName -LogName 'security'
   -InstanceId 4625 -Newest $Records |
  select @{Label='Time';Expression={$_.TimeGenerated.ToString('g')}},
    @{Label='User Name';Expression={$_.replacementstrings[5]}},
    @{Label='Client Name';Expression={$_.replacementstrings[13]}},
    @{Label='Client Address';Expression={$_.replacementstrings[19]}},
    @{Label='Server Name';Expression={$_.MachineName}},
    @{Label='Failure Status';Expression={Get-FailureReason
       ($_.replacementstrings[7])}},
    @{Label='Failure Sub Status';Expression={Get-FailureReason
       ($_.replacementstrings[9])}}

当然,您可以将其传输到 logstash,以便使用 logstash 的 Windows 客户端进行集中管理,或者传输到 Azure Monitor 或 Solarwinds 等管理软件。顺便说一句,事件永远不会是实时的。

相关内容