3

ILコードをアセンブリにコンパイルしようとしています。はilasm.exe私のC#アプリケーションによって呼び出されるはずです。インスタンスilasm.exeを介してを呼び出しています。ProcessStartInfoPEの生成は正常に機能し、アセンブリは機能しています。

私の問題は、私のアプリケーションによって作成されたファイルが、後で実行されるために管理者権限を必要とすることです。

ilasm.exeコマンドラインから手動で呼び出す場合、管理者権限は必要ありません。

使用されたilasm.exeコマンド: ilasm.exe /qui /output="c:\test\newFile.exe" <path to il file>

ilasm.exeを呼び出す私のアプリケーション:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = ilFilePath + " /qui /output=" + outputPath + "testFile.exe";


try
{
    using (Process exeProcess = Process.Start(startInfo))
    {
        exeProcess.WaitForExit();
    }
}
catch
{
    // Log error.
}

私は何か間違ったことをしていますか?C#から別のプロセスを呼び出すときに他に何かを指定する必要がありますか?

管理者権限なしでアプリケーションとコマンドラインを実行しています。

4

2 に答える 2

4

の書き込み可能な場所へのパスを指定していないため、UACが必要です。そのため、同じフォルダー(またはアプリの現在のフォルダー)outputに書き込もうとしています。ilasm

管理者以外のユーザーは、%WINDIR%(Windowsフォルダー)またはの下にあるもの%ProgramFiles%への書き込みアクセス権を持っていないため、フォルダーへの書き込みアクセス権を持っているユーザーへの昇格を要求しています。

于 2012-04-04T00:27:46.887 に答える
1

patchFileとは何ですか?

@Chrisによるこのコメントは、このパズルに関連しています。質問には表示されません。あなたはおそらく、MicrosoftがUACで解決する必要のある難しい問題に取り組んでいます。UAC特権を必要とするが、Vistaより前に作成されたため、UAC特権を要求しない古いプログラムをサポートします。インストーラーのように。そしてパッチプログラム。

私の水晶玉は、あなたの実際のプログラム名はあなたの質問が言うようにnewFile.exeではなく、「update.exe」や「patch.exe」のような名前を持っていると言っています。さらに、生成したプログラムにマニフェストを含めていないことも明らかではありません。<requestedExecutionLevel>プログラムが要素を認識しているVistaであることを示すマニフェスト。さらに、これをコマンドラインから手動で実行する場合は、.exeに別の名前を使用することも明らかではありません。

これは多くの推測ですが、まとめると理にかなっています。Windowsは「ああ!古いプログラムです。制限されたディレクトリにある.exeファイルに書き込みたいようです。UACプロンプトを表示する方がよいでしょう」。

于 2012-04-04T04:43:39.013 に答える