0基礎上手python編程,實踐windows域用戶過期郵件通知
全民制作人大家好,我是學習python兩天半的練習生王忘杰,喜歡路由交換、linux、網絡安全,開整!在此之前我并沒有編程經驗,對于python我花了半天時間看了www.runoob.com/python3的教程,看完第五節(jié)基本語法,發(fā)現(xiàn)python與bash腳本基本相同,因此安裝完PyCharm后直接開始了代碼編寫。
本文目標,0基礎使用python語言完成對windows域用戶超過60天未修改密碼的進行郵件通知。
一、代碼思路
1、獲取windows域用戶名、上次修改密碼時間、郵箱
2、使用python計算修改密碼時間是否超過60天
3、超過60天發(fā)送郵件通知
4、使用異常處理語句,防止程序崩潰
5、完整編譯、定期執(zhí)行、定期檢查
二、獲取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進行后續(xù)工作,也可以直接用python執(zhí)行powershell,看完本文你就懂了。
Get-ADUser -Filter 'Name -like "*"' -Properties * | Select-Object name,passwordlastset,SamAccountName > 1.txt
三、開始計算
1、讀取本地1.txt
有困難,先百度,文章里所有代碼都是按想法去百度的,使用open()函數(shù)打開本地文件
f = open("C:\\Users\admin\Desktop\/1.txt", "r", encoding='utf-16')
因為文本有很多行,所以需要使用readlines()函數(shù)來按行存儲,此函數(shù)會以每一行為單位構建一個列表
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循環(huán)來輸出每一行的內容
for line in lines:
? ?print(line)
輸出結果就變成了
admin ? ? ? ? 2021/11/30 22:15:20 admin
test ? ? ? ? 2022/4/20 11:00:23 ?test ? ?
2、分割字符,計算時間
我們使用strptime()函數(shù)來進行時間差計算,為此我們需要把每一行進行字符分割,提取有用的信息,而strptime()函數(shù)的日期格式是2021-11-30,與AD默認導出的2021/11/30不同,所以需要進行字符替換。
此時我們for循環(huán)變成了
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循環(huán)將lines中的一行賦予line
? ?try: #異常處理,正常的執(zhí)行,錯誤的跳轉except
? ? ? ?x = line.replace("/", "-") #使用replace()函數(shù)將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()函數(shù),使用strftime()函數(shù)格式化為 年-月-日格式方便計算,此函數(shù)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
四、發(fā)送郵件
百度一下,直接加進去,發(fā)送郵件所需要的東西我們都有了
用戶名就是username,天數(shù)day,郵箱我們通過拼接usermail形成完整郵箱了
使用SMTP單獨發(fā)件測試,其實不需要知道內容,拿來用就行了
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 + "郵件發(fā)送成功")
?except smtplib.SMTPException:
? ?print("Error: 無法發(fā)送郵件")
運行后列表里的人會收到郵件
五、小優(yōu)化
郵件別發(fā)的太快,容易被封號,在for循環(huán)里加個time.sleep(3),運行一次等待3秒
六、完整代碼、編譯、定時任務
就算了,大家看完上面肯定就會了,隨便寫寫就比我寫更規(guī)范。編譯,那不是百度一下就行,定時任務就更簡單了,這里就不說了。
七、最后
不會寫代碼的網工不是好系統(tǒng)運維