4

我目前正在使用 ShellExecute "open" 在用户浏览器中打开 URL,但在 Win7 和 Vista 中遇到了一些麻烦,因为程序作为服务运行提升。

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

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

4

3 回答 3

5

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

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

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

于 2010-02-22T02:22:53.877 回答
2

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

注意:这很奇怪,但确实是这样……毫无疑问,应用程序是某些文件类型或 Web 协议(如“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”之后截断命令行

当然,您需要先冒充登录用户。

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

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

HTH。

于 2010-10-13T11:50:12.007 回答
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。如果这是您所拥有的,则不会从您的服务中为您提供帮助-我同意您的服务不应该尝试以登录用户身份启动应用程序,尤其是因为可能没有应用程序。

于 2010-02-22T12:14:13.047 回答