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

时间:2010-02-22 02:19:44

标签: c++ windows-7 windows-vista uac shellexecute

我目前正在使用ShellExecute“open”在用户的浏览器中打开一个URL,但在Win7和Vista中遇到一些麻烦,因为该程序作为一项服务运行升级。

当ShellExecute打开浏览器时,它似乎会读取“本地管理员”配置文件而不是用户的配置文件。因此,例如,如果键盘上的用户将Firefox作为其默认浏览器,则可能会打开IE(这是管理员的默认值)。

我知道“runas”动词可以用来提升,但是你怎么做呢?有没有办法在服务上的标准用户桌面上的默认浏览器中打开URL?

3 个答案:

答案 0 :(得分:4)

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

如果您想使用其他会话或用户令牌,可以使用CreateProcessAsUser Win32 API。

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

答案 1 :(得分:2)

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

注意:这很奇怪,但这是真的...... 没有什么可说的应用程序是默认的应用程序 某些文件类型或网络协议,如'http'。确定默认值很重要 Web浏览器就是在开始菜单条目中注册的内容(请参阅下面的reg键)。 所以忘记所有的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”
  4. 之后截断命令行

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

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

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

    HTH。

答案 2 :(得分:0)

Aaron Margosis在http://blogs.msdn.com/aaron_margosis/archive/2009/06/06/faq-how-do-i-start-a-program-as-the-desktop-user-from-an-elevated-app.aspx有一个七步本机代码示例。如果您拥有这些服务,则无法帮助您提供服务 - 我同意您的服务不应该尝试以登录用户身份启动应用程序,尤其是因为可能没有应用程序。