PowerShellスクリプトを実行するタスクスケジューラアクションをトリガーするイベントログに基づいて電子メールを送信できます。しかし、私はこのイベントが運ぶ重要なデータのどれも渡すことができません。たとえば、[イベントビューア]> [カスタムビュー]> [サーバーロール]> [リモートデスクトップサービス]イベントは、ログインが成功したときに接続側のIPアドレスをログに記録します。これは、Windows2008で簡単に実行できます。
https://community.spiceworks.com/scripts/show/2056-email-rdp-successful-logonhttps://blogs.technet.Microsoft.com/otto/2007/ 11/09/reference-the-event-that-triggered-your-task /
しかし、2012年に電子メールオプションが減価償却されて以来、イベントログで利用可能な値を渡す明確な方法を見つけることができません。例として、Windows 2008で電子メールを介して報告できる値を次に示します。RDPログイン成功イベントID:$(eventRecordID)システム:$(WorkstationName)差出人:$(IpAddress)作成者:$(TargetUserName)
これらをアクションプロパティの[引数の追加]フィールドの下に引数として渡してみました(powershellをプログラム/スクリプトとして使用): "-noprofile -executionpolicy override -file C:\ Windows\System32\email.successful.rdp.login .ps1 $(IpAddress) "
誰かがWindows2012でこれを達成する方法について何かアイデアがありますか?最後のイベントを照会してファイルとしてエクスポートし、それを結果の電子メールに添付することは可能だと思いますが、データを抽出するより洗練された方法があると思います。 2008年にできるので、2012年になると思います。
[1]:
これは少し長いものになるでしょう、うまくいけばそれは理にかなっています。
テスト環境で4625の監査を行っていません。この例では、代わりにイベントID4624を使用します。 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と、必要なものNotePropertyが提供されます。
[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を実行すると、TypeName: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
上記の例では、Account Domain:が2回表示されるため、RegExはそれを2回検出します。 -およびTIMHAINTZ.COM。
マートのコメントによる Evend ID 1149の正しいログを取得するには、以下のコードを参照してください。
Get-WinEvent -FilterHashtable @{LogName ='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational'; ID = 1149}
お役に立てれば。
ありがとう、ティム。