如何用python实现一键注入开机自启动

日期: 2020-07-01 10:55:07 人气: - 评论: 0

公司经常需要接触到自助机,而自助机有个非常重要的事情就是,开机后全屏启动某一个网页

但是由于网络原因,开机后可能还没有连接到网络,因此需要设置延迟启动


用到的模块解析:

  • tkinter —- 用于UI交互,当然input也可以,但是我们的是准备做给公司里不懂技术的运维人员使用的,所以最好有UI界面

  • messagebox —- 用于弹出窗口,用于提示

    • messagebox.showwarning(title=”标题”,message=”警告弹窗”)

    • messagebox.showinfo ( title=” 标题 “,message=”提示弹窗” )

    • messagebox. showerror ( title=” 标题 “,message=”错误弹窗” )

  • os —- 用于执行cmd命令,较为关键,语法为os.system(“cmd命令”),成功返回0,错误返回其他内容,参考https://blog.csdn.net/lwgkzl/article/details/81060016

  • string —- 用于字符串钩子,获取tkinter上绑定的变量内容,获取用户输入。

    • time=StringVar() —- 注册钩子

    • time.get() —- 获取用户输入

  • getpass —- 用于获取系统用户名,组合成系统桌面路径地址。

    • getpass.getuser()  —- 获取用户系统登录名

    • getpass.getpass() —- 提示用户输入密码


需要的模块我们简单的过了一遍,下面为具体实现代码:

from tkinter import *    #UI库
from tkinter import messagebox  #消息弹出
import os           #用于执行cmd命令
import string       #StringVar要用    字符串钩子
import getpass    #用于获取系统用户名称


def start():          #判断是否是数字并将小时处理为秒
    i=time.get()     #获得字符串钩子的值
    k=link.get()     #获得字符串钩子的值
    n=name.get()
    try:              #错误抓捕     判断是否为数字
        i=str(int(i))
    except ValueError:
        messagebox.showwarning(title="输入错误",message="请输入一个数字!")  #警告消息弹窗
    else:
        generate(i,k,n)
             
def cancel():     #删除生成的文件
    print("正在删除文件文件")
    n=name.get() #获取用户输入的任务名称
    userName=getpass.getuser()  #获取系统用户名称
    file_name = "C:\\Users\\"+str(userName)+"\\Desktop\\"+n+".bat" #生成桌面文件路径
    os.remove(file_name) #删除桌面文件
    boolStatus=os.system("cd \"%userprofile%/「开始」菜单/程序/Startup/\" && del "+n+".bat") #由于del特性,无法直接删除,需先进入启动目录后删除
    if boolStatus == 0:
        print("取消任务成功")
        messagebox.showinfo(title="成功",message="取消任务成功")
    else:
        print("取消任务失败,您可以在启动目录中自行删除")
        messagebox.showwarning(title="失败",message="取消任务失败,您可以在启动目录中自行删除")


def generate(t,l,n):#生成代码
    print("生成代码")
    #exe为全屏启动ie打开指定地址代码
    exe="""
"C:\Program Files\Internet Explorer\iexplore.exe" -k "{0}"
""".format(l);

    #txt在exe的基础上加入延时启动
    txt="""
@echo off
ping 127.0.0.1 -n {0} >nul{2}
""".format(t,l,exe);

    #开始写入到实际文件中
    write_file(txt,exe,n)

#写入文件
def write_file(txt,exe,name):
    print("开始写入文件")
    #获取系统用户名称
    userName=getpass.getuser()
    #设置文件桌面路径及名称
    file_name = "C:\\Users\\"+str(userName)+"\\Desktop\\"+name+".bat"
    # 以写入的方式打开
    f = open(file_name,'w')
    # 写入内容
    f.write(txt)
    # 关闭文件
    f.close()
    #复制文件到启动目录   由于userprofile目录无法通过python直接获取,无法直接写入,需要通过bat方式拷贝到启动目录
    boolStatus=os.system("copy /y \""+str(file_name)+"\" \"%userprofile%/「开始」菜单/程序/Startup\"")

    #设置完开机自启,延时启动,开始设置桌面无延时的bat文件
    f = open(file_name,'w')
    f.write(exe)
    f.close()
    if boolStatus == 0:
        messagebox.showinfo(title="成功",message="写入桌面与启动目录成功")
    else:
        messagebox.showwarning(title="失败",message="写入失败,请尝试使用管理员权限打开")
    




soft=Tk()
soft.geometry('160x200+885+465')       #初始化窗口大小信息
soft.resizable(0, 0)                  #设置窗口大小不可更改

#应用名称
textName=Label(soft,text="程序名称",compound="center").grid(row=0,column=0,columnspan=2,padx=0,pady=0)
name=StringVar()             #声明字符串钩子
textNameInput=Entry(soft,textvariable=name).grid(row=1,column=0,columnspan=2,padx=5,pady=0)  

#启动延时
textTime=Label(soft,text="请输入开机后等待时间(秒)",compound="center").grid(row=2,column=0,columnspan=2,padx=0,pady=0)
time=StringVar()             #声明字符串钩子
time.set("120")                #设置初始值
textTimeInput=Entry(soft,textvariable=time).grid(row=3,column=0,columnspan=2,padx=5,pady=0) 

#打开的网址
textLink=Label(soft,text="请输入需要打开的网址",compound="center").grid(row=4,column=0,columnspan=2,padx=0,pady=0)   
link=StringVar()             #声明字符串钩子
link.set("http://")                #设置初始值
textLinkInput=Entry(soft,textvariable=link).grid(row=5,column=0,columnspan=2,padx=5,pady=0)

button1=Button(soft,text="取消任务",command=cancel).grid(row=6,column=0,padx=5,pady=10)
button2=Button(soft,text="设置任务",command=start).grid(row=6,column=1,padx=5,pady=10)
soft.mainloop() #运行