Как запросить права администратора при запуске программы?

81

Мне нужно, чтобы мое программное обеспечение могло запускаться от имени администратора в Windows Vista (если кто-то запустит его без прав администратора, оно выйдет из строя).

При запуске другого программного обеспечения я видел запрос системы вроде «это программное обеспечение будет запускаться от имени администратора. Вы хотите продолжить?» когда приложение пыталось получить административные привилегии.

Как запросить административные привилегии при запуске приложения c # в Windows Vista?

Арсен Захрай
источник
6
Пожалуйста, не забывайте, что это только скрывает основную проблему, но не решает ее. Даже если вашей программе действительно нужны права администратора, она не должна аварийно завершить работу, если не получит их. Наиболее вероятная причина заключается в том, что вы не можете проверить состояние ошибки после системного вызова.
Гарри Джонстон

Ответы:

143

Добавьте в свой файл манифеста следующее:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Вы также можете использовать highestAvailable для уровня.

Посмотрите здесь о встраивании файлов манифеста:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

PS: Если у вас нет файла манифеста, вы можете легко добавить новый:

В Visual Studio щелкните правой кнопкой мыши проект -> Добавить элемент -> Выбрать файл манифеста приложения (в разделе Общие для элементов Visual C #)

В добавленном файле уже будет указанная выше часть, просто измените уровень на requireAdministratorсasInvoker

Manojlds
источник
2
Стоит упомянуть, что если вы добавите файл манифеста приложения в VS таким образом, вы получите там шаблон со многими другими параметрами (например, заявив, что ваше приложение работает только в Windows 10 и более поздних версиях). Протестировано на VS2017.
Пер Лундберг
@PerLundberg - Не стоит упомянуть, потому что оригинал Ask-эр не спрашивал об этом - Он спросил разрешения администратора
Momoro
3
@Momoro Вопросы о SO предназначены не только для OP, но и для большей пользы сообщества. Другие люди могли бы найти этот вопрос при поиске других решений, не только точно , что ОП спросил о. И вообще, не помешает научить людей тому, что «вы можете делать это с помощью манифестов приложений».
Пер Лундберг
Я ничего грубого не подразумевал (Извините , если я наткнулся на этот путь) , я просто читал на старые ответы / вопросы и получил вид перепутал: D
Momoro
14

Поместите этот XML в файл с именем yourexename.exe.manifest:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
        <requestedExecutionLevel level="highestAvailable" />
     </requestedPrivileges>
   </security>
</trustInfo>
</assembly>
Стив Даннер
источник
-1

Для F # Visual Studio 2013, включая файл манифеста, который запрашивает повышение прав администратора с использованием флага компилятора FSharp, /win32manifestкак показано ниже, у меня сработало. Итак, учитывая результат проекта с именем "App.Exe"

  1. Создайте файл со следующим содержимым (для удобства вы можете добавить файл в проект. Убедитесь в том, что это Build Actionявляется None' andкопирование на выход ... isНе копировать . By convention such a file is named App.Exe.manifest`. Если вам требуется UIAccess (User Interface), узел должны иметь строгое название.

    <?xml version="1.0" encoding="utf-8" ?>
    <asmv1:assembly manifestVersion="1.0" 
        xmlns="urn:schemas-microsoft-com:asm.v1"
        xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
        xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <assemblyIdentity version="1.0.0.0" name="App" />
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </asmv1:assembly>
    
  2. Редактирование Диалога сборки проекта панели в Other flags:поле ввода , чтобы включить следующее: /win32manifest:<ApplicationManifestFile>. Например, в этом случае /win32manifest:App.Exe.manifest.

Джордж
источник