Project

General

Profile

Win开机自启动

  1. 登录后自启动
    将快捷方式或脚本或程序等放到此目录下:
    shell:startup
    C:\Users\wly\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    
  2. 快速启动问题
    自己写的服务,每次关机后再开机之后自启动不了,但是每次重启后就会自启动。
    最后发现是因为Windows10默认开启了快速启动,关机时将服务的状态保存了文件,开机启动后服务并不会真正意义的重新启动,
    也就是说,如果开机后,你的服务是运行的,那你关机开机或重启后,服务还是会自启动的;
    但是如果开机后,你把服务停止了,然后关机,再开机后,服务就不会自启动了(如果是重启是会自启动的),因为“快速启动”
    保存了关机时服务状态。
    关闭快速启动:
    “设置”-》系统-》电源和睡眠-》其他电源设置-》选择电源按键的功能-》更改当前不可用的设置
    将“启用快速启动(推荐》”前面的勾去掉。
    附:快速启动原理:系统将关机前的状态保存到c盘根目录下的 hiberfil.sys 文件(该文件为隐藏文件,使用Everything工具可以搜索到)中,开机时从这个文件恢复状态,这个文件比较大,至少有好几个GB.
    
    clipboard-202411302213-wiw1u.png

    clipboard-202411302215-xsvgn.png

    clipboard-202411302216-wrqdm.png

  3. 登录前自启动:添加计划任务方式
    taskschd.msc
    添加一个计划任务
    
    clipboard-202411302227-61iu0.png

    clipboard-202411302227-ncu1w.png

    clipboard-202411302228-m9s2o.png

    clipboard-202411302228-xtkwa.png

    clipboard-202411302228-isfxg.png
    上面的方式需要输入当前用户的密码,如果不想输入密码可以将“运行任务时,请使用下列用户账户”改为“SYSTEM”用户:

    clipboard-202412021254-7l5bm.jpeg

    clipboard-202412021255-tyvb4.jpeg

    clipboard-202412021256-sk2xj.jpeg

    clipboard-202412021256-ygvka.jpeg
    命令行:

    schtasks /create /tn "TEST123" /tr "C:\Path\To\Your\Script.bat" /sc onstart /ru "SYSTEM" /rl highest /delay 0001:00 /F
    

  4. 登录前自启动:组策略方式
    gpedit.msc
    在“启动”里添加一个启动脚本或程序等
    
    clipboard-202411302241-lkoni.png
  5. 登录前自启动:服务方式
    AnyExeToService工具方式(图形化简单,直接双击exe即可,不详细介绍,推荐该方式):https://github.com/cxwl3sxl/AnyExeToService
    instsrv.exe和srvany.exe工具方式(操作复杂,详细介绍):
    https://blog.csdn.net/gitblog_00289/article/details/142156340
    https://zhuanlan.zhihu.com/p/616058216
    1)创建服务:D:\test\instsrv.exe CCServer D:\test\srvany.exe
    2)操作注册表:HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services->CCServer
    a)创建项:reg add "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" 
    b)在项下面创建值:
    reg add "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /v Application /t REG_SZ /d "C:\Users\wly\Desktop\test\test.bat" /f
    reg add "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /v AppDirectory /t REG_SZ /d "C:\Users\wly\Desktop\test" /f
    reg add "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /v AppParameters /t REG_SZ /d "" /f
    3)启动服务:net start CCServer
    4)停止服务:net stop CCServer
    5)删除注册表:
    reg delete "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /v AppParameters /f
    reg delete "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /v AppDirectory /f
    reg delete "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /v Application /f
    reg delete "HKLM\System\CurrentControlSet\Services\CCServer\Parameters" /f
    6)删除服务:
    instsrv.exe CCServer remove
    sc delete CCServer
    
    services.msc
    regedit
    
    clipboard-202411302306-svko9.png

    clipboard-202411302334-tuzbl.png

  6. 其它工具
    nssm
    sc(windwos自带)
    WinSW
  7. ToDesk服务示例

    clipboard-202412010035-e1hda.png

  8. sc创建服务(未测试通过)
    sc create MyService binPath= "C:\Users\wangliuyuan\Desktop\taizhou328\dist\MyService.bat" start=auto
    sc start MyService
    sc stop MyService
    sc delete MyService
    报错:
    sc start MyService
    [SC] StartService 失败 1053:
    服务没有及时响应启动或控制请求。
    
  9. 编译python程序为服务
    pip.exe install pywin32
    

    import win32serviceutil
    import win32service
    import win32event
    import servicemanager
    import time
    import datetime
    
    class TZ328Service(win32serviceutil.ServiceFramework):
        _svc_name_ = "TZ328Service" 
        _svc_display_name_ = "TZ328Service" 
        _svc_description_ = "TZ328Service." 
    
        def __init__(self, args):
            win32serviceutil.ServiceFramework.__init__(self, args)
            self.stop_event = win32event.CreateEvent(None, 0, 0, None)
            self.running = True
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            win32event.SetEvent(self.stop_event)
            self.running = False
    
        def SvcDoRun(self):
            servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                                   servicemanager.PYS_SERVICE_STARTED,
                                   (self._svc_name_, ''))
            self.main()
    
        def main(self):
            while self.running:
                current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
                # 写入文件
                with open(r"C:\Users\wangliuyuan\Desktop\taizhou328\dist\1.txt", "a") as f:
                    f.write(current_time + "\n")
                time.sleep(5)
    
    if __name__ == '__main__':
        win32serviceutil.HandleCommandLine(TZ328Service)
    

    python.exe main.py install
    python.exe main.py start 
    python.exe main.py stop
    python.exe main.py remove