通过触发电子邮件报告事件日志内容 Windows 2012

通过触发电子邮件报告事件日志内容 Windows 2012

我能够根据触发运行 powershell 脚本的任务计划程序操作的事件日志发送电子邮件。但是,我无法传递此事件携带的任何重要数据。例如,事件查看器>自定义视图>服务器角色>远程桌面服务事件记录成功登录时连接方的 IP 地址。这在 Windows 2008 上很容易做到:

https://community.spiceworks.com/scripts/show/2056-email-rdp-successful-logon https://blogs.technet.microsoft.com/otto/2007/11/09/reference-the-event-that-triggered-your-task/

但自从 2012 年电子邮件选项降价以来,我无法找到一种明显的方法来传递事件日志中可用的值。例如,以下是可以在 Windows 2008 中通过电子邮件报告的值:RDP 登录成功 EventID:$(eventRecordID) 系统:$(WorkstationName) 来自:$(IpAddress) 来自:$(TargetUserName)

我尝试在操作属性中的“添加参数”字段下将这些作为参数传递(使用 powershell 作为程序/脚本):“-noprofile -executionpolicy ignore -file C:\Windows\System32\email.successful.rdp.login.ps1 $(IpAddress)”

有人知道如何在 Windows 2012 中实现这一点吗?我猜可以查询最后一个事件并将其导出为文件,然后将其附加到生成的电子邮件中,但我认为有一种更优雅的方法来提取数据。2008 年可以做到这一点,所以我认为应该在 2012 年。

[1]:

答案1

这是一个很长的故事,希望能够让你理解。

在我的测试环境中,我没有对 4625 进行审核。在我的示例中,我将使用事件 ID 4624。4625 和 1142 应该相同。

为了获取我的事件日志,我使用下面的方法

[dc1]: PS C:\Users\Administrator\Documents> Get-WinEvent -FilterHashtable @{LogName ='security'; ID = 4624}

ProviderName: Microsoft-Windows-Security-Auditing

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
17/01/2018 7:43:23 PM         4624 Information      An account was successfully logged on....
17/01/2018 7:42:23 PM         4624 Information      An account was successfully logged on....
17/01/2018 7:41:36 PM         4624 Information      An account was successfully logged on...

我还使用 Select-First 1 来仅使用第一个事件对象。如果您对其中一个事件运行 Get-Member,它会为您提供方法、属性和我们想要的 MemberType,备注属性

[dc1]: PS C:\Users\Administrator\Documents> Get-WinEvent -FilterHashtable @{LogName ='security'; ID = 4624} | Select-Object -First 1 | Get-Member
TypeName: System.Diagnostics.Eventing.Reader.EventLogRecord
Name                 MemberType   Definition
----                 ----------   ----------
Dispose              Method       void Dispose(), void IDisposable.Dispose()
Equals               Method       bool Equals(System.Object obj)
FormatDescription    Method       string FormatDescription(), string 
FormatDescription(System.Collections.Generic.IEnumerable[System.Object] values)     
GetHashCode          Method       int GetHashCode()
GetPropertyValues    Method       System.Collections.Generic.IList[System.Object] 
GetPropertyValues(System.Diagnostics.Eventing.Reader.EventLogPropert...
GetType              Method       type GetType()
ToString             Method       string ToString()
ToXml                Method       string ToXml()
**Message              NoteProperty string Message=An account was successfully logged on....**                                                               
ActivityId           Property     System.Nullable[guid] ActivityId {get;}
Bookmark             Property     System.Diagnostics.Eventing.Reader.EventBookmark Bookmark {get;}

我会将其分配给一个变量以便能够提取信息。

[dc1]: PS C:\Users\Administrator\Documents> $event = Get-WinEvent -FilterHashtable @{LogName ='security'; ID = 4624} | Select-Object -First 1

如果你对此运行 Get-Member,它是一个类型名称:System.String然后可以用作字符串。

[dc1]: PS C:\Users\Administrator\Documents> $event.Message | Get-Member
   TypeName: System.String

在这种情况下,$event.message 包含大部分事件 ID 信息。下面是一小段代码。

dc1]: PS C:\Users\Administrator\Documents> $event.Message
An account was successfully logged on.

Subject:
    Security ID:        S-1-0-0
    Account Name:       -
    Account Domain:     -
    Logon ID:       0x0

Logon Information:
    Logon Type:     3
    Restricted Admin Mode:  -
    Virtual Account:        No
    Elevated Token:     Yes

Impersonation Level:        Impersonation

New Logon:
   Security ID:     S-1-5-18
   Account Name:        DC1$
   Account Domain:      TIMHAINTZ.COM

如果您不想通过电子邮件发送所有 $event.message,则可以使用 RegEx 选择所需的部分。下面是一个抓取“帐户域:”部分的示例。

[dc1]: PS C:\Users\Administrator\Documents> $regexevent = ([regex]::Matches( $event.Message, '(?<=Account\sDomain:\s\s).+').value)
[dc1]: PS C:\Users\Administrator\Documents> $regexevent
-
TIMHAINTZ.COM

在上面的例子中,帐户域:出现了两次,所以 RegEx 找到了它两次。- 和 TIMHAINTZ.COM。

根据 Mart 的评论要获取 Evend ID 1149 的正确日志,请参阅下面的代码。

Get-WinEvent -FilterHashtable @{LogName ='Microsoft-Windows-TerminalServices-RemoteConnectionManager/‌​Operational'; ID = 1149}

希望这可以帮助。

谢谢,蒂姆。

相关内容