我目前使用ShellExecute“open”在用户的浏览器中打开一个URL,但在Win7和Vista中遇到了一些麻烦,因为该程序作为服务提升。以标准用户打开默认浏览器(C++)
当ShellExecute打开浏览器时,它似乎读取“本地管理员”配置文件而不是用户的配置文件。例如,如果键盘上的用户将Firefox作为默认浏览器,则可能会打开IE(这是管理员的默认设置)。
我知道“runas”动词可以用来提升,但是你怎么做到的呢?有没有办法在服务的标准用户桌面上的默认浏览器中打开URL?
我目前使用ShellExecute“open”在用户的浏览器中打开一个URL,但在Win7和Vista中遇到了一些麻烦,因为该程序作为服务提升。以标准用户打开默认浏览器(C++)
当ShellExecute打开浏览器时,它似乎读取“本地管理员”配置文件而不是用户的配置文件。例如,如果键盘上的用户将Firefox作为默认浏览器,则可能会打开IE(这是管理员的默认设置)。
我知道“runas”动词可以用来提升,但是你怎么做到的呢?有没有办法在服务的标准用户桌面上的默认浏览器中打开URL?
ShellExecute将在与您正在运行的进程相同的会话和相同用户的上下文中执行该程序。
如果您想使用不同的会话或用户令牌,则可以使用CreateProcessAsUser Win32 API。
有几种方法获取用户令牌,例如,你可以调用Win32 API:
CreateProcessAsUser()不允许您像ShellExectute()那样传递URL。我试过ImpersonateLoggedOnUser,但没有运气。 – Disco 2010-02-23 14:33:16
您可以传递URL的命令行参数,并执行所选的浏览器。如果你想要的话,你可以在注册表中查看默认浏览器的内容。 – 2010-02-23 14:59:58
你也可以尝试与ShellExecute ImpersonateLoggedOnUser,我不是100%确定它是否会工作,虽然http://msdn.microsoft.com/en-us/library/aa378612(VS.85).aspx – 2010-02-23 16:36:40
亚伦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七步原生代码示例。如果这是您的服务,将无法帮助您从服务中获益 - 我同意您的服务不应该尝试以登录用户的身份启动应用程序,尤其是因为可能没有该应用程序。
一段时间的测试后,确定默认浏览器的最好办法是:
注:奇怪,但它是真实的...... 这也没什么好说的,一个应用程序是默认的应用程序为 某些文件类型或Web协议,如'http'。确定默认 网络浏览器的重要性正是在开始菜单项中注册的内容(请参阅下面的注册表项)。因此,忘记所有HKCR \ http,HKCU \ Software \ Classes \ http,HKLM \ Software \ Classes \ http及其朋友。
当然,您需要首先模仿登录用户。
如果此解决方案不起作用(如使用w2k),请使用http协议的处理程序。
要真正从服务启动默认浏览器,我们使用登录的用户上下文中的服务中的额外进程。此过程启动上述命令行(在平台> = Vista上使用ShellExecute)。请确保使用与默认用户相同的完整性级别(中等)(否则IE将无法使用,因为它使用DDE)。
HTH。
“有没有办法在服务的标准用户桌面上的默认浏览器中打开URL?”服务通常应避免与桌面交互(可能没有用户登录,它会打开安全漏洞等)。更好的设计通常是针对单独的服务和桌面应用程序(运行隐藏),并使服务和桌面应用程序通信(例如,通过WCF)。然后桌面应用程序可以启动浏览器 - 桌面应用程序将以用户身份运行并使用其个人资料。 – itowlson 2010-02-22 02:52:54