Как запустить процесс 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 2

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 функцию, если это работает.