【问题标题】:How can I launch an Internet Explorer process as another user, a la /netonly?如何以其他用户身份启动 Internet Explorer 进程,例如 /netonly?
【发布时间】:2012-08-21 23:35:27
【问题描述】:

我正在尝试从我们的 WPF 应用程序以另一个用户身份启动 Internet Explorer,这样当我们的用户访问(内部)网站时,他们会通过集成 Windows 身份验证静默进行身份验证。

我们不希望以其他用户身份启动 iexplore.exe,因为当您在计算机上首次启动进程并尝试设置 IE7/8 时会出现奇怪的部署/环境问题.不过,如果你有一个解决方案来让每台机器上的每个 IE 安装程序静音,我很乐意听到。

回到我的预期问题。我可以使用runas(感谢https://serverfault.com/questions/70376/runas-domain-account-still-asks-for-password)从命令提示符中获得我想要的确切IE模拟行为:

c:\> runas /noprofile /netonly /user:MyDomain\MyUser iexplore.exe

*注意:出于多种原因,我不能将runas 用于我们的 WPF 应用程序,但最终结果正是我想要的。

无论如何,我想要执行 runas /noprofile /netonly iexplore.exe 的 C# 等效代码。

我在CreateProcessWithLogonW 上使用 P/Invoke 进行到一半。这就是我所拥有的:

uint LOGON_NETCREDENTIALS_ONLY = 2;
var lpStartupInfo = new CreateProcessWithLogonW_PInvoke.STARTUPINFO();
CreateProcessWithLogonW_PInvoke.PROCESS_INFORMATION processInformation;

CreateProcessWithLogonW_PInvoke.CreateProcessWithLogonW(
                userName,
                domain,
                pw,
                LOGON_NETCREDENTIALS_ONLY,
                null,
                commandLine,
                0,
                null,
                null,
                ref lpStartupInfo,
                out processInformation);

这成功启动了 Internet Explorer,但似乎根本没有模拟用户。我可以通过 runas 命令模拟用户,所以我 98% 确定身份验证失败不是 IE/zone/password/IIS 设置,这只是我在调用 @ 时没有做对的事情987654329@.

我注意到的一件事是runas /netonly 命令只有在我添加/noprofile 开关时才有效,这让我很困惑。我不知道如何在 C# 中通过 P/Invoke 设置此开关的等效项。

感谢您对任一解决方案的帮助(解决“当我第一次启动 IE 时运行向导”,或者找到我缺少的怪异 P/Invoke 设置)。

【问题讨论】:

  • 自从我使用 Windows 已经有一段时间了,但是为什么不让浏览器在使用该应用程序的用户下启动——我的(诚然不是在考虑而)理解是它会正常工作 - 浏览器会将登录用户的加密凭据发送到服务器,并且只有在失败时才请求身份验证。
  • 哦,我明白了。用户可能是必须通过IE设置BS的新用户,对吗? (很抱歉第一次读错了)
  • 这对预配置 IE 有帮助吗? symantec.com/connect/articles/…
  • 考虑到奇怪(以及 IE 已经打开时发生的另一个问题),我可能只是尝试解决 IE 安装程序问题,而不是启动进程“/netonly”。

标签: c# internet-explorer winapi pinvoke ntlm


【解决方案1】:

好的,我非常接近。神奇的修复是在 iexplore.exe 调用中添加 -noframemerging,这...老实说,我不确定它是做什么的,它使用了“进程框架”这个短语,这很棒,也许对你来说意味着什么。

无论如何,这似乎已经解决了。

var arguments = "-noframemerging " + url;
var pathToIExploreExe = GetFullPathToIExploreExe();
var commandLine = string.Format("\"{0}\" {1}", pathToIExploreExe, arguments);

uint LOGON_NETCREDENTIALS_ONLY = 2;
var lpStartupInfo = new CreateProcessWithLogonW_PInvoke.STARTUPINFO();
CreateProcessWithLogonW_PInvoke.PROCESS_INFORMATION processInformation;

CreateProcessWithLogonW_PInvoke.CreateProcessWithLogonW(
            userName,
            domain,
            pw,
            LOGON_NETCREDENTIALS_ONLY,
            null,
            commandLine,
            0,
            null,
            null,
            ref lpStartupInfo,
            out processInformation);

【讨论】:

  • 对于 -noframemerging 的解释实际上确实在 MSDN 上看到了 herehere... 从 IE 8 开始,它的含义与以前的 IE 版本中的 -nomerge 相同...
【解决方案2】:

CreateProcessWithLogonW 要求必须允许指定的用户帐户以交互方式登录。会不会是个问题?如果可行,请尝试 CreateProcessAsUser function

【讨论】:

  • 我对交互式流程要求没意见。我刚刚阅读了 CreateProcessAsUser 文档,看起来我将有效地使用新用户(交互式或非交互式)创建一个进程,这将创建配置文件并运行 IE7/8/9 首次运行向导,这让我回到了我的问题。
  • 只是一个观察。如果设置了 StartInfo 实例的 UserName 和 Password 属性,则无需在 C# 中使用 CreateProcessWithLogonW,因为 Process.Start method 在内部调用它。
  • 我认为您不了解LOGON_NETCREDENTIALS_ONLY 的意义,这只是CreateProcessWithLogonW 的作用。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 2013-09-18
  • 2012-01-17
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多