powershell脚本案例:当有人使用公共账户登陆服务器时,发送邮件到teams,shell脚本

Posted dlage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了powershell脚本案例:当有人使用公共账户登陆服务器时,发送邮件到teams,shell脚本相关的知识,希望对你有一定的参考价值。

要求:

当有人使用公共账户登陆VM的时候就发送邮件到Teams

代码:

部分代码如下,还有发邮件的代码没有测试,而且还是公司的邮箱。就不贴出来了。

# 查询出user,返回的是hash数组。
$users=(quser.exe) -replace '\\s2,',',' | ConvertFrom-Csv
# 查询出ip地址, 前后是有空格的。
$ip=(ipconfig|select-string "IPv4"|out-string).Split(":")[-1]
# 由于只能查出ip地址,不能查出服务器名称。所以使用一个hash表来将他们一一对应。
$iptable = @
    '192.168.31.147'= 'W2832'

$server=$iptable[$ip.Trim()]

foreach($user in $users)

    if ($user.USERNAME -eq ">pzhang36") 
        Write-Output "$user.USERNAME  logging on the server  $server"
    

输出:

PS C:\\code\\powershell> .\\demo.ps1

>pzhang36 logging on the server  W2832 
 User detial: @USERNAME=>pzhang36; SESSIONNAME=console; ID=2; STATE=Active; IDLE TIME=2+05:41; LOGON TIME=2022/3/13 16:49

解析:

下面代码可以将这个电脑上登陆的用户查询出来。

$users=(quser.exe) -replace '\\s2,',',' | ConvertFrom-Csv

查询出来的是这个样子,直接将控制台的输出粘贴过来了。

PS C:\\code\\powershell> .\\demo.ps1



USERNAME    : >pzhang36
SESSIONNAME : console
ID          : 2
STATE       : Active
IDLE TIME   : 2+05:11
LOGON TIME  : 2022/3/13 16:49

这个是查询ip的代码。查询出来的结果如下(中间是有空格的。这个空格困扰了我一天,后面会说清楚为什么)

$ip=(ipconfig|select-string "IPv4"|out-string).Split(":")[-1]
PS C:\\code\\powershell> .\\demo.ps1



USERNAME    : >pzhang36
SESSIONNAME : console
ID          : 2
STATE       : Active
IDLE TIME   : 2+05:13
LOGON TIME  : 2022/3/13 16:49

 192.168.31.147



由于每台机器都有自己的名字,但是通过powershell只能查询出相应的ip地址。(不知道能不能查询出来,反正我是不知道)

所以就只能使用一个hashtale来存储相应的虚拟机名和ip地址。通过ip地址就可以找到主机名了。

数据结构定义如下:

$iptable = @
  '192.168.31.147'= 'W2832'

因为ip地址是通过查询得到的。所以我们需要通过变量去hashtable里面查询。

查询代码如下:

$server=$iptable[$ip]

结果是空!!

我去,这是怎么回事。后来我查询了很多的博客。来学习hashtable数据结构的使用方法。比如通过点也可以查找。但是发现还是找不到。结果为空。

$server=$iptable.$ip

是不是因为查询数据不能通过变量来查询,但是又觉得应该是可以通过变量来查询的。所以我就直接使用字符串来查询。

$server=$iptable['192.168.31.147']

哎,我发现居然可以查询出来。这有点证实了我的想法。但是还需要进一步验证。

$temp = '192.168.31.147'
$server=$iptable[$ip]

哎,我发现直接定义变量,不适用ip地址查询的方法可以找到相应的数据!为什么通过方法查询出来的数据不能作为key来查询呢?是不是他们的数据类型不一样。我赶紧去比较他们的数据类型。

$ip=(ipconfig|select-string "IPv4"|out-string).Split(":")[-1]
$ip.GetType()
'192.168.31.147'.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
True     True     String                                   System.Object

他们的数据类型都是String。所以应该也不是数据类型的问题。

我就仔细观察了一下查询出来ip的值,不对劲应该是前后多了写空格。后来将这个空格删除就可以了。


 192.168.31.147


使用下面的代码即可。

$server=$iptable[$ip.Trim()]

ref:http://dlage.cn/archives/powershell-mail-teams
大家可以来我的博客串串门:http://dlage.cn

以上是关于powershell脚本案例:当有人使用公共账户登陆服务器时,发送邮件到teams,shell脚本的主要内容,如果未能解决你的问题,请参考以下文章

通过powershell 脚本通知公共邮箱账户快要过期和已经过期邮件通知

AWS EC2多账户的Powershell脚本

开启MFA的账户使用Powershell免密(使用证书应用身份验证)方式连接Exchange Online

AD域的账户创建和设置

Office365 PowerShell打开邮箱审计功能

powershell脚本实现以指定的账户运行程序