Как предотвратить Vista от необходимости повышения на patch.exe?

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

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

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

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

Большое спасибо, ударил головой о стену в течение часа на этом до сих пор.

Ответы

Ответ 1

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

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

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

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

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

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

-Adam

Ответ 2

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

Фон

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

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

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

  • Настройка
  • обновление
  • Патч

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

Если приложение не имеет манифеста сборки, оно не является правильно написанным приложением 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> 

Ответ 3

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

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

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

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

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

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

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.