You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现函数仅在付费软件首次启动时执行?(机器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:15:46