以标准用户身份打开默认浏览器 (C++)

4
我目前正在使用ShellExecute "open"来打开用户浏览器中的URL,但在Win7和Vista中遇到了一些麻烦,因为程序作为服务运行时被提升了权限。当ShellExecute打开浏览器时,它似乎读取了“本地管理员”配置文件而不是用户的配置文件。例如,如果键盘上的用户将Firefox设置为默认浏览器,则可能会打开IE(这是管理员的默认浏览器)。我知道可以使用“runas”动词进行提升,但如何反过来做呢?有没有办法从服务中打开标准用户桌面上的默认浏览器中的URL?

3
有没有一种方法可以从服务中打开标准用户桌面上的默认浏览器的URL?服务通常应避免与桌面进行交互(可能没有用户登录,会打开安全漏洞等)。更好的设计通常是使用独立的服务和桌面应用程序(隐藏运行),并让服务和桌面应用程序进行通信(例如通过WCF)。然后桌面应用程序可以启动浏览器,并且桌面应用程序将作为用户运行并使用其配置文件。 - itowlson
3个回答

5

ShellExecute将在与您正在运行的进程相同的会话和用户上下文中执行程序。

如果您想使用不同的会话或用户令牌,可以使用CreateProcessAsUser Win32 API。

有几种方法可以获取用户令牌,例如您可以调用以下Win32 API:


CreateProcessAsUser() 不允许像 ShellExecute() 那样传递 URL。 我尝试了 ImpersonateLoggedOnUser,但没有成功。 - Disco
你可以传递一个命令行参数作为URL,并执行所选择的浏览器。如果需要,你还可以查看注册表以了解默认浏览器是什么。 - Brian R. Bondy
你也可以尝试使用ShellExecute和ImpersonateLoggedOnUser,但我不能百分之百确定它是否有效。http://msdn.microsoft.com/en-us/library/aa378612(VS.85).aspx - Brian R. Bondy
1
谢谢。我尝试了模拟登录,但没有成功。从注册表中获取浏览器也很困难。我已将此标记为“已回答”。根据您的建议,我会继续努力解决问题,但目前还没有确定的答案。再次感谢。 - Disco
@fmuecke: 尝试最小化/还原。 - Brian R. Bondy
显示剩余2条评论

2

经过一段时间的测试,确定默认浏览器的最佳方法如下:

注意:虽然很奇怪,但是事实就是这样......

某个应用程序是否是某种文件类型或 Web 协议(如“http”)的默认应用程序无关紧要。决定默认 Web 浏览器的关键在于启动菜单条目中注册的内容(请参见下面的注册表键)。因此,请忘记所有 HKCR\http、HKCU\Software\Classes\http、HKLM\Software\Classes\http 及其相关项。

  1. 从 "HKEY_CURRENT_USER\Software\Clients\StartMenuInternet" 中读取
  2. 从 "HKEY_LOCAL_MACHINE\Software\Clients\StartMenuInternet\\shell\open\command" 中读取命令行
  3. 在 ".exe" 后截断命令行

当然,您需要首先模拟登录用户。

如果此解决方案不起作用(例如 w2k),请使用 http 协议的处理程序。

要从服务中实际启动默认浏览器,我们使用一个额外的进程,在服务内部使用已登录用户上下文。此进程启动上述命令行(对于平台 >= Vista,使用 ShellExecute)。请务必使用与默认用户相同的完整性级别(中等),否则 IE 将无法工作,因为它使用 DDE。

希望对您有所帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接