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

#c# #windows #windows-7 #windows-vista

#c# #Windows #windows-7 #windows-vista

Вопрос:

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

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

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

Комментарии:

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

Ответ №1:

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

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

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

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

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

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

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

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

Комментарии:

1. Стоит упомянуть, что если вы добавите файл манифеста приложения в VS таким образом, вы получите там шаблон со многими другими параметрами (например, сообщая, что ваше приложение работает только в Windows 10 и выше).) Протестировано на VS2017.

2. @PerLundberg — Не стоит упоминать, потому что первоначальный вопрос не спрашивал об этом — он спрашивал о разрешениях администратора

3. @Momoro Вопросы по SO предназначены не только для OP, но и для большей пользы сообщества. Другие люди могут найти этот вопрос при поиске других решений, а не только того , о чем спрашивал OP. И вообще, не помешает научить людей тому, что «вы можете делать эти вещи с помощью манифестов приложений».

4. Я не подразумевал ничего грубого (извините, если я столкнулся с этим) Я просто читал старые ответы / вопросы и немного запутался: D

Ответ №2:

Поместите этот 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>
  

Ответ №3:

Вам нужно использовать requestedExecutionLevel токен в манифесте:

http://www.developerfusion.com/code/7987/making-a-net-app-run-on-vista-with-administrator-priviledges/

Ответ №4:

Для .Net ( Visual Studio 2013 ) включите файл манифеста, который запрашивает права администратора, и, используя флаг компилятора /win32manifest , создайте и предоставьте файл манифеста, который запрашивает это право. Однако ниже описано, как это сделать в Visual Studio для имени проекта, App.Exe :

  1. Создайте файл со следующим содержимым (для удобства вы можете добавить файл в проект Visual Studio в качестве ресурса разработки, убедившись, что он Build Action есть None и Copy to Output... есть Do not copy . В этом случае файлы манифеста по соглашению называются в честь их цели вывода App.Exe.manifest . Если требуется uiAccess (пользовательский интерфейс), сборка должна иметь строгое имя.

     <?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 флаг, и попросите Visual Studio соответствующим образом вызвать компилятор. Например, в этом случае,

    /win32manifest:App.Exe.manifest .

Обратите внимание на следующую запись:

   <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>
  

Комментарии:

1. OP запросил C #.