Kapan kita perlu mengatur UseShellExecute ke 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; }

Jika kita menelurkan proses baru, kapan kita perlu mengatur UseShellExecute ke True?

Jawaban:


202

The UseShellExecuteproperti boolean berkaitan dengan penggunaan jendela ShellExecute fungsi vs CreateProcess fungsi - jawaban singkat adalah bahwa jika UseShellExecutebenar maka Processkelas akan menggunakan ShellExecutefungsi, selain itu akan digunakan CreateProcess.

Jawaban yang lebih panjang adalah bahwa ShellExecutefungsi tersebut digunakan untuk membuka program atau file yang ditentukan - kira-kira sama dengan mengetikkan perintah yang akan dieksekusi ke dalam dialog run dan mengklik OK, yang berarti bahwa itu dapat digunakan untuk (misalnya):

  • Buka file .html atau web menggunakan browser default tanpa perlu tahu apa itu browser,
  • Buka dokumen kata tanpa perlu tahu apa jalur instalasi untuk Word
  • Jalankan perintah apa pun di PATH

Sebagai contoh:

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

Sangat mudah digunakan, serbaguna dan kuat namun dilengkapi dengan beberapa kelemahan:

  • Tidak mungkin untuk mengarahkan ulang pegangan input / output / kesalahan standar

  • Tidak mungkin untuk menentukan penjelas keamanan (atau hal keren lainnya) untuk proses anak

  • Ada potensi untuk memperkenalkan kerentanan keamanan jika Anda membuat asumsi tentang apa yang sebenarnya akan dijalankan:

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

CreateProcessadalah cara yang jauh lebih tepat untuk memulai suatu proses - itu tidak mencari jalan dan memungkinkan Anda untuk mengarahkan input atau output standar dari proses anak (antara lain). Namun kelemahannya CreateProcessadalah bahwa tidak satu pun dari 3 contoh yang saya berikan di atas akan berfungsi (coba dan lihat).

Singkatnya, Anda harus mengatur UseShellExecuteke false jika:

  • Anda ingin mengarahkan input / output / kesalahan standar (ini adalah alasan paling umum)
  • Anda tidak ingin mencari jalur yang dapat dieksekusi (mis. Karena alasan keamanan)

Sebaliknya, Anda harus tetap UseShellExecutebenar jika Anda ingin membuka dokumen, url atau file batch dll ... daripada harus secara eksplisit memberikan path ke file executable.


2
Hebat, tetapi Anda menulisnya (dengan ShellExecute), "Ini [Anda klaim] tidak mungkin untuk mengarahkan ulang input / output / handle standar" "- Tentunya itu tidak benar atau tidak akurat. Bahkan dengan useShellExecute disetel ke true, sementara memang Anda tidak dapat melakukannya processStartInfo.RedirectStandardOutput=true, menurut saya Anda masih dapat mengarahkan output standar dengan melakukan process.Arguments= "cmd /c dir >c:\\crp\\a.a". Demikian juga dari kotak dialog run yang dapat Anda lakukancmd /c dir>c:\crp\a.a
barlop

4
juga, Anda mengatakan bahwa ketika UseShellExecute=falseyaitu CreateProcess, tidak akan memeriksa lintasan, tapi saya melihat bahwa bahkan ketika saya melakukan "UseShellExecute = false" yaitu seharusnya tidak memeriksa lintasan, maka proses.FileName = "cmd.exe" berfungsi jadi memeriksa c: \ windows \ system32. Dan jika saya menyalin cmd.exe ke c: \ windows dan beri nama cmmmd.exe maka saya melakukan process1.FileName = "cmmmd.exe" yang berfungsi juga jadi memeriksa c: \ windows jadi sepertinya sedang memeriksa path, atau beberapa direktori.
barlop

2
Dokumen MSDN setuju dengan @barlop: "Ketika UseShellExecute salah, properti FileName dapat berupa jalur yang sepenuhnya memenuhi syarat untuk dieksekusi, atau nama yang dapat dieksekusi sederhana yang sistem akan coba temukan dalam folder yang ditentukan oleh variabel lingkungan PATH."
Bob

Dengan menetapkan UseShellExecuteke trueSaya dapat berbagi variabel lingkungan (yang hanya dibuat dalam proses panggilan). Sangat berguna
Mitkins

14

Saya pikir sebagian besar untuk non-executable. Sebagai contoh jika mencoba untuk membuka .htmlfile, jika Anda harus set UseShellExecuteke truedan yang akan membuka .htmldi browser yang ditetapkan sebagai default oleh pengguna.


12

Dari MSDN :

Mengatur properti ini ke false memungkinkan Anda untuk mengarahkan input, output, dan stream kesalahan.

UseShellExecute harus salah jika properti UserName bukan null atau string kosong, atau InvalidOperationException akan dilemparkan ketika metode Process.Start (ProcessStartInfo) dipanggil.

Ketika Anda menggunakan shell sistem operasi untuk memulai proses, Anda dapat memulai dokumen apa pun (yang merupakan tipe file terdaftar apa pun yang terkait dengan executable yang memiliki aksi terbuka default) dan melakukan operasi pada file, seperti mencetak, dengan komponen Proses. Ketika UseShellExecute salah, Anda hanya bisa memulai executable dengan komponen Proses.

UseShellExecute harus benar jika Anda mengatur properti ErrorDialog menjadi true.


0

Jika kita ingin menyembunyikan jendela aplikasi yang dapat dieksekusi, maka UseShellExecute harus disetel ke true


0

Ketika path berisi spasi atau beberapa karakter khusus (beraksen) lainnya, CreateProcess (UseShellExecute = false) tampaknya menggunakan nama file pendek (notasi "DOS" 8.3), ShellExecute (UseShellExecute = true) menggunakan nama file yang panjang. Jadi ketika Anda menggunakan UseShellExecute = false, pastikan untuk mengubah direktori dan nama file Anda menjadi 8,3 nama (google ".net cara mendapatkan 8,3 nama file"). (Tidak yakin apa versi Windows dan / atau sistem file melakukannya dengan cara ini, diuji pada Windows 7, NTFS.)


Mungkinkah itu hanya memotong jalan di ruang angkasa? Menempatkan kutipan di sekitar "path / nama program" memecahkan ini.
Gbarry
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.