Ich versuche, einen IL-Code zu einer Assembly zu kompilieren. Die ilasm.exe
sollte von meiner C# -Anwendung aufgerufen werden. Ich rufe die ilasm.exe
über eine ProcessStartInfo
Instanz an. Die Generation der PE funktioniert gut und meine Versammlung funktioniert.Warum generiert meine IL Assembly, ilasm.exe von C# aufgerufen, benötigen UAC?
Mein Problem ist, dass die Dateien, die von meiner Anwendung erstellt wurden, anschließend Administratorrechte benötigen, um ausgeführt zu werden.
Wenn ich ilasm.exe
manuell über die Befehlszeile aufrufen, sind keine Administratorrechte erforderlich.
ilasm.exe Befehl: ilasm.exe /qui /output="c:\test\newFile.exe" <path to il file>
Meine Anwendung der ilasm.exe Aufruf:
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.
}
Bin ich etwas falsch gemacht? Muss ich etwas anderes angeben, wenn ich einen anderen Prozess von C# aus anrufe?
Ich führe meine Anwendung und die Befehlszeile ohne Administratorrechte.
Was ist der Fehler, den Sie als Nicht-Administrator erhalten? Was ist Patchdatei? Sie rufen es nicht so an, wie Sie es von der Kommandozeile aus aufgerufen haben. –
Leider habe ich vergessen, einige Dinge zu erwähnen. patchFile ist in diesem Fall der Pfad zu der Datei, die den Code enthält. Ich bekomme keine Fehler. Der Fehler ist, dass ilasm.exe über C# code aufruft, danach müssen Admin-Rechte ausgeführt werden, während ilasm.exe Aufrufe über cmd sie nicht benötigen. –
Wenn ich Sie verstehe, sagen Sie, dass beide gültige EXEs erzeugen, aber der von 'Process.Start' erzeugte erzeugt Ihren Computer * BOOP * und öffnet die UAC-Eingabeaufforderung.Wenn das der Fall ist, klingt es so, als würde der Code aus dem Code den 'highestAvailable'' requestedExecutionLevel' einbetten, der hier erklärt wird (http://msdn.microsoft.com/en-us/library/bb756929.aspx). Wenn ja, habe ich keine Ahnung, warum es anders wäre. –