UAC нужен для консольного приложения

У меня есть консольное приложение, которое требует использования некоторого кода, требующего уровня администратора. Я прочитал, что мне нужно добавить файл манифеста myprogram.exe.manifest, который выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator">
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Но он все равно не поднимает UAC (в консоли или при отладке в VS). Как я могу решить эту проблему?

Обновлять

Я могу заставить его работать, если я запускаю решение в администраторе или когда я запускаю /bin/*.exe в администраторе. Мне все еще интересно, можно ли иметь что-то, что будет появляться при запуске приложения вместо явного щелчка правой кнопкой мыши ›Запуск от имени администратора?


person Patrick Desjardins    schedule 22.10.2008    source источник
comment
Вы запускаете приложение как администратор?   -  person Nick Berardi    schedule 22.10.2008
comment
Я использую VS как обычный пользователь, поэтому нет. Но когда я щелкаю правой кнопкой мыши по консольному приложению и запускаю его от имени администратора, оно работает. Я хотел бы, чтобы всплывающее окно UAC, когда я нажимаю RUN в Visual Studio, вместо прослушивания.   -  person Patrick Desjardins    schedule 22.10.2008
comment
Кстати, это работает, КОГДА я запускаю VS в режиме администратора. Я бы хотел, чтобы всплывающее окно, если я не запускаю в режиме администратора, позволяло мне переключиться в режим администратора.   -  person Patrick Desjardins    schedule 22.10.2008
comment
Вы встроили манифест в myprogram.exe с помощью инструмента манифеста (mt.exe)? Или манифест просто сидит на диске в том же каталоге?   -  person bk1e    schedule 23.10.2008


Ответы (3)


Вам необходимо встроить манифест UAC как встроенный ресурс Win32. См. Добавление манифеста UAC в управляемый код.

Короче говоря, вы используете инструмент командной строки Windows SDK, чтобы встроить его в свой исполняемый файл.

Вы можете автоматизировать это как этап после сборки, поместив следующую строку в качестве задачи после сборки в свойствах вашего проекта VS:

mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"
person Judah Gabriel Himango    schedule 03.11.2008
comment
mt.exe входит в состав Windows SDK? Я посетил вашу ссылку, но похоже, что это C ++. - person Patrick Desjardins; 03.11.2008
comment
Да, это часть Windows SDK. msdn.microsoft.com/en-us/library/aa375649 (VS.85) .aspx - person Judah Gabriel Himango; 31.07.2009

Для всех, кто использует Visual Studio, это очень просто. Я собирался настроить Windows SDK и выполнить шаги после сборки mt.exe и все такое, прежде чем понял, что он встроен в VS. Я подумал, что запишу это для потомков.

  1. Проект | Добавить новый элемент -> Элементы Visual C # -> Файл манифеста приложения
  2. Откройте app.manifest, измените значение requiredExecutionLevel. @ Level на "requireAdministrator".
  3. Строить

Ta-da

person scobi    schedule 02.02.2010

Ответ Скотта сделает то, что вы просили, но Microsoft рекомендует, чтобы консольные приложения отображали сообщение «Доступ запрещен», а не запрос на повышение прав.

Из http://msdn.microsoft.com/en-us/library/bb756922.aspx:

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

Для консольных приложений необходимо сделать следующее:

  1. Отметьте, что ваше приложение «asInvoker»: вы можете сделать это, создав манифест вашего приложения, в котором вы установили RequestedExecutionLevel == asInvoker. Эта настройка позволяет вызывающим абонентам из контекстов без повышенных прав создавать ваш процесс, что позволяет им перейти к шагу 2.

  2. Предоставьте сообщение об ошибке, если приложение запускается без маркера полного доступа администратора: если приложение запускается в консоли без повышенных прав, ваше приложение должно выдать краткое сообщение и выйти. Рекомендуемое сообщение: «Доступ запрещен. Для использования выбранных параметров необходимы права администратора. Для выполнения этих задач используйте командную строку администратора».

Приложение также должно возвращать код ошибки ERROR_ELEVATION_REQUIRED при неудачном запуске для облегчения написания сценариев.

Мой код C # для этого ниже. Он протестирован на Windows XP (администратор -> нормально, стандартный пользователь -> отказано) и Windows Server 2008 (администратор с повышенными правами -> нормально, администратор без повышенных прав -> отказано, стандартный пользователь -> отказано).

static int Main(string[] args)
{
    if (!HasAdministratorPrivileges())
    {
        Console.Error.WriteLine("Access Denied. Administrator permissions are " +
            "needed to use the selected options. Use an administrator command " +
            "prompt to complete these tasks.");
        return 740; // ERROR_ELEVATION_REQUIRED
    }

    ...
    return 0;
}

private static bool HasAdministratorPrivileges()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
person Joe Daley    schedule 21.04.2010