![通过触发电子邮件报告事件日志内容 Windows 2012](https://linux22.com/image/716207/%E9%80%9A%E8%BF%87%E8%A7%A6%E5%8F%91%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%8A%A5%E5%91%8A%E4%BA%8B%E4%BB%B6%E6%97%A5%E5%BF%97%E5%86%85%E5%AE%B9%20Windows%202012.png)
我能够根据触发运行 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}
希望这可以帮助。
谢谢,蒂姆。