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

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

作者: 王忘杰 | 来源:发表于2022-08-30 21:09 被阅读0次

    全民制作人大家好,我是学习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

    此时的结果为这种格式

    111admin2021/11/3022:15:20admintest2022/4/2011:00:23test

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

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

    三、开始计算

    1、读取本地1.txt

    有困难,先百度,文章里所有代码都是按想法去百度的,使用open()函数打开本地文件

    f=open("C:\\Users\admin\Desktop\/1.txt","r",encoding='utf-16')

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

    lines=f.readlines()print(lines)

    此时输出结果为

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

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

    forlineinlines:print(line)

    输出结果就变成了

    admin2021/11/3022:15:20admintest2022/4/2011:00:23test

    2、分割字符,计算时间

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

    此时我们for循环变成了

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

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

    time_1=y[1]IndexError:listindex out ofrange

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

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

    运行结果

    错误行错误行2021-11-302022-4-20

    for代码解释

    forlineinlines:#每次for循环将lines中的一行赋予linetry:#异常处理,正常的执行,错误的跳转exceptx=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格式化后的日期才能减出时间差

    forlineinlines: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("错误行")

    运行结果

    273132

    4、判断是否大于60天

    很简单了,一个if搞定

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

    运行结果

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

    5、丰满内容,拼接出我们真正要的信息

    姓名、过期时间、邮箱,从y的第一位取出用户名,最后一位取出邮箱拼接起来

    ifday>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单独发件测试,其实不需要知道内容,拿来用就行了

    fromemail.headerimportHeaderfromemail.mime.textimportMIMETextmail_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+"邮件发送成功")exceptsmtplib.SMTPException:print("Error: 无法发送邮件")

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

    五、小优化

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

    六、完整代码、编译、定时任务

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

    七、最后

    不会写代码的网工不是好系统运维

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/utlrnrtx.html