0基础上手python编程,实践windows域用户过期邮件通知

2022-08-30 21:52:18 90点赞 102收藏 12评论

全民制作人大家好,我是学习python两天半的练习生王忘杰,喜欢路由交换、linux、网络安全,开整!在此之前我并没有编程经验,对于python我花了半天时间看了www.runoob.com/python3的教程,看完第五节基本语法,发现python与bash脚本基本相同,因此安装完PyCharm后直接开始了代码编写。

本文目标,0基础使用python语言完成对windows域用户超过60天未修改密码的进行邮件通知。

一、代码思路
1、获取windows域用户名、上次修改密码时间、邮箱
2、使用python计算修改密码时间是否超过60天
3、超过60天发送邮件通知
4、使用异常处理语句,防止程序崩溃
5、完整编译、定期执行、定期检查

二、获取windows域用户信息
百度查询,获得powershell命令

Get-ADUser -Filter 'Name -like "*"' -Properties *

Get-ADUser是powershell域管理的用户管理命令,此条命令可以列出全部域用户信息

因为我们只需要用户名、上次修改密码时间和邮箱,因此使用powershell管道符加Select-Object筛选出name,passwordlastset,SamAccountName即可

Get-ADUser -Filter 'Name -like "*"' -Properties * | Select-Object name,passwordlastset,SamAccountName

此时的结果为这种格式

1 11

admin 2021/11/30 22:15:20 admin
test 2022/4/20 11:00:23 test

通过重定向将结果导出到本地,使用python进行后续工作,也可以直接用python执行powershell,看完本文你就懂了。

Get-ADUser -Filter 'Name -like "*"' -Properties * | Select-Object name,passwordlastset,SamAccountName > 1.txt

三、开始计算
1、读取本地1.txt
有困难,先百度,文章里所有代码都是按想法去百度的,使用open()函数打开本地文件

f = open("C:UsersadminDesktop/1.txt", "r", encoding='utf-16')

因为文本有很多行,所以需要使用readlines()函数来按行存储,此函数会以每一行为单位构建一个列表

lines = f.readlines()
print(lines)

此时输出结果为

['1n', 'n', 'admin 2021/11/30 22:15:20 adminn', 'test 2022/4/20 11:00:23 test n']

我们构建for循环来输出每一行的内容

for line in lines:
print(line)

输出结果就变成了



admin 2021/11/30 22:15:20 admin

test 2022/4/20 11:00:23 test

2、分割字符,计算时间
我们使用strptime()函数来进行时间差计算,为此我们需要把每一行进行字符分割,提取有用的信息,而strptime()函数的日期格式是2021-11-30,与AD默认导出的2021/11/30不同,所以需要进行字符替换。

此时我们for循环变成了

for line in lines:
x = line.replace("/", "-")
y = x.split()
time_1 = y[1]
print(time)

注意,因为文本里有空格,运行会报错,所以我们要做的是进行异常处理。

time_1 = y[1]
IndexError: list index out of range

使用try进行异常处理,修改for代码为

for line in lines:
try:
x = line.replace("/", "-")
y = x.split()
time_1 = y[1]
print(time_1)
except:
print("错误行")

运行结果

错误行
错误行
2021-11-30
2022-4-20

for代码解释

for line in lines: #每次for循环将lines中的一行赋予line
try: #异常处理,正常的执行,错误的跳转except
x = line.replace("/", "-") #使用replace()函数将line中的/替换为-,将结果赋予x,从[admin 2021/11/30 22:15:20 admin]替换为[admin 2021-11-30 22:15:20 admin]
y = x.split() #使用split()将x使用空格分割,从[admin 2021-11-30 22:15:20 admin]分割为[admin][2021-11-30][22:15:20][admin]
time_1 = y[1] #提取第二个字符,注意是0、1、2,所以1就是第二个字符
print(time_1) #打印2021-11-30,打印仅仅是为了从终端观察运行结果
except:
print("错误行") #打印仅仅是为了从终端观察运行结果

获取当前日期,使用time()函数,使用strftime()函数格式化为 年-月-日格式方便计算,此函数import time引用

print(time.strftime("%Y-%m-%d", time.localtime()))

3、计算时间差
使用datetime计算时间差,from datetime import datetime引用,只有datetime格式化后的日期才能减出时间差

for line in lines:
try:
x = line.replace("/", "-")
y = x.split()
time_1 = y[1]
time_2 = time.strftime("%Y-%m-%d", time.localtime())
time_1 = datetime.strptime(time_1, "%Y-%m-%d")
time_2 = datetime.strptime(time_2, "%Y-%m-%d")
day = (time_2 - time_1).days #提取日期
print(day) #打印日期
except:
print("错误行")

运行结果

273
132

4、判断是否大于60天
很简单了,一个if搞定

print(day)
if day > 60: #大于60天
day = str(day) #上面获取的day是int类型,必须转换成文本,否则无法运行,编辑器会提示错误
print('密码'+ day +'天未修改') #打印内容
else:
print('未过期')

运行结果

密码273天未修改
密码132天未修改

5、丰满内容,拼接出我们真正要的信息
姓名、过期时间、邮箱,从y的第一位取出用户名,最后一位取出邮箱拼接起来

if day > 60:
day = str(day)
username = y[0]
usermail = (y[3] + '@90apt.com') #拼接邮箱
print('用户 '+username+' 密码'+ day +'天未修改 邮箱为'+usermail)
else:
print('未过期')

运行结果

用户 admin 密码273天未修改 邮箱为admin@90apt.com
用户 test 密码132天未修改 邮箱为test@90apt.com

四、发送邮件
百度一下,直接加进去,发送邮件所需要的东西我们都有了
用户名就是username,天数day,邮箱我们通过拼接usermail形成完整邮箱了

使用SMTP单独发件测试,其实不需要知道内容,拿来用就行了

from email.header import Header
from email.mime.text import MIMEText

mail_host = "smtp.mxhichina.com" # 设置服务器
mail_user = "admin@90apt.com" # 用户名
mail_pass = "passwd" # 口令

sender = 'admin@90apt.com'
receivers = (usermail) # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEText('亲爱的 ' + username + ' 域用户 :n
您的计算机域账户已经超过' + day + '天没有修改密码了', 'plain', 'utf-8')
message['From'] = Header("域用户密码超期安全提醒", 'utf-8')
message['To'] = Header(username, 'utf-8')
subject = '域用户密码超期安全提醒'
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print(username + "邮件发送成功")
except smtplib.SMTPException:
print("Error: 无法发送邮件")

运行后列表里的人会收到邮件

五、小优
邮件别发的太快,容易被封号,在for循环里加个time.sleep(3),运行一次等待3秒

六、完整代码、编译、定时任务
就算了,大家看完上面肯定就会了,随便写写就比我写更规范。编译,那不是百度一下就行,定时任务就更简单了,这里就不说了。

七、最后
不会写代码的网工不是好系统运维

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起

WPS 金山软件 WPS 超级会员 6年卡

WPS 金山软件 WPS 超级会员 6年卡

649元起

Microsoft 微软 OFFICE 365 家庭版 会员

Microsoft 微软 OFFICE 365 家庭版 会员

229元起

微软 (Microsoft) Office 365 家庭版/个人版 激活密钥 1年订阅 正版办公软件 店铺至尊指导服务+M365家庭版加强版-15个月

微软 (Microsoft) Office 365 家庭版/个人版 激活密钥 1年订阅 正版办公软件 店铺至尊指导服务+M365家庭版加强版-15个月

暂无报价

Microsoft 微软 Office 365 个人版

Microsoft 微软 Office 365 个人版

194元起

Microsoft 微软 Office 2019 家庭学生版 密钥

Microsoft 微软 Office 2019 家庭学生版 密钥

199元起

《国家地理 每日精选》iOS数字版软件

《国家地理 每日精选》iOS数字版软件

暂无报价

《Picsew》iOS数字版软件

《Picsew》iOS数字版软件

暂无报价

WPS 金山软件 WPS 超级会员 3年卡

WPS 金山软件 WPS 超级会员 3年卡

399元起

WPS 金山软件 会员季卡

WPS 金山软件 会员季卡

22元起

WPS 金山软件会员 2年卡

WPS 金山软件会员 2年卡

149元起

Microsoft 微软 OFFICE 365 个人版 办公软件

Microsoft 微软 OFFICE 365 个人版 办公软件

194元起

《kirakira+》 iOS软件

《kirakira+》 iOS软件

暂无报价

《DARK SOULS III》(黑暗之魂3 )PC数字版游戏

《DARK SOULS III》(黑暗之魂3 )PC数字版游戏

暂无报价

《扫描全能王付费版》iOS数字版软件

《扫描全能王付费版》iOS数字版软件

暂无报价

《拍照取字 专业版》iOS数字版软件

《拍照取字 专业版》iOS数字版软件

暂无报价

WPS 金山软件 WPS会员 5年卡

WPS 金山软件 WPS会员 5年卡

暂无报价
12评论

发表评论请 登录
  • 最新
  • 最热
评论举报

请选择举报理由

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
102
扫一下,分享更方便,购买更轻松