2011-03-08 24 views
3

System.Diagnostics.Process.Start()に問題があります。Process.Start()を使用して起動するとインストーラが失敗しますが、ダブルクリックすると動作します

サードパーティのインストーラ(実行可能ファイルにラップされたMSIパッケージ)を起動するときに、exeファイルをダブルクリックするか、コマンドラインから起動しても問題なくインストールされます。

ただし、アプリケーション内からを使用して起動すると、エラーコード5 =アクセス拒否でインストーラが失敗します。ログには、一部のレジストリ設定を復元できないため、失敗したというメッセージが表示されます。

exeをダブルクリックしてアプリケーション内からプロセスを起動するまでの違い(セキュリティ上の問題)を知っている人はいますか?ユーザーは管理者として実行されます。

例コード:

var info = new ProcessStartInfo(); 
info.FileName = @"C:\MyFolder\setup.exe"; 
info.UseShellExecute = false; // I have tried both true and false here 

Process p = Process.Start(info); 
p.WaitForExit(); 

if (p.ExitCode != 0) 
{ 
    // Do something... 
} 

がUPDATE:

私は小さなコンソールアプリケーションで上記のコードを入れて、それが働きました。明らかに主なアプリで何か怪しげなことが起こっていた...

私はいくつかのレジストリキーを閉じるのを忘れてしまった。インストーラは同じキーにアクセスしようとして失敗しました。キーを正しく閉じると、コードが機能しました。

大変申し訳ございません。私には恥ずべき。

+0

@Kipotlov - 質問はwindows-xpタグが付けられています。 – Oded

+0

通常の実行で特定の操作を可能にするためにユーザーの操作が必要な場合は、インストーラを通じてコマンドライン引数をMSIに渡す必要があります。このProcessオブジェクトを設定して呼び出す方法の例が役に立ちます。 – BrMcMullin

答えて

0

それはあなたがとにかくそれを期待するように動作しない可能性があります。私はあなたが無人インストールのために行くと仮定しています。このような何か試してみてください:

Process installer = new Process() 
installer.StartInfo.FileName = @"C:\MyFolder\Setup.exe"; 
installer.StartInfo.Arguments = " /s /v\" /qn\""; 
installer.Start() 
installer.WaitForExit(); 

if (installer.ExitCode != 0) 
{ 
    //do something 
} 

を引数には、サイレント(/秒)とMSI(/ V)までの引数を渡すために、インストーラのexeファイルを伝えます。/qnは、インストーラをサイレントモードで実行するためのWindowsインストーラの引数です。ユーザーの操作が不要で、インストーラを適切に実行できるようにする必要があります。

0

info.Verb = "runas"に設定してみましたか?

これにより、アプリケーション/インストーラが管理者として実行されます。アイコンを右クリックして管理者として実行するように指示するのと同じことです。

関連する問題