我正在尝试从我们的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设置)。
答案 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。