2 votes

Comment puis-je lancer un processus Internet Explorer en tant qu'autre utilisateur, un peu comme /netonly ?

Je tente de lancer Internet Explorer en tant qu'autre utilisateur depuis notre application WPF, afin que lorsque nos utilisateurs visitent le site Web (interne), ils s'authentifient automatiquement via l'authentification Windows intégrée.

Nous ne voulons pas lancer iexplore.exe en tant qu'autre utilisateur en raison de problèmes étranges de déploiement/environnement qui surviennent lorsque vous lancez un processus pour la première fois sur un ordinateur et qu'il tente de configurer IE7/8 pour la première fois. Cependant, si vous avez une solution pour désactiver tous les installateurs IE sur chaque machine, j'aimerais l'entendre.

Revenons à ma question initiale. Je parviens à obtenir le comportement exact d'imitation d'IE que je veux* depuis l'invite de commandes en utilisant runas (grâce à https://serverfault.com/questions/70376/runas-domain-account-still-asks-for-password):

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

*note: Je ne peux pas utiliser runas pour notre application WPF pour de nombreuses raisons, mais le résultat final est ce que je veux.

En tout cas, j'aimerais avoir le code équivalent en C# qui exécute un runas /noprofile /netonly iexplore.exe.

J'en suis à mi-chemin avec P/Invoke sur CreateProcessWithLogonW. Voici ce que j'ai:

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

Cela lance avec succès Internet Explorer, mais ne semble pas imiter l'utilisateur du tout. Je parviens à imiter l'utilisateur via la commande runas, donc je suis sûr à 98% que l'échec de l'authentification n'est pas un paramètre IE/zone/mot de passe/IIS, c'est juste quelque chose que je ne fais pas correctement dans mon appel à CreateProcessWithLogonW().

Une chose que j'ai remarquée est que la commande runas /netonly ne fonctionne que si j'ajoute l'option /noprofile, ce qui me pose problème. Je ne sais pas du tout comment définir l'équivalent de cette option via P/Invoke en C#.

Je suis reconnaissant pour toute aide avec l'une ou l'autre solution (résoudre le problème "IE lance un assistant lorsque je le lance pour la première fois" ou trouver l'option P/Invoke bizarre que je manque).

4voto

Peter Seale Points 2233

D'accord, j'étais très très proche. La solution magique est d'ajouter -noframemerging à l'appel de iexplore.exe, ce qui... honnêtement, je ne suis pas sûr de ce que cela fait, il utilise l'expression "process frame" ce qui est génial et peut-être signifie quelque chose pour vous.

En tout cas, cela semble être résolu.

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

0voto

Jacob Seleznev Points 4761

CreateProcessWithLogonW nécessite que le compte utilisateur spécifié soit autorisé à se connecter de manière interactive. Est-ce que cela pourrait poser problème? Essayez la fonction CreateProcessAsUser si cela fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X