繁体   English   中英

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

[英]Open default browser as standard user (C++)

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

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

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

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

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

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

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

注意:这很奇怪,但确实如此......没有什么可说的应用程序是某些文件类型或网络协议(如“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协议的处理程序。

要从服务实际启动默认浏览器,我们使用登录用户上下文在服务中使用额外进程。 此过程启动上述命令行(在平台上使用ShellExecute> = Vista)。 确保使用与默认用户相同的完整性级别(中等)(否则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 如果您拥有的话,将不会帮助您提供服务 - 我同意您的服务不应该尝试以登录用户身份启动应用程序,尤其是因为可能没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM