Как запустить процесс Internet Explorer от имени другого пользователя, a la / netonly?
Я пытаюсь запустить Internet Explorer от имени другого пользователя из нашего приложения WPF, чтобы, когда наши пользователи посещают (внутренний) веб-сайт, они молча аутентифицировались с помощью встроенной проверки подлинности Windows.
Мы не хотим запускать iexplore.exe как другой пользователь из-за странных проблем развертывания / среды, которые возникают, когда вы запускаете процесс в первый раз на компьютере, и он пытается настроить IE7/8 в первый раз. Хотя, если у вас есть решение для того, как отключить каждый IE установщик на каждой машине, я хотел бы услышать его.
Возвращаясь к моему предполагаемому вопросу. Я могу получить точное поведение подражания IE, которое я хочу* из командной строки, используя runas
(Спасибо https://serverfault.com/questions/70376/runas-domain-account-still-asks-for-password):
c:> runas /noprofile /netonly /user:MyDomainMyUser iexplore.exe
*примечание: Я не могу использовать runas
для нашего приложения WPF по многим причинам, но конечный результат - это то, что я хочу.
В любом случае, я хотел бы получить эквивалентный код C#, который делает runas /noprofile /netonly iexplore.exe
.
Я на полпути с P / Invoke на CreateProcessWithLogonW
. Вот что у меня есть:
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, это просто что-то, что я не делаю правильно в своем вызове CreateProcessWithLogonW()
.
Я заметил, что команда runas /netonly
работает только в том случае, если я добавляю переключатель /noprofile
., и это то, что ставит меня в тупик. Я понятия не имею, как установить эквивалент этого переключателя через P/Invoke в C#.
Помощь ценится с любым решением (решение "IE запускает мастер, когда я запускаю его в первый раз", или нахождение настройки weirdo P/Invoke, которую я пропускаю).
2 ответа:
Хорошо, я был очень, очень близок к этому. Волшебное исправление-добавление
-noframemerging
к iexplore.exe вызов, который...честно говоря, я не уверен, что он делает, он использует фразу "process frame", которая является удивительной и, возможно, что-то значит для вас.В любом случае, это, по-видимому, решено.
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);
CreateProcessWithLogonW требует, чтобы указанная учетная запись пользователя была разрешена для входа в систему в интерактивном режиме. Может ли это быть проблемой? Попробуйте CreateProcessAsUser функцию, если это работает.