5

我正在尝试在 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} 打开此帮助应用程序。此地址中指定的协议无效。确保地址正确,然后重试。

对于非管理员设置,我是否缺少注册表的某些部分?这是我的更改作为 .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\""
4

2 回答 2

2

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

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

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

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

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

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

(为方便阅读,提示:HKCU = HKEY_CURRENT_USER.HKCR = HKEY_CLASSES_ROOT.HKLM = HKEY_LOCAL_MACHINE)

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

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

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

此密钥部分源自 HKCU 配置单元 - 事实上,用户的设置将覆盖本地机器设置。在 HKCR 中显示这种类型的键时,没有具体说明 HKLM 将覆盖 HKCU。

于 2014-05-12T13:53:58.007 回答
-1

您不能忽略 MSDN 文章告诉您的内容,在 HKCR 密钥中注册协议处理程序是一项硬性要求。

有一个很好的理由,在文章中也相当明确地指出,协议处理程序是危险的。它们允许任意网页在您的机器上启动程序。它们甚至可以在 Store 应用程序中工作,这是另一个高度安全的运行时环境示例,它在沙箱内运行代码以阻止危险操作。

记录 HKCR 并没有太大帮助解决这个问题,它是用于 16 位代码的 appcompat,而今天是一个别名。显示 HKCU 和 HKLM 键的合并视图。HKLM 键与 HKCU 键不同,写入键值需要提升。只有可以获取提升的安全令牌的程序才能创建新值或更改它们,通常通过 UAC 提示获得。HKCU 密钥的问题是任何程序都可以在那里写入密钥而无需提升。如果可以在 HKCU 密钥中注册协议处理程序,这将打开一个安全漏洞。所以这行不通,urlmon 根本不查看 HKCU 密钥来查找协议处理程序。

于 2014-05-11T15:58:05.247 回答