如何以另一个用户la / netonly启动Internet Explorer进程?

时间:2012-08-21 23:35:27

标签: c# internet-explorer winapi pinvoke ntlm

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

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

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

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 /区域/密码/ IIS设置,这只是我在调用{ {1}}。

我注意到的一件事是CreateProcessWithLogonW()命令仅在我添加runas /netonly开关时才有效,这是让我感到困惑的事情。我不知道如何在C#中通过P / Invoke设置这个开关的等价物。

任何解决方案都可以获得帮助(解决“我第一次启动它时IE运行向导”,或者找到我缺少的怪异P / Invoke设置)。

2 个答案:

答案 0 :(得分:4)

好的,我非常接近。神奇的解决方法是将-noframemerging添加到iexplore.exe调用中,其中......老实说,我不确定它是做什么的,它使用了“过程框架”这个词很棒,也许对你来说意味着什么。 / p>

无论如何,这似乎已得到解决。

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);

答案 1 :(得分:0)

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