去年在相关同事的协助下,完成了USB 权限管理自动化的改善工作,实现了权限的自动开通、关闭、通知等功能,但还存在些许问题,主要是历史数据及子管理员非合规操作引起,为了修复这一历史遗留问题,准备改善,计划如下:
1、清理管理员权限,便于后期出现类似管理混乱问题。
2、导出非合规USB 权限配置(Excel 形式)。
3、提醒用户补充USB 申请。
4、到期未提交申请的,将清理USB 权限。
那步骤1、2 应用层面的操作,只显示结果,不做过多介绍。3、4则需要我们自己来写脚本。 闲言少叙 :
1、清理USB 管理员权限。
1、删除无效的管理员账号。
2、对再用管理员账号授权符合,清理不必要的权限。
2、获取非合规授予USB 权限的计算机清单,部分清单如图。
3、准备写邮件了
1、邮件模板准备。
1 <html> 2 <head> 3 <meta charset="utf-8"> 4 5 </head> 6 7 <body> 8 9 <br> 10 <h15> {username} 您好!</h15> 11 <br> 12 13 <h16> 14 <br>  审计到您的计算机:{hostname} USB 权限已过期,计划在本月30号执行关闭权限操作,届时您电脑外接设备(如打印机、扫描仪、U盾等)可能无法正常使用。<br> 15 <br>  如您需要继续使用相关外接设备。请登陆bpm.aac.com→IT管理→USB权限开通申请流程,<font color="red" ><strong>并于29日前走完USB权限申请流程</strong></font>。 16 <br>  如您不再需要使用外接设备,请忽略此邮件。<br> 17 <br>  感谢您的理解与支持。<br> 18 19 </body> 20 </html>
2、读取Excel 表格信息(Opera_Excel.py)。
1 import xlrd 2 import xlwt 3 4 def R_Excel(wb_name,ws_name): 5 try: 6 wb= xlrd.open_workbook(wb_name) 7 try: 8 ws = wb.sheet_by_name(ws_name) 9 return ws 10 except: 11 print("Failed to locate WorkSheet %s !" %ws_name) 12 except: 13 print("Failed to locate WorkBook %s !" %wb_name) 14 15 def W_Excel(wb_name,ws_name,data): 16 WB=xlwt.Workbook() 17 WS=WB.add_sheet('Sheet1') 18 i=0 19 for each in data: 20 check_Res=check_Login(each) 21 i=i+1 22 WS.write(i, 0, check_Res) 23 if i%20==0: 24 WB.save('Excel_Workbook.xls') 25 26 27 def Get_InfoList(ws): 28 """ 29 将Excel 表格的数据转化成列表供python 调用 30 """ 31 for i in range(1,ws.nrows): 32 if ws.cell(i,1).value: 33 HostName=ws.cell(i,0).value 34 GroupName=ws.cell(i,1).value 35 UserAccount=ws.cell(i,2).value 36 yield [HostName,GroupName,UserAccount]
注意:受xlrd 包的影响,如果账号是纯数字形式,需要在Excel 表格前添加单引号"'"。
3、获取用户信息(get_userInfo.py)。
因为公司内提供了统一接口用于查询员工信息,此处我们仅仅查询邮箱。
import requests import json #集团提供查询员工信息的API 接口 def Get_email(ad): res = requests.get(url='http://bkpaas4.aac.com/o/dingding/get_hcm_user_by_ad_account/{}'.format(ad), timeout=600, verify=False) content = json.loads(res.content) # json.dumps(content, ensure_ascii=False) try: email=content['data']['Mail'] except: email=None return(email)
此时我们已经成功获取到了邮箱信息。
4、发送邮件。
通过前面的准备,解决了发给谁,发什么的内容,下面我们来解决谁来发的问题。
1、服务器基础信息准备。(conf.yaml)
1 Smtp_Info: 2 # 邮件基础信息 3 Smtp_Server: '10.xxx.xxx.118' 4 Smtp_Uname: 'xxxx@xxx.com' 5 Smtp_PW: 'szxxxxx' 6 Smtp_Sender: 'xxxx@xxxx' 7 8 9 SEPM_Info: 10 # SEPM 数据库相关新信息 11 SEPM_DBServer: '192.168.xxx.xxx' 12 SEPM_DB: 'SEP' 13 SEPM_DB_User: 'xxxxx' 14 SEPM_DB_PW: 'xxxxxx'
2、发送邮件的脚本书写(mail.py)
1 # coding: utf-8 2 import smtplib 3 from email.mime.multipart import MIMEMultipart 4 from email.mime.text import MIMEText 5 from email.mime.image import MIMEImage 6 from email.header import Header 7 import yaml ,os 8 config_path = os.path.join(os.getcwd(), 'configconf.yaml') 9 with open(config_path,'rb') as f: 10 conf = f.read() 11 c_info=yaml.load(conf) 12 13 Receiver_list_cc = list() 14 15 def Send_mail(receiver_list,subject,mail,receiver_Cc_list=Receiver_list_cc): 16 msg = MIMEMultipart('mixed') 17 msg['Subject'] = subject 18 msg['From']=c_info['Smtp_Info']['Smtp_Sender'] 19 text_plain = MIMEText(mail, 'html', 'utf-8') 20 msg.attach(text_plain) 21 msg['To'] = ";".join(receiver_list) 22 msg['Cc'] = ";".join(receiver_Cc_list) 23 smtp = smtplib.SMTP() 24 smtp.connect(c_info['Smtp_Info']['Smtp_Server']) 25 smtp.login(c_info['Smtp_Info']['Smtp_Uname'],c_info['Smtp_Info']['Smtp_PW']) 26 smtp.sendmail(msg['From'],msg['To'].split(';')+msg['Cc'].split(';'), msg.as_string()) 27 print(str(msg['To'].split(';')+msg['Cc'].split(';'))) 28 time.sleep(60) 29 smtp.quit() 30 # 根据最近14 小时的病毒攻击日志,制作需要发送的邮件。 31 def Make_Email(Info): 32 with open('TMP.html' ,'rb') as f: 33 Html_Content= f.read().decode('utf-8').format(username=Info[3][0],hostname=Info[0]) 34 35 subject = '计算机:'+Info[0]+'_USB 权限到期提醒' 36 Receiver_list =list() 37 Receiver_list.append(Info[3][1]) 38 Send_mail(Receiver_list,subject, Html_Content) 39 # print(subject,Html_Content) 40 41 def main(): 42 Make_Email(Info) 43 44 if __name__=="__main__": 45 main()
3、主函数 调用脚本书写(main.py)
1 import Opera_Excel as OE 2 import get_userInfo as GU 3 import mail 4 def main(): 5 #1、确认Excel工作簿和工作表名称。 6 WB_Name="SEPM.xlsx" 7 WS_Name="Sheet1" 8 ws=OE.R_Excel(WB_Name,WS_Name) 9 PC_lists=OE.Get_InfoList(ws) 10 for PC_list in PC_lists: 11 email=GU.Get_email(PC_list[2]) 12 PC_list.append(email) 13 mail.Make_Email(PC_list) 14 # print(PC_list) 15 16 if __name__ == '__main__': 17 main()
效果图