powershell - Powershell 脚本 RDP 连接数据
问题描述
我正在尝试获取 RDP 连接的源网络地址,以便在用户连接到服务器时发送电子邮件。除了源地址,我什么都有。我的脚本由 RemoteConnectionManager 操作日志中的事件 1149 触发。我只需要从系统访问事件数据或源地址。
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$SmtpClient.Host = "mail.scomage.com"
$mailmessage.from = ("BWAQBW@BWAServer.com")
$mailmessage.To.add("support@scomage.com")
$mailmessage.Subject = “BWAQB RDP”
$mailmessage.Body = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name + “ logged into BWA QB Server”
$smtpclient.Send($mailmessage)
在史蒂文的出色帮助下的最终脚本:
$LastEvent = Get-WinEvent -FilterHashtable `
@{ LogName = "Microsoft-Windows-TerminalServices-
RemoteConnectionManager/Operational"; Id = 1149} |
Select-Object *,
@{ Name = 'UserName'; Expression = `
{ if ($_.Properties[0].Value) { $_.Properties[0].Value } else { "Administrator" } } },
@{ Name = 'SourceIP'; Expression = { $_.Properties[2].Value } } |
Sort-Object TimeCreated |
Select-Object -Last 1
$MailParams =
@{
SmtpServer = "mail.scomage.com"
From = "BWAQBW@BWAServer.com"
To = "support@scomage.com"
Subject = "BWAQB RDP " + $LastEvent.UserName + " " + $LastEvent.SourceIP
Body = $LastEvent.UserName + " logged into BWA QB Server at " + `
$LastEvent.TimeCreated.ToString('g') + " From: " + $LastEvent.SourceIP
}
Send-MailMessage @MailParams
发送登录电子邮件的脚本:
$Event = Get-WinEvent -FilterHashTable @{
LogName='Security'; ID=4624; StartTime=$DateLess10; } |
Where-Object{$_.Properties[8].Value -eq 10 } |
Sort-Object TimeCreated |
Select-Object -Last 1
if( $Event.Properties[8].Value -eq 10 )
{
$MailParams =
@{
SmtpServer = "mail.scomage.com"
From = "BWAQBW@BWAServer.com"
To = "support@scomage.com"
Subject = "BWAQB Remote Login " + $Event.Properties[5].Value + " " + $Event.Properties[18].Value
Body = $Event.Properties[5].Value + " logged into BWA QB Server at " + `
$Event.TimeCreated.ToString('g') + " From: " + $Event.Properties[18].Value
}
Send-MailMessage @MailParams
}
解决方案
根据评论更新
看起来连接的源地址被记录为事件 1149 中的第三个属性。属性是一个类型的对象数组,[System.Diagnostics.Eventing.Reader.EventProperty[]]
这意味着您必须访问子属性 .Value
。
获取最后一个事件的示例:
$LastEvent =
Get-WinEvent -FilterHashtable @{ LogName = "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"; Id = 1149} |
Select-Object *,
@{ Name = 'UserName'; Expression = { $_.Properties[0].Value } },
@{ Name = 'SourceIP'; Expression = { $_.Properties[2].Value } } |
Sort-Object TimeCreated |
Select-object -Last 1
由于我不确定 Get-WinEvent 是否会保证Sort-Object
使用 cmdlet 的时间顺序。所以它应该导致最后一个 1149 事件。但是,它不保证它将适用于由System.Security.Principal.WindowsIdentity]::GetCurrent().Name
. 我不知道这是什么机器,也不知道脚本会在什么情况下运行。例如,如果它是一个多用户系统(由终端服务器暗示),我怀疑存在最后一个事件可能不适合当前用户的极端情况。
所以,我猜我们应该为那个用户隔离最后一个事件。我们可以使用以下示例之一来做到这一点:
选项1:
$NTUserName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$UserName = $NTUserName.Split('\')[-1]
$Events =
Get-WinEvent -FilterHashtable @{ LogName = "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"; Id = 1149} |
Select-Object *,
@{ Name = 'UserName'; Expression = { $_.Properties[0].Value } },
@{ Name = 'SourceIP'; Expression = { $_.Properties[2].Value } } |
Group-Object -Property UserName -AsHashTable -AsString
$LastEvent = ($Events[$UserName] | Sort-Object TimeGenerated)[-1]
选项 2:
$NTUserName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$UserName = $NTUserName.Split('\')[-1]
$LastEvent =
Get-WinEvent -FilterHashtable @{ LogName = "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"; Id = 1149} |
Select-Object *,
@{ Name = 'UserName'; Expression = { $_.Properties[0].Value } },
@{ Name = 'SourceIP'; Expression = { $_.Properties[2].Value } } |
Where-Object{ $_.UserName -eq $UserName } |
Sort-Object TimeCreated |
Select-Object -Last 1
在这两种情况下$LastEvent
都应该有当前用户的最后一个 1149 事件。第一个选项的排序较少,因为它仅对特定用户的事件进行排序。您可以$LastEvent.SourceIP
用于电子邮件。
次要注意事项:您不需要使用 System.Net.Mail.SMTPClient。您可以将 Send-MailMessage 与命令喷溅结合使用,如下所示:
$MailParams =
@{
SmtpServer = "mail.scomage.com"
From = "BWAQBW@BWAServer.com"
To = "support@scomage.com"
Subject = "BWAQB RDP"
Body = $UserName + " logged into BWA QB Server at " + $LastEvent.TimeCreated.ToString('g') + " From: " + $LastEvent.SourceIP
}
Send-MailMessage @MailParams
注意:以上内容在您发表评论后也进行了更新,以利用较新的修订版。注意:.ToString('g')
结果为日期格式,例如“6/30/2020 9:17 PM”
我不确定正文或主题是否完全正确,但你可以解决这个问题。
推荐阅读
- c# - 在原始实例中止后,被调用方法中的新任务实例不执行内部代码
- android - (场景)如何使用纹理,使用 .mat 文件
- node.js - 可以使用 formData 和 express 上传获得未定义值的文件。怎么解决?
- chef-infra - 使用 Chef infra 客户端卸载软件时 10 分 43 秒后失败
- sas - SAS - 将非数字值放在直方图 sgplot 的 X 轴上
- c# - 带有抽象方法的 C# 枚举
- vector - 如何确保多个语句都返回 Some?
- typescript - 如何从 nuxtjs 打字稿中的 auth 模块(nuxtjs/auth-next)获取 access_token?
- node.js - 如何在 Lightsail 实例中正确设置日志存储/管理?
- azure - CloudBlob.CopyState 在直接帐户到帐户复制完成后为空