【问题标题】:AppleScript application can't get rights in AccessibilityAppleScript 应用程序无法获得辅助功能中的权限
【发布时间】:2014-05-14 08:40:24
【问题描述】:

我在使用自己的 AppleScript 应用程序和“安全性和隐私”中的辅助功能时遇到问题。

我编写了一个名为“open cubase”的应用程序,并授予了访问权限。我使用了 Apple 关于如何防止重复重新授权的建议 (http://support.apple.com/kb/HT5914)。但是现在,即使在“辅助功能”列表中列出并选择了该应用程序,它也会说它没有辅助访问权限。

当我使用时

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/Tcc.db 'SELECT * FROM access WHERE client LIKE "%%"'

要检查发生了什么,我可以看到:

kTCCServiceAccessibility|com.atonus.open-cubase|0|1|0|??

为什么结尾有???有谁知道如何解决这个问题?

我使用的是 OSX 10.9.2。

【问题讨论】:

    标签: macos permissions applescript


    【解决方案1】:

    更新,基于 OP 的反馈:

    • OP 的问题不是使用property 语句,这通常会导致基于AppleScript 的应用程序在运行时属性值更改时自行修改应用程序包的嵌入式Contents/Resources/Scripts/main.scpt 脚本文件。
    • 但是,Apple 的解决方法是 http://support.apple.com/kb/HT5914
      • 专门用于解决由于给定版本应用程序的这种自我修改问题而无需重新授权。
      • 并不意味着允许在不重新授权的情况下更新应用程序(更改其源代码或资源)。

    出于安全原因,无法根据捆绑 ID 向应用授予一次性授权,然后无论其如何更改(例如,通过更新)都保持授权.

    你有两个选择:

    • 或者:重新授权应用程序每次更新它。
      • 更新您的应用程序后,转到System Preferences > Security & Privacy > Privacy > Accessibility切换复选标记代表您的应用程序的列表项旁边(如果您的应用程序不存在,拖动它那里)。
      • 注意:使用 Apple 的解决方法 - 出于安全原因,这不是一个好主意,除非您确实需要使用保持其值的 property 语句 - 重新签名可能就足够了应用程序 - 尚未验证。
    • 或者:使用解决方法 - 出于安全原因不推荐
      • 使您的应用成为一个不变的包装器,它在运行时从应用程序包之外的位置加载真正的脚本代码 - 这样,应用程序就保持即使在运行时加载的脚本文件发生变化,也不需要重新授权。
      • 示例:假设您的真实脚本代码 - 涉及需要辅助访问的代码 - 存储为 ~/Desktop.test.scpt;您的包装应用程序一旦获得授权,就可以使用run script file ((path to home folder as text) & "Desktop:test.scpt") 调用该脚本

    我没有具体的解释,只是一个建议

    • 不要在基于 AppleScript 的应用程序中使用 属性(例如,property FNAME : "Input.txt":AppleScript 会自动保留这些(在运行之间保留它们的值),但是该功能的实现很笨拙(持久化的值被写入*.scpt 文件本身 - 这就是导致重复授权问题的原因)并且很脆弱(如果您修改应用程序并保存(@987654331 @ 文件再次位于)应用程序的核心,以前的持久值丢失了)。

    • 如果您远离属性,重复授权的问题就会消失(除非您更新应用程序)。您可以滚动自己的持久性,例如,通过 AppleScript 对 .plist(属性列表)文件的支持(参见 System Events 字典)。

      • 您也不需要链接支持文章 (http://support.apple.com/kb/HT5914) 中描述的解决方法,这也是一个优点,因为解决方法是基于打开一个安全漏洞。

    至于你的具体问题:

    • ?? 是来自TCC.db 数据库的csreq 列值的 - 无用的表示,并且本身不是问题; OSX 在幕后管理该专栏;它包含以特定当前形式识别应用程序的各种指纹(类似于 MD5 哈希,尽管我不知道实际使用的是什么),以便以后能够检测到篡改。

    • 但是,我怀疑您可能正在查看错误的数据库条目

      • 我对您的捆绑包 ID 为 com.atonus.open-cubase 感到困惑:如果您的应用是基于 AppleScript 的*.app 捆绑包,则其捆绑包 ID 将具有固定前缀 com.apple.ScriptEditor.id.,例如 com.apple.ScriptEditor.id.open-cubase。您是通过捆绑包的 Info.plist 文件手动修改捆绑包 ID,还是我遗漏了什么?

      • 当操作系统确定授权应用程序被篡改/更改时:

        • 它将allowed 列值重置为0,即撤销授权
        • 它将csreq 列值重置为NULL
      • 因此,看到... is not allowed assistive access 对话框后,数据库条目应报告为kTCCServiceAccessibility|com.atonus.open-cubase|0|0|1| - 请注意更改后的布尔标志和?? 的缺失最后。

    【讨论】:

    • 我的答案很长,所以我会在下面写一个更大的答案。
    • @atonus:我看到了你评论的早期版本,你问我所说的“持久属性”是什么意思 - 请参阅我的更新以获得澄清。
    • 好的,谢谢。我实际上没有使用property 定义。我开始使用我自己的 ID com.atonus.open-cubase,因为似乎应用程序名称被缓存在某处。这个open cubase 应用程序最初被称为open cubase + osc,当我将它重命名为open cubase 时,它仍然显示我运行它时的原始名称。这不是一个真正的问题,但现在我认为目前的情况与此有关。
    • 重建您的启动服务数据库,在终端中运行/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user - 看看是否有帮助;要检查它,运行/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump
    • 使用以下 shell 命令列出临时签名应用程序的路径(查看 /Applications - 根据您的需要调整):for a in /Applications/*.app/; do codesign -d --verbose=4 "$a" 2>&1 | egrep -q '^Signature=adhoc' && echo "$a"; done。临时签名是使用codesign -s - 创建的签名,如解决方法中使用的那样。但是,无论是否经过临时签名,您的应用都应该在获得授权后运行。
    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多