2016-07-07 13 views
0

ある時点で、私はmsiexecプロセスの起動とその終了のイベントをキャッチする必要があります。私のコードは通常のユーザー権限で動作しています。 msiexecプロセスはWindowsによってシステム特権で開始されるため、Refresh()を実行して、そのプロセスのHasExitedプロパティを確認することはできません。Process.GetProcessesByName( "msiexec")が間違った結果を表示するのはなぜですか?

while (true) { 
    Process[] msi = Process 
     .GetProcessesByName("msiexec"); 

    if (msi.Length > 0) break; 
} 

// The `msiexec` is launched. Now to wait its finishing... 

while (true) { 
    Process[] msi = Process 
     .GetProcessesByName("msiexec"); 

    if (msi.Length == 0) break; // Here is `false` always! 
} 

// Components was installed. 

しかし、二whileループは常にmsiexecが完成する予定msi.Length == 1た後も示しています。それはなぜ起こるのですか?どうすれば解決できますか?

+0

によって低下するまで、その後、待つのか?あなたはこれを100%確信していますか?もしそうなら、あなたは.NETでバグを見つけました。 – aquinas

+0

ループを使用する代わりに、プロセスを見つけた後に 'WaitForExit()'メソッドを呼び出すことはできませんか? –

+0

@ChrisDunaway、それは動作しません。私はこのテーマを作成する前にそれを試しました。問題は、 'msiexec'がシステム権限で動作することです。 –

答えて

0

同じ名前の複数のプロセスを同時に実行できることに注意してください。したがって、msi.Lengthは1以上にすることができます.msiexecを起動する前に0以上にすることもできます。

msiexecプロセスが見つかったら、GetProcessesByNameを再度呼び出す代わりに、プロセスのHasExitedプロパティをテストできます。

msi.Length>が1だった場合は非終了したプロセスの数はあなたがすべてのシステムプロセスで見て、実行されている* NO *のmsiexecプロセスがある1

+0

いいえ、できません。私は 'HasExited'値を取得するために必要な権利がないというメッセージに関する例外があります。 Windowsは複数のアプリケーションを同時にインストールすることはできません。したがって、 'msiexec'は常に私の意見では1になります。 –

+1

子セットアップが開始されたセットアップが既に見られました。その結果、タスクマネージャに複数のmsiexecが作成されました。いくつかのmsiexecを表示しているランダムな画像を参照してください:https://williamsitblog.files.wordpress.com/2015/12/image3.png –

+0

また、アプリケーションが64ビットで動作することを確認してください。 64ビットプロセスは32プロセスにアクセスできますが、その逆もありません。Found info here:https://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx (第2の注釈)。また、フルトラストの許可(同じリンクの3番目の注釈)が必要です。 –

関連する問題