微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pyinstaller 应用程序:AccessDenied 在系统启动时运行的文件夹创建

如何解决Pyinstaller 应用程序:AccessDenied 在系统启动时运行的文件夹创建

我有一个简单的脚本:

def get_log_dir():
    time_stmp = datetime.Now().strftime('%m%d-%H%M%s')
    dir_ = Path('..') / f'log_{time_stmp}'
    dir_.mkdir(exist_ok=True)
    return dir_


if __name__ == '__main__':
    path = get_log_dir()

我使用 pyinstaller --debug all -n minimal minimal.py 将其构建为 exe。 然后我用 NSIS 创建一个简单的安装程序:

  Name "myAppName"
  OutFile ".\myApp.exe"

  SilentInstall silent

  InstallDir "$LOCALAPPDATA\MyApp-0.1.1"
  
  RequestExecutionLevel admin

Section "Main Section" SecMain

  SetoutPath "$INSTDIR"
  
  File /r ".\myApp-app\*"

  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "myApp" '"$InstDir\minimal.exe"'

  ;Store installation folder
  WriteRegStr HKCU "Software\myApp" "" $INSTDIR
  
  Exec '"$INSTDIR\minimal.exe"'

SectionEnd

运行安装程序后,我将 exe 放入 AppData 文件夹,并且 HKLM 中有一个注册表项。它在安装结束时正确启动,我也可以随时手动启动它。 但是,如果我重新启动我的机器,脚本会按预期启动,但在尝试创建文件夹时失败并显示拒绝访问错误。什么可能导致这种情况和/或如何调试?是否有任何可以调查的 Windows 日志?也许 pyInstaller 日志?

更新: 有趣的是,如果不是修改注册表,而是创建一个快捷方式并将其放入 C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,它会起作用。现在的问题是它有什么不同以及为什么不同?四处走动是一种干净的解决方案还是应该被视为一种黑客行为?

解决方法

运行条目和快捷方式的区别在于,快捷方式可以提供其他属性,例如设置当前目录。

这让我相信您的 Python 脚本中的 Path('..') 是问题所在,因为当前目录未指定为 Run 条目,并且在现实生活中可能是您​​没有写访问权限的 Windows 目录。

解决方案是将 .. 替换为 the full path of the .exe。试图找到当前脚本的路径是 surprisingly trickyappdirs package 还可以帮助您为日志文件找到合适的目录...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。