python基础教程电子书txt
作者:王忘杰
全民制作人大家好,我是学习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天未修改 邮箱为[email protected]
用户 test 密码132天未修改 邮箱为[email protected]
四、发送邮件
百度一下,直接加进去,发送邮件所需要的东西我们都有了
用户名就是username,天数day,邮箱我们通过拼接usermail形成完整邮箱了
使用SMTP单独发件测试,其实不需要知道内容,拿来用就行了
from email.header import Header
from email.mime.text import MIMEText
mail_host = "smtp.mxhichina.com" # 设置服务器
mail_user = "[email protected]" # 用户名
mail_pass = "passwd" # 口令
sender = '[email protected]'
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秒
六、完整代码、编译、定时任务
就算了,大家看完上面肯定就会了,随便写写就比我写更规范。编译,那不是百度一下就行,定时任务就更简单了,这里就不说了。
七、最后
不会写代码的网工不是好系统运维
唐很景872谁可以推荐我一本关于零基础学习Python的书 -
羊油爱17067174956 ______ 你好 请让我回答你的问题.我是今年暑假才开始学PYTHON的,有一本书,让我入手非常快.《Python基础教程》豆瓣评分8.2分,地址如下 http://book.douban.com/subject/4866934/ 很适合新手,不仅适合第一次接触PYTHON的新手,也适合学...
唐很景872python 《python基础教程》if else 的问题,这里的else为何不是和if对齐的??? -
羊油爱17067174956 ______ 这是python强大的地方,下面的这个else并不是上面那个if的分支,然后上面整个for loop的分支,你可以把上面的for看做是一个if. 你把range改一下,改成(99,80,-1)你就能看到不同的结果了.
唐很景872我想自学Python,多久才能学会?
羊油爱17067174956 ______ 如果是自学,从零基础开端学习python的话,按照每个人理解能力的不同,大致上需求半年到一年半左右的时刻,当然,如果有其它编程言语的经历,入门还是比较快的,大概需求2~3个月可以用Python言语编写一些简单的使用,只要进行体系...
唐很景872Python从入门到精通要看哪些书 -
羊油爱17067174956 ______ Python入门到精通学习书籍推荐! 1、Python基础教程(第2版 修订版) 《Python基础教程(第2版修订版)》包括Python程序设计的方方面面,内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合各个层次的Python...
唐很景872自学 python 可以有哪些资料? -
羊油爱17067174956 ______ 那就推荐一些吧. 基础入门(Data Science方向为主): 1、《a byte of python 中文版》,零基础的人都可以看. 2、斯坦福的在线教程,入门级.Python Numpy Tutorial英文好的同学可以看看. 3、夯实python语言本身,建议看《Python ...
唐很景872Python教程给个介绍详细点的
羊油爱17067174956 ______ 如果你有python基础的话建议直接去Python官方网站(python.org),里面资源很丰富,如果你是初学者,建议先从<python简明教程>学起,自我感觉很实用的.希望对你有帮助!
唐很景872作为初学者 零基础如何学会python培训课程? -
羊油爱17067174956 ______ 1、先买一本自学用的Python书籍,不要看电子书. 2、对Python基础数据类型有一个了解. 3、学会各种类型的操作方法. 4、了解函数和类的概念. 5、动手实践,找小项目练习.
唐很景872求推荐适合毫无编程基础的python入门书 -
羊油爱17067174956 ______ 适合完全没有编程基础的新手使用?Learn Python The Hard Way 是你唯一的、最终的、史诗级的选择.它也许不能和 _why 的 why's (poignant) Guide to Ruby 重口味相提并论,但是作为不说废话、以练习为导向的教材,它是少林长拳一般的存在...
唐很景872自学python怎么样才能找到工作?
羊油爱17067174956 ______ 自学python找工作还有几点需要注意,或者说需要掌握的技巧:1、最好不要走正常招聘渠道,除非你有非常突出的优势,否则很容易被HR给筛选掉.可以的话,最好直接投到部门里去,记得附上简历、自己编的程序或写的代码等等.2、本着只想找工作的心.就当自己是刚毕业的学生,找工作别太挑.理论上,只要是python的,公司再小也去,积累工作经验才是关键.有了经验,公司不好你可以换,反客为主.3、求职过程加强学习,搞技术的,学习永无止境,提升自己的技术水平,求职自然会少走很多弯路.
唐很景872学习python需要什么必备的基础呢?
羊油爱17067174956 ______ 首先,感谢邀请啦~学习Python,个人感觉没有什么特殊需要准备的,只要你对编程有一颗热忱之心就可以了,但是非要说的话,我理解的大概是以下几点吧,仅供参考~需...