C++ 以标准用户身份打开默认浏览器(C+;+;)
我目前正在使用ShellExecute“open”在用户浏览器中打开URL,但在Win7和Vista中遇到了一些问题,因为该程序作为服务运行 当ShellExecute打开浏览器时,它似乎读取“本地管理员”配置文件,而不是用户的配置文件。例如,如果用户在键盘上使用Firefox作为默认浏览器,它可能会打开IE(这是管理员的默认设置)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将在与正在运行的进程相同的
我知道“runas”动词可以用来提升,但你如何反过来呢?有没有办法从服务在标准用户桌面上的默认浏览器中打开URL?ShellExecute将在与正在运行的进程相同的会话和用户的上下文中执行程序 如果要使用不同的会话或用户令牌,可以使用Win32 API 有几种方法可以获取用户令牌,例如,您可以调用Win32 API:
- 如果你知道用户名和密码
- 对于任何给定的会话ID
- 如果您有另一个进程句柄
HTH.“是否有办法从服务在标准用户桌面上的默认浏览器中打开URL?”服务通常应避免与桌面交互(可能没有用户登录,它会打开安全漏洞等)。更好的设计通常是使用单独的服务和桌面应用程序(隐藏运行),并让服务和桌面应用程序通信(例如通过WCF)。然后桌面应用程序可以启动浏览器,桌面应用程序将以用户身份运行并使用其配置文件。CreateProcessAsUser()不允许您像ShellExecute()那样传递URL。我尝试过ImpersonalLoggedOnUser,但没有成功。您可以传递URL的命令行参数,然后执行所选的浏览器。如果需要,您也可以查看注册表以查看默认浏览器是什么。您也可以尝试使用ShellExecute的ImpersonalLoggeDonUser,我不确定它是否可以正常工作。不过,谢谢。我试着模仿,但没有成功。事实证明,来自注册表的浏览器也很困难。我已将此标记为“已回答”。我将根据你所说的继续努力,但我还没有一个明确的答案。再次感谢。这里有同样的问题:ShellExecuteEx的非音素化在服务中不起作用。但是CreateProcessAsUser确实做到了(有一些技巧)——但不幸的是,在某些平台(2008r2)上,浏览器并没有像ShellExec那样走到最前面。