2012-04-04 10 views
2

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.

+0

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. –

+0

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. –

+0

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. –

Antwort

4

Es erfordert UAC, da Sie keinen Pfad zu einem beschreibbaren Speicherort in output angeben, also versucht es, in denselben Ordner zu schreiben, in dem sich ilasm befindet (oder der aktuelle Ordner für Ihre App).

Ein Benutzer ohne Administratorrechte hat keinen Schreibzugriff auf irgendetwas unter %WINDIR% (der Windows-Ordner) oder %ProgramFiles%. Daher wird nach einem Benutzer gefragt, der Schreibzugriff auf den Ordner hat.

+0

ja es tut mir leid. Ich habe vergessen, meine Variablen zu deklarieren. Ein vollständig generierter Aufruf von C# wäre 'ilasm.exe C: \ Test \ meinilcode.il/qui/output = C: \ Test \ testFile.exe'. Der exakt aufgerufene Befehl, der von meiner Anwendung aufgerufen wird, benötigt danach Admin-Rechte, während derjenige, der manuell von cmd aufgerufen wird, dies nicht tut. Also schreibe ich eigentlich nicht in einen Systemordner :( –

+2

OK. Ich überlasse meine Antwort vorerst, weil sie die ursprüngliche Frage wie gewünscht anspricht und für jemanden in der Zukunft nützlich sein könnte. (Und für zukünftige Referenz, Wenn Sie Probleme haben, hilft es Ihnen Antworten zu erhalten, wenn Sie alle relevanten Informationen bereitstellen :) Es bedeutet, dass die Leute alle Fakten haben, bevor sie Antworten posten, was bedeutet, dass sie weniger Gefahr haben, sie später zu löschen, wenn Sie Details hinzufügen annulliere die Antwort.) –

+0

'alle relevanten Informationen' ist relevant, du wirst ein Heulen bei meiner Antwort haben :) –

1

Was ist PatchFile?

Dieser Kommentar von @Chris ist relevant für dieses Puzzle, ich sehe es nicht in der Frage. Sie haben wahrscheinlich ein schwieriges Problem, das Microsoft mit UAC lösen musste. Unterstützung alter Programme, die UAC-Berechtigungen benötigen, aber nicht danach fragen, weil sie vor Vista geschrieben wurden. Wie Installateure. Und Patch-Programme.

Meine Kristallkugel sagt, dass Ihr tatsächlicher Programmname nicht newFile.exe ist, wie Ihre Frage sagt, aber hat einen Namen wie "update.exe" oder "patch.exe". Und außerdem ist es auch nicht offensichtlich, dass Sie kein Manifest in das von Ihnen generierte Programm aufnehmen. Ein Manifest, das besagt, dass das Programm Vista mit dem <requestedExecutionLevel> Element bewusst ist. Und außerdem auch nicht offensichtlich, dass wenn Sie dies von der Kommandozeile aus manuell ausführen, dass Sie einen anderen Namen für die .exe verwenden.

Das ist eine Menge Vermutungen, aber fügen Sie sie zusammen und es macht Sinn: Windows geht "aha! Altes Programm, klingt wie es in exe-Dateien in einem eingeschränkten Verzeichnis schreiben will. Bessere Anzeige der UAC-Eingabeaufforderung ".

+0

Ah, schöner Fang! Ich habe die 'update',' setup' und 'install' Dateinamensprobleme vergessen! +1, weil Sie mit dieser "psychischen" Antwort wahrscheinlich 100% auf das Geld haben. (Ich wünschte wirklich, die Leute würden tatsächlichen Code und var-Inhalte posten, nur das absolute Minimum anonymen, anstatt sinnlose Dinge zu fiktionalisieren, um überschützend zu sein. Es würde es viel leichter machen, solche Dinge zu fangen, denke ich.) :) –