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 脚本通知公共邮箱账户快要过期和已经过期邮件通知