Я могу отправлять электронную почту на основе журнала событий, запускающего действие планировщика заданий, которое запускает сценарий 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 Login Successful EventID: $ (eventRecordID) System: $ (WorkstationName) From: $ (IpAddress) By: $ (TargetUserName)
Я попытался передать их в качестве аргументов в поле «добавить аргументы» в свойствах действия как таковых (с PowerShell в качестве программы / сценария): «-noprofile -executionpolicy bypass -file C: \ Windows \ System32 \ email.successful.rdp.login .ps1 $ (IpAddress) "
Есть ли у кого-нибудь идеи, как это сделать в Windows 2012? Я предполагаю, что можно запросить последнее событие и экспортировать как файл, а затем прикрепить его к полученному электронному письму, но я бы подумал, что есть более элегантный способ извлечения данных. Это можно было сделать в 2008 году, поэтому я предполагаю, что это должно быть в 2012 году.
[1]:
Это будет немного долго, надеюсь, в этом есть смысл.
У меня нет аудита для 4625 в моей тестовой среде. Вместо этого в моем примере я буду использовать идентификатор события 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 в этом случае содержит большую часть информации идентификатора события. Небольшой фрагмент ниже.
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
В приведенном выше примере Account Domain: появляется дважды, поэтому RegEx находит его дважды. - и TIMHAINTZ.COM.
Согласно комментариям Марта Чтобы получить правильные журналы для Evend ID 1149, см. Код ниже.
Get-WinEvent -FilterHashtable @{LogName ='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational'; ID = 1149}
Надеюсь это поможет.
Спасибо, Тим.