我目前正在使用 ShellExecute "open" 在用户浏览器中打开 URL,但在 Win7 和 Vista 中遇到了一些麻烦,因为程序作为服务运行提升。
当 ShellExecute 打开浏览器时,它似乎读取的是“本地管理员”配置文件而不是用户的配置文件。例如,如果使用键盘的用户将 Firefox 作为其默认浏览器,它可能会打开 IE(这是管理员的默认浏览器)。
我知道“runas”动词可以用来提升,但是你怎么做呢?有没有办法通过服务在标准用户桌面上的默认浏览器中打开 URL?
我目前正在使用 ShellExecute "open" 在用户浏览器中打开 URL,但在 Win7 和 Vista 中遇到了一些麻烦,因为程序作为服务运行提升。
当 ShellExecute 打开浏览器时,它似乎读取的是“本地管理员”配置文件而不是用户的配置文件。例如,如果使用键盘的用户将 Firefox 作为其默认浏览器,它可能会打开 IE(这是管理员的默认浏览器)。
我知道“runas”动词可以用来提升,但是你怎么做呢?有没有办法通过服务在标准用户桌面上的默认浏览器中打开 URL?
ShellExecute 将在与您正在运行的进程相同的会话和用户的上下文中执行程序。
如果您想使用不同的会话或用户令牌,您可以使用CreateProcessAsUser Win32 API。
获取用户令牌的方法有多种,例如可以调用 Win32 API:
经过一段时间的测试,确定默认浏览器的最佳方法如下:
注意:这很奇怪,但确实是这样……毫无疑问,应用程序是某些文件类型或 Web 协议(如“http”)的默认应用程序。确定默认 Web 浏览器的关键在于开始菜单条目中注册的内容(参见下面的 reg 键)。所以忘记所有 HKCR\http、HKCU\Software\Classes\http、HKLM\Software\Classes\http 和他们的朋友。
当然,您需要先冒充登录用户。
如果此解决方案不起作用(如 w2k),请使用 http 协议的处理程序。
为了真正从服务启动默认浏览器,我们使用了一个额外的进程,该进程位于服务中,使用登录的用户上下文。此过程启动上述命令行(在平台 >= Vista 上使用 ShellExecute)。确保使用与默认用户相同的完整性级别(中等)(否则 IE 将无法工作,因为它使用 DDE)。
HTH。
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。如果这是您所拥有的,则不会从您的服务中为您提供帮助-我同意您的服务不应该尝试以登录用户身份启动应用程序,尤其是因为可能没有应用程序。