我目前正在使用ShellExecute "open"来打开用户浏览器中的URL,但在Win7和Vista中遇到了一些麻烦,因为程序作为服务运行时被提升了权限。当ShellExecute打开浏览器时,它似乎读取了“本地管理员”配置文件而不是用户的配置文件。例如,如果键盘上的用户将Firefox设置为默认浏览器,则可能会打开IE(这是管理员的默认浏览器)。我知道可以使用“runas”动词进行提升,但如何反过来做呢?有没有办法从服务中打开标准用户桌面上的默认浏览器中的URL?
ShellExecute将在与您正在运行的进程相同的会话和用户上下文中执行程序。
如果您想使用不同的会话或用户令牌,可以使用CreateProcessAsUser Win32 API。
有几种方法可以获取用户令牌,例如您可以调用以下Win32 API:
经过一段时间的测试,确定默认浏览器的最佳方法如下:
注意:虽然很奇怪,但是事实就是这样......
某个应用程序是否是某种文件类型或 Web 协议(如“http”)的默认应用程序无关紧要。决定默认 Web 浏览器的关键在于启动菜单条目中注册的内容(请参见下面的注册表键)。因此,请忘记所有 HKCR\http、HKCU\Software\Classes\http、HKLM\Software\Classes\http 及其相关项。
当然,您需要首先模拟登录用户。
如果此解决方案不起作用(例如 w2k),请使用 http 协议的处理程序。
要从服务中实际启动默认浏览器,我们使用一个额外的进程,在服务内部使用已登录用户上下文。此进程启动上述命令行(对于平台 >= Vista,使用 ShellExecute)。请务必使用与默认用户相同的完整性级别(中等),否则 IE 将无法工作,因为它使用 DDE。
希望对您有所帮助。