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

要求:

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

代码:

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

# 查询出user,返回的是hash数组。
$users=(quser.exe) -replace '\s{2,}',',' | 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 '\s{2,}',',' | 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

你可能感兴趣的:(shell,服务器,运维,shell,powershell)