2012-04-04 2 views
2

Я пытаюсь скомпилировать IL-код на собрание. ilasm.exe должен быть вызван моим приложением C#. Я вызываю ilasm.exe через экземпляр ProcessStartInfo. Построение ПЭ прекрасно работает, и моя Ассамблея работает.Почему мой сборщик IL, ilasm.exe, вызываемый C#, нуждается в UAC?

Моя проблема в том, что файлы, которые были созданы моим приложением, впоследствии требуют прав администратора, которые должны быть выполнены.

Если я вызываю 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#?

Я запускаю свое приложение и командную строку без прав администратора.

+0

Какая ошибка вы получаете как не-админ? Что такое patchFile? Вы не называете его идентично тому, как вы сказали, что вызываете его из командной строки. –

+0

Извините, я забыл упомянуть некоторые вещи. patchFile - это путь к файлу, содержащему il-код. Я не получаю никаких ошибок. Ошибка заключается в том, что ilasm.exe вызывает код C#, после чего ему нужны права администратора для выполнения, тогда как запросы ilasm.exe через cmd им не нужны. –

+0

Если я понимаю вас, вы говорите, что оба генерируют действительные EXE, но тот, который генерируется из 'Process.Start', заставляет ваш компьютер идти * BOOP * и вызывать приглашение UAC.Если это так, это похоже на то, что один из кода встраивает 'upperAvailable'' requestExecutionLevel', поясненный [здесь] (http://msdn.microsoft.com/en-us/library/bb756929.aspx). Если это так, я не знаю, почему это было бы иначе. –

ответ

4

Это требует UAC, потому что вы не поставляете путь к записываемому адресу в output, поэтому он пытается записать в ту же папку, в которой находится ilasm (или текущая папка для вашего приложения).

У пользователя, не являющегося администратором, нет доступа для записи к чему-либо под %WINDIR% (папка Windows) или %ProgramFiles%, поэтому он запрашивает возвышение для пользователя, у которого есть доступ на запись к папке.

+0

да, извините. Я забыл объявить свои переменные. Полным сгенерированным вызовом из C# будет 'ilasm.exe C: \ Test \ myilcode.il/qui/output = C: \ Test \ testFile.exe'. Точной вызываемой команде, вызываемой моим приложением, требуется права администратора после этого, а тот, который называется manualy из cmd, не работает. Так что на самом деле я не пишу в системную папку :( –

+2

ОК. Я оставлю свой ответ на данный момент, потому что он обращается к исходному вопросу как заданный и может быть полезен кому-то в будущем. (И для дальнейшего использования, когда у вас есть проблемы, это поможет вам получить ответы, если вы предоставите всю соответствующую информацию. :) Это означает, что у людей есть все факты, прежде чем они публикуют ответы, а это означает, что у них меньше шансов, что им придется удалить их после того, как вы добавите детали, которые аннулировать ответ.) –

+0

«вся соответствующая информация» имеет значение, у вас будет крик на мой ответ :) –

1

Что такое patchFile?

Этот комментарий от @Chris относится к этой загадке, я не вижу в этом вопроса. Вероятно, вы имеете дело с трудной проблемой, которую Microsoft должна решить с помощью UAC. Поддержка старых программ, требующих привилегий UAC, но не запрашивающих их, потому что они были написаны перед Vista. Как установщики. И программы патчей.

Мой хрустальный шар говорит, что ваше фактическое имя программы не является newFile.exe, как и ваш вопрос, но имеет имя типа «update.exe» или «patch.exe». И, кроме того, также не очевидно, что вы не включаете манифест в созданную вами программу. В манифесте говорится, что программа Vista известна с помощью элемента <requestedExecutionLevel>. Кроме того, также не очевидно, что когда вы запускаете это из командной строки вручную, вы используете другое имя для .exe.

Это много догадок, но их объединяют, и это имеет смысл: Windows идет «ага!». Старая программа, похоже, хочет писать в .exe-файлы в ограниченном каталоге. Лучше отобразить приглашение UAC ».

+0

Ах, приятно поймать! Я забыл об ошибках 'update',' setup' и 'install' filename! +1, потому что вы, вероятно, на 100% на деньги с этим «психическим» ответом. (Я действительно хочу, чтобы люди публиковали фактический код и содержимое var, анонимизируя только абсолютный минимум, вместо того, чтобы беллетризовать бессмысленные вещи, чтобы быть чрезмерно защищенными. Было бы намного легче поймать такие вещи, как я думаю.) :) –

 Смежные вопросы

  • Нет связанных вопросов^_^