Выполнение с правами администратора

Первым шагом в определении типа учетной записи, в которой должно быть запущено приложение, является проверка того, какие ресурсы будет использовать приложение и какие привилегированные API он вызовет. Вы можете обнаружить, что приложение или большие части приложения не требуют прав администратора. написание защищенного кода, Майкл Говард и Дэвид LeBlanc предлагает отличное описание того, как выполнять эту оценку и настоятельно рекомендуется.

Important

Большинство классических приложений должны выполняться на уровне выполнения asInvoker . Только запрашивать повышение прав, если приложению действительно требуется доступ на запись в защищенные расположения (например %ProgramFiles%), или необходимо изменить параметры на уровне системы. Запрос ненужного повышения прав увеличивает область атаки приложения и обучает пользователей отклонить запросы UAC без их чтения.

Объявление требуемого уровня выполнения с помощью манифеста UAC

Windows использует манифест приложения для определения уровня выполнения приложения. Внедрение манифеста с одним из следующих requestedExecutionLevel значений:

Уровень Когда использовать
asInvoker По умолчанию. Приложение выполняется с тем же маркером, что и родительский процесс. Используется для большинства приложений.
highestAvailable Приложение выполняется с самыми высокими привилегиями, доступными текущему пользователю. Используйте, если некоторые функции требуют повышения прав, но приложение по-прежнему должно запускаться для стандартных пользователей.
requireAdministrator Приложению всегда требуются полные права администратора. UAC запрашивает у пользователя согласие или учетные данные перед запуском.
<!-- Example: embed in your application manifest (.exe.manifest or linker /MANIFEST) -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false" />
    </requestedPrivileges>
  </security>
</trustInfo>

Warning

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

Подходы к минимизации привилегий

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

  • Запустите под учетной записью с меньшими привилегиями. Используйте PrivilegeCheck , чтобы определить, какие привилегии включены в маркере. Если доступные привилегии недостаточно для текущей операции, вы можете отключить этот код и попросить пользователя входить в учетную запись с правами администратора.
  • Разделение операций с повышенными привилегиями в вспомогательный процесс. Сохраните основное приложение в качестве asInvoker и запустите отдельный процесс с повышенными привилегиями только для конкретных операций, которым он нужен. Используйте моникер повышения привилегий COM или ShellExecute с командой runas , чтобы активировать запрос на повышение прав UAC.
  • Проверка подлинности пользователя путем вызова CredUIPromptForWindowsCredentials (GUI) или CredUICmdLinePromptForCredentials (командная строка) для получения имени пользователя и пароля. Пример см. в разделе запрос пользователя для учетных данных.
  • Олицетворения пользователя. Процесс, начинающийся с учетной записи с высоким уровнем привилегий, например system, может олицетворить учетную запись пользователя, вызвав олицетворенияLoggedOnUser или аналогичные функции олицетворения, что снижает уровень привилегий. Однако если вызов RevertToSelf внедряется в поток, процесс возвращается в исходные привилегии системы.

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