2

WPFアプリから別のユーザーとしてInternetExplorerを起動しようとしています。これにより、ユーザーが(内部)Webサイトにアクセスしたときに、統合Windows認証を介してサイレントに認証されます。

コンピューターでプロセスを初めて起動し、IE7 / 8を初めてセットアップしようとしたときに発生する奇妙な展開/環境の問題のため、iexplore.exeを他のユーザーとして起動したくありません。ただし、すべてのマシンですべてのIEインストーラーをミュートする方法についての解決策があれば、ぜひ聞いてみてください。

私の意図した質問に戻ります。( https://serverfault.com/questions/70376/runas-domain-account-still-asks-for-passwordrunasに感謝)を使用して、コマンドプロンプトから必要な正確なIEのなりすまし動作を取得できます* 。

c:\> runas /noprofile /netonly /user:MyDomain\MyUser 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コマンドを使用してユーザーになりすますことができるので、認証の失敗はIE/ゾーン/パスワード/IIS設定ではなく、への呼び出しで正しく行っていないことであると98%確信していますCreateProcessWithLogonW()

私が気づいたことの1つはrunas /netonly、スイッチを追加した場合にのみコマンドが機能すること/noprofileです。これは私を困惑させています。C#でP/Invokeを介してこのスイッチに相当するものを設定する方法がわかりません。

どちらの解決策でも助けていただければ幸いです(「IEはウィザードを最初に起動したときにウィザードを実行する」を解決するか、欠落している奇妙なP / Invoke設定を見つけます)。

4

2 に答える 2

4

さて、私は非常に近かった。魔法の修正は-noframemergingiexplore.exe呼び出しに追加されています。これは、正直なところ、それが何をするのかわかりません。「プロセスフレーム」というフレーズを使用しています。これは素晴らしいもので、おそらくあなたにとって何か意味があります。

いずれにせよ、これは解決されたようです。

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);
于 2012-08-22T21:06:23.757 に答える
0

CreateProcessWithLogonWでは、指定されたユーザーアカウントがインタラクティブにログオンできるようにする必要があります。それは問題でしょうか?それが機能する場合は、 CreateProcessAsUser関数を試してください。

于 2012-08-22T00:48:03.690 に答える