windows - 添加到 HKCU/Software/Classes 后无法通过 URI 启动 Windows 程序

标签 windows registry administrator uri-scheme

我正在尝试在 Windows 上设置一个测试应用程序以通过“myapp://website.com”式 URI 启动。大多数情况下,我都是以这样的教程为基础的:

http://msdn.microsoft.com/en-us/library/ie/aa767914(v=vs.85).aspx

虽然我在 HKEY_CLASSES_ROOT 中进行了初始设置,但新的限制是无需管理员访问权限即可进行安装。因此,我删除了 CLASSES_ROOT 中的所有更改,并决定重试注册表添加,而不是使用位于 HKEY_CURRENT_USER/Software/Classes/myapp 的 HKEY_CURRENT_USER 分支。

这似乎被浏览器检测到了,它们会显示确认对话框。但是,他们从未实际运行该应用程序。 Internet Explorer 给出了最有用的错误消息,对话框显示“无法为 {uri} 打开此帮助应用程序。此地址中指定的协议(protocol)无效。确保地址正确,然后重试。

非管理员设置是否缺少注册表的某些部分?这是将我的更改导出为 .reg。 (破折号审查我的用户名)。 EditFlags 是作为猜测添加的,但没有它也不起作用。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\myapp]
"URL Protocol"=""
@="URL:David Protocol"
"EditFlags"=dword:02000000

[HKEY_CURRENT_USER\Software\Classes\myapp\DefaultIcon]
@="C:\\Users\\------\\AppData\\Roaming\\-----s Stuffs\\URISchemeTest.exe,1"

[HKEY_CURRENT_USER\Software\Classes\myapp\shell]

[HKEY_CURRENT_USER\Software\Classes\myapp\shell\open]

[HKEY_CURRENT_USER\Software\Classes\myapp\shell\open\command]
@="\"C:\\Users\\-------\\AppData\\Roaming\\------s Stuffs\\URISchemeText.exe\" \"%1\""

最佳答案

既然我已经有了这个工作,我不能完全确定是什么导致了问题,但我至少可以说明我尝试做的不同的事情,希望这对 future 的研究人员有所帮助。

路径声明可能不支持

%-sign 目录访问器。如果是,则可能需要以某种方式对其进行编码。降低在问题链接的文章中,它提到了 Internet Explorer 如何解码某些 URL 参数,但其他浏览器可能不会。无论哪种方式,如果您一直将命令行指定为“%APPDATA%/MyProgram.exe”,从“C:/”开始可能更可靠,直到您可以解决该问题。

编辑:我刚刚注意到的另一件事,如果我的问题中的粘贴是正确的:我的注册表更改的工作版本将根目录的默认键设置为“URI :David Protocol”。注意“URI”,而不是“URL”。错误命名(很容易,因为另一个值被声明为“URL 协议(protocol)”)可能会破坏结果效果。

虽然您可能不必指定 DefaultIcon,但您可能需要注意不要引用无效图标。为了安全起见,我将我的设置专门指向一个 .ico 文件,而不是“.exe,1”

正如其他一些评论者所提到的,我不认为 EditFlags 真的是必需的,并且可能不相关。

但是,对这个附近的高投票答案的警告性反驳:这个。有效。 无需 UAC 访问权限。从我的研究开始,我个人会相信这样一种解释,即在没有 UAC 管理员提示等的情况下允许这样做太冒险了。但是,我花时间对其进行了测试,并且可以编写一个带有自动设置按钮的简单程序在 HKCU/Software/Classes 下,浏览器可以访问。然后,我在一位从未参与过我的任何研究(干净的环境)的开发人员的计算机上对其进行了测试,并且在没有任何管理员提示的情况下,它运行良好。 (显然,这个程序将只对当前用户可用)

(为了方便阅读,提醒一下:HKCU = HKEY_CURRENT_USER.HKCR = HKEY_CLASSES_ROOT.HKLM = HKEY_LOCAL_MACHINE)

任何可以写入用户 HKCU 注册表的东西都已经具有非管理员二进制访问权限。此外,所有浏览器都会在打开程序之前显示有关启动程序的警告消息(完全可以理解,因为它是本地代码)。其中一些甚至提供了您将要启动的可执行文件的完整文件夹路径。

我知道教程说要把 key 放在 HKCR 中;并且已知这来自 HKLM/Software。但是,值得在这里阅读整个故事:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475(v=vs.85).aspx

此 key 部分源自 HKCU 配置单元 - 事实上,用户的设置将覆盖本地计算机设置。当在 HKCR 中显示这种类型的 key 时,没有特别表明 HKLM 将覆盖 HKCU。

关于windows - 添加到 HKCU/Software/Classes 后无法通过 URI 启动 Windows 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434342/

相关文章:

python - 构建引用 .PYD 的 Python 包/模块的正确方法是什么?

windows - 无法从简单批处理中删除文件

java - 运行批处理文件时当前目录无效

c# - Microsoft.Win32.Registry 的 GetValue 不使用默认值

c++ - RegSetValueEx 函数写乱码

vb.net - 尝试读取或写入 protected 内存。这通常表明其他内存已损坏

php - 如何使用复选框删除数据库结果行

php - 迁移到新主机后无法访问 WordPress 仪表板

visual-studio-2010 - Visual Studio 以管理员身份运行快捷方式

c++ - SQLite Visual Studio 链接器错误