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

C++ 以标准用户身份打开默认浏览器(C+;+;),c++,windows-7,windows-vista,uac,shellexecute,C++,Windows 7,Windows Vista,Uac,Shellexecute,我目前正在使用ShellExecute“open”在用户浏览器中打开URL,但在Win7和Vista中遇到了一些问题,因为该程序作为服务运行 当ShellExecute打开浏览器时,它似乎读取“本地管理员”配置文件,而不是用户的配置文件。例如,如果用户在键盘上使用Firefox作为默认浏览器,它可能会打开IE(这是管理员的默认设置) 我知道“runas”动词可以用来提升,但你如何反过来呢?有没有办法从服务在标准用户桌面上的默认浏览器中打开URL?ShellExecute将在与正在运行的进程相同的

我目前正在使用ShellExecute“open”在用户浏览器中打开URL,但在Win7和Vista中遇到了一些问题,因为该程序作为服务运行

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


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

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

如果要使用不同的会话或用户令牌,可以使用Win32 API

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

  • 如果你知道用户名和密码
  • 对于任何给定的会话ID
  • 如果您有另一个进程句柄

Aaron Margosis在上有一个七步本机代码示例。如果您的服务是这样的话,它不会对您有所帮助-我同意您的服务不应该尝试以登录用户的身份启动应用程序,尤其是因为可能没有应用程序。

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

注意:这很奇怪,但却是真的。。。 它没有说明应用程序是的默认应用程序 某些文件类型或web协议,如“http”。确定默认值有什么关系 web浏览器就是在“开始”菜单项中注册的浏览器(请参见下面的注册表项)。 所以,忘掉所有的HKCR\http、HKCU\Software\Classes\http、HKLM\Software\Classes\http和他们的朋友吧

  • 阅读“HKEY\U当前用户\软件\客户端\启动Internet”
  • 从“HKEY\U LOCAL\U MACHINE\Software\Clients\StartMenuInternet\\shell\open\command”读取命令行
  • 截断“.exe”之后的命令行
  • 当然,您首先需要模拟为登录用户

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

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


    HTH.

    “是否有办法从服务在标准用户桌面上的默认浏览器中打开URL?”服务通常应避免与桌面交互(可能没有用户登录,它会打开安全漏洞等)。更好的设计通常是使用单独的服务和桌面应用程序(隐藏运行),并让服务和桌面应用程序通信(例如通过WCF)。然后桌面应用程序可以启动浏览器,桌面应用程序将以用户身份运行并使用其配置文件。CreateProcessAsUser()不允许您像ShellExecute()那样传递URL。我尝试过ImpersonalLoggedOnUser,但没有成功。您可以传递URL的命令行参数,然后执行所选的浏览器。如果需要,您也可以查看注册表以查看默认浏览器是什么。您也可以尝试使用ShellExecute的ImpersonalLoggeDonUser,我不确定它是否可以正常工作。不过,谢谢。我试着模仿,但没有成功。事实证明,来自注册表的浏览器也很困难。我已将此标记为“已回答”。我将根据你所说的继续努力,但我还没有一个明确的答案。再次感谢。这里有同样的问题:ShellExecuteEx的非音素化在服务中不起作用。但是CreateProcessAsUser确实做到了(有一些技巧)——但不幸的是,在某些平台(2008r2)上,浏览器并没有像ShellExec那样走到最前面。