我目前正在使用ShellExecute“open”在用户的浏览器中打开一个URL,但在Win7和Vista中遇到一些麻烦,因为该程序作为一项服务运行升级。
当ShellExecute打开浏览器时,它似乎会读取“本地管理员”配置文件而不是用户的配置文件。因此,例如,如果键盘上的用户将Firefox作为其默认浏览器,则可能会打开IE(这是管理员的默认值)。
我知道“runas”动词可以用来提升,但是你怎么做呢?有没有办法在服务上的标准用户桌面上的默认浏览器中打开URL?
答案 0 :(得分:4)
ShellExecute将在与您运行的进程相同的会话和相同用户的上下文中执行该程序。
如果您想使用其他会话或用户令牌,可以使用CreateProcessAsUser Win32 API。
有多种方法可以获取用户令牌,例如,您可以调用Win32 API:
答案 1 :(得分:2)
经过一段时间的测试后,确定默认浏览器的最佳方法如下:
注意:这很奇怪,但这是真的...... 没有什么可说的应用程序是默认的应用程序 某些文件类型或网络协议,如'http'。确定默认值很重要 Web浏览器就是在开始菜单条目中注册的内容(请参阅下面的reg键)。 所以忘记所有的HKCR \ http,HKCU \ Software \ Classes \ http,HKLM \ Software \ Classes \ http和他们的朋友。
当然,您需要首先模拟登录用户。
如果此解决方案不起作用(如使用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有一个七步本机代码示例。如果您拥有这些服务,则无法帮助您提供服务 - 我同意您的服务不应该尝试以登录用户身份启动应用程序,尤其是因为可能没有应用程序。