Как запретить Vista требовать повышения прав на patch.exe? - PullRequest
14 голосов
/ 10 февраля 2009

[Извините, это не вопрос программирования. Но недавно я перешел на новый компьютер с Vista, где я поддерживаю UAC (не говорите мне, чтобы отключить его, это не вариант).]

Каждый раз, когда я запускаю gnu patch.exe, я получаю диалоговое окно повышения прав из Vista. Если я переименую patch.exe в foo.exe, он этого не сделает, поэтому я предполагаю, что это одна из «эвристик» Vista.

Кто-нибудь знает, как это отключить? Это сводит меня с ума, и Google не помогает.

Или я должен добавить манифест только для patch.exe, чтобы система НЕ пыталась поднять это? Будет ли это работать, и если да, то как вы делаете такой манифест?

Спасибо большое, пока целый час бился головой об стену.

Ответы [ 3 ]

5 голосов
/ 19 июня 2009

Проблема в том, что ваше приложение не содержит манифеста сборки с requiredExectutionLevel .

Фон

Все правильно написанные приложения Windows должны иметь манифест сборки. И начиная с 2006 года одним из элементов, которые вам необходимы, является requiredExecutionLevel , который указывает, может ли ваше приложение функционировать, только если пользователь является администратором.

Если ваше приложение не имеет манифеста сборки, или если оно не имеет requiredExecutionLevel Windows будет считать, что это устаревшее приложение, и будет делать все возможное, чтобы поддерживать его работу .

Одна вещь совместимости для унаследованных приложений заключается в том, что некоторые из них могут быть установщиком или udpater и могут функционировать только при запуске от имени администратора. Windows пытается угадать эти приложения по именам файлов:

  • установка
  • обновление
  • 1024 * патч *

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

Если приложение не имеет манифеста сборки, значит, оно не является правильно написанным приложением Windows.

Правильное решение

Правильное решение - добавить манифест сборки, который будет у всех правильных приложений. Это отключило эвристику.

Пример манифеста UAC "asInvoker":

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" />
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly> 
5 голосов
/ 10 февраля 2009

От:
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/bf4f7dfa-5553-41d3-9c8e-311ee4a88599/

Если вы можете добавить манифест к затронутый исполняемый файл, объявляющий requiredExecutionLevel для "asInvoker" должно перестать подсказывать.

Сопутствующее руководство по архитектуре UAC и преобразованию существующих приложений, чтобы они работали правильно (около нижней пятой части страницы):

http://technet.microsoft.com/en-us/library/cc709628.aspx

Наконец, как написать такой манифест:

http://www.google.com/search?q=writing+a+uac+manifest

-Adam

3 голосов
/ 17 июля 2013

В моем случае мне пришлось написать программу-обертку, которая делает следующее:

1-Скопируйте файл «patch.exe» в системную временную папку (% TMP%) с другим именем: «apply.exe»

2-Выполните «% TMP% \ apply.exe» с нужными аргументами.

3-Удалить файл "% TMP% \ apply.exe"

Вам не нужно будет писать манифест.

Если вам нужно вычислить полный путь «patch.exe», предполагая, что .exe находится в переменной среды% PATH%, вы можете использовать следующий код в C #:

public string GetPatchInstallPath()
{
    StringDictionary env = 
    System.Diagnostics.Process.GetCurrentProcess().StartInfo.EnvironmentVariables;
    string pathEnvVble = env["PATH"];
    string[] paths = new string[]{};
    paths = pathEnvVble.Split(new char[] { ';' });

    foreach (string p in paths)
    {
       string fullPath = Path.Combine(p, "patch.exe");
       if (File.Exists(fullPath))
           return fullPath;
    }
    return string.Empty;
}

В противном случае вы можете передать полный путь patch.exe в программу-оболочку, если не хотите добавлять новую запись в переменную% PATH% для вашего местоположения patch.exe.

...