UseShellExecuteをTrueに設定する必要があるのはいつですか?


134
//
// Summary:
//     Gets or sets a value indicating whether to use the operating system shell
//     to start the process.
//
// Returns:
//     true to use the shell when starting the process; otherwise, the process is
//     created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }

新しいプロセスを生成する場合、UseShellExecuteをTrueに設定する必要があるのはいつですか?

回答:


202

UseShellExecuteブール型プロパティはウィンドウの使用に関連しているのShellExecute VS機能のCreateProcess機能-短い答えは場合ということですUseShellExecute本当ですその後、Processクラスが使用するShellExecute機能を、それ以外の場合は使用されますCreateProcess

より長い答えは、ShellExecute関数は指定されたプログラムまたはファイルを開くために使用されるということです-実行するコマンドを実行ダイアログに入力して[OK]をクリックするのとほぼ同じです。

  • ブラウザーが何であるかを知らなくても、デフォルトのブラウザーを使用して.htmlファイルまたはWebを開きます。
  • Wordのインストールパスを知らなくてもWord文書を開く
  • でコマンドを実行します PATH

例えば:

Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();

非常に使いやすく、用途が広く、強力ですが、いくつかの欠点があります。

  • 標準入力/出力/エラーハンドルをリダイレクトすることはできません

  • 子プロセスのセキュリティ記述子(またはその他の素晴らしいもの)を指定することはおそらく不可能です

  • 実際に何が実行されるかについて想定すると、セキュリティの脆弱性が発生する可能性があります。

     // If there is an executable called "notepad.exe" somewhere on the path 
     // then this might not do what we expect
     p.StartInfo.FileName = "notepad.exe";
     p.Start();

CreateProcessプロセスを開始するはるかに正確な方法です-パスを検索せず、子プロセスの標準入力または出力をリダイレクトできます(特に)。欠点CreateProcessしかし、私は意志の仕事(それを試してみて、参照)の上に与えた3例のいずれもありません。

要約すると、次の場合はUseShellExecutefalseに設定する必要があります。

  • 標準入力/出力/エラーをリダイレクトしたい(これが最も一般的な理由です)
  • 実行可能ファイルのパスを検索したくない(たとえば、セキュリティ上の理由から)

UseShellExecuteに、実行可能ファイルへのパスを明示的に指定するのではなく、ドキュメント、URL、バッチファイルなどを開く場合は、true を維持する必要があります。


2
素晴らしいものですが、(ShellExecuteを使用して)「標準入力/出力/エラーハンドルをリダイレクトすることはできない」と書きます<-確かにそれは正しくないか不正確です。useShellExecuteをtrueに設定しても、実際には実行できませんが processStartInfo.RedirectStandardOutput=true、実行することで標準出力をリダイレクトできるように思えます process.Arguments= "cmd /c dir >c:\\crp\\a.a"。同様に、実行ダイアログボックスから実行できますcmd /c dir>c:\crp\a.a
barlop

4
また、たとえばUseShellExecute=falseCreateProcessの場合はパスをチェックしないと言いますが、「UseShellExecute = false」を実行した場合でも、つまりパスをチェックしていない場合は、process.FileName = "cmd.exe"が機能するため、 c:\ windows \ system32を確認します。そして、cmd.exeをc:\ windowsにコピーし、それにcmmmd.exeという名前を付けると、私はprocess1.FileName = "cmmmd.exe"を実行してc:\ windowsをチェックし、パスをチェックしているように見える、またはいくつかのディレクトリ。
barlop

2
MSDNのドキュメントは、@ barlopに同意します。「UseShellExecuteがfalseの場合、FileNameプロパティは、実行可能ファイルへの完全修飾パス、またはシステムがPATH環境変数で指定されたフォルダー内で検索しようとする単純な実行可能ファイル名のいずれかになります。」
ボブ

に設定UseShellExecuteするtrueことで、(呼び出しプロセスでのみ作成された)環境変数を共有できました。非常に便利
ミトキンス2018

14

私は主に非実行可能ファイルについて考えます。たとえば、.htmlファイルを開こうとしている場合、に設定UseShellExecuteする必要があり、ユーザーがデフォルトとして設定しているブラウザでtrueを開く.html場合などです。


12

MSDNから:

このプロパティをfalseに設定すると、入力、出力、およびエラーストリームをリダイレクトできます。

UserNameプロパティがnullまたは空の文字列でない場合、UseShellExecuteはfalseでなければなりません。そうでない場合、Process.Start(ProcessStartInfo)メソッドが呼び出されたときにInvalidOperationExceptionがスローされます。

オペレーティングシステムシェルを使用してプロセスを開始すると、任意のドキュメント(デフォルトのオープンアクションを持つ実行可能ファイルに関連付けられた登録済みのファイルタイプ)を開始し、プロセスコンポーネントを使用して、印刷などのファイルの操作を実行できます。UseShellExecuteがfalseの場合、Processコンポーネントで実行可能ファイルのみを開始できます。

ErrorDialogプロパティをtrueに設定する場合、UseShellExecuteはtrueでなければなりません。


0

現在のアプリケーション実行可能ウィンドウを非表示にする場合は、UseShellExecuteをtrueに設定する必要があります


0

パスにスペースまたはその他の特殊(つまりアクセント付き)文字が含まれている場合、CreateProcess(UseShellExecute = false)は短いファイル名( "DOS" 8.3表記)を使用しているようで、ShellExecute(UseShellExecute = true)は長いファイル名を使用します。したがって、UseShellExecute = falseを使用する場合は、ディレクトリとファイルの名前を必ず8.3の名前に変換してください(google ".net 8.3のファイル名を取得する方法")。(Windows 7やNTFSでテストされたWindowsのバージョンやファイルシステムがこのように実行することは、はっきりとはわかりません。)


それは単に空間で道を切っているだけなのでしょうか?これを解決するには、「パス/プログラム名」を引用符で囲みます。
gbarry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.