如何实现函数仅在付费软件首次启动时执行?(机器GUID许可证场景)
解决方案:让指定函数仅在软件首次启动执行
你的核心问题是每次启动都会执行first_time_open_only(),导致许可证文件被重复覆盖。解决思路很直接:先检查许可证文件是否存在,只有当文件不存在时才执行首次初始化逻辑。
另外,你的代码还有几个明显问题需要修正:
if contents == str:这是错误写法,str是类型而非具体字符串,应该和你写入的机器GUID片段对比- 文件操作建议用
with语句,避免手动关闭时的异常 - 写入
C:\Program Files目录需要管理员权限,普通用户运行会报错,要么换个低权限路径(比如用户的AppData目录),要么提示用户以管理员身份启动
下面是修改后的完整代码:
import _winreg import os # 获取机器GUID key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography") result = _winreg.QueryValueEx(key, "MachineGuid") machine_guid = result[0] # 直接取GUID值,无需转成元组字符串再切片 _winreg.CloseKey(key) # 许可证文件路径,推荐用AppData目录避免权限问题 # licence_path = os.path.join(os.environ['APPDATA'], 'YourSoftware', 'licence.txt') licence_path = 'C:\\Program Files\\Common Files\\System\\read.txt' def first_time_open_only(): # 若用AppData路径,需确保父目录存在 # os.makedirs(os.path.dirname(licence_path), exist_ok=True) # 用with语句安全写入文件 with open(licence_path, 'w') as f: f.write(machine_guid) # 核心判断:文件不存在才执行首次初始化 if not os.path.exists(licence_path): try: first_time_open_only() except PermissionError: print("权限不足,请以管理员身份运行软件") exit() # 验证许可证有效性 try: with open(licence_path) as f: saved_guid = f.read().strip() if saved_guid != machine_guid: root.destroy() except FileNotFoundError: # 仅当首次初始化失败时会触发,直接关闭程序 root.destroy() root.mainloop()
关键说明:
- 存在性检查:通过
os.path.exists(licence_path)判断文件是否存在,不存在才执行首次初始化函数 - 权限处理:捕获
PermissionError,避免写入系统目录时崩溃 - GUID提取优化:直接取
result[0]就能拿到纯GUID字符串,简化后续切片操作 - 路径建议:优先使用用户的
AppData目录,普通用户无需管理员权限即可读写,提升兼容性
内容的提问来源于stack exchange,提问作者Anonymous 70
相关产品推荐
相关产品推荐

