Каковы различия между «Запуск от имени администратора» и манифестом с requireAdministrator? - PullRequest
3 голосов
/ 12 июля 2010

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

Если пользователь запускает мою программу, щелкнув ее правой кнопкой мыши и выбрав «Запуск от имени администратора», в Windows 7 также появится диалоговое окно с запросом разрешений. Тем не менее, существуют некоторые небольшие различия в том, как моя программа работает в некоторых более эзотерических частях моей программы.

Так в чем же разница между «Запуск от имени администратора» и манифестом с requireAdministrator? Будем благодарны за любые ссылки на документацию, которые описывают различия.

Редактировать : Это с включенным UAC.

Редактировать : Как и обещано ниже, полное объяснение разницы, которую я вижу.

Я использую библиотеку EasyHook для внедрения DLL в другой процесс. Когда мое приложение запускается с «Запуск от имени администратора», внедренный процесс падает, и EasyHook возвращает ошибку «Неизвестная ошибка во введенном коде ассемблера». Ни один из кодов в моей DLL не получает возможности для выполнения; авария происходит до этого. (Более того, происходит сбой, даже если я удаляю DLL до нуля)

Если я нормально запускаю свою программу (т.е. повышен с помощью requireAdministrator), все работает нормально.

Мое приложение состоит из нескольких разных исполняемых файлов. Процесс, который запускает пользователь, - это не тот процесс, который выполняет внедрение.

Ответы [ 4 ]

3 голосов
/ 12 июля 2010

С предоставленной информацией не будет различий в разрешениях между двумя процессами.

Если вы запрашиваете уровень выполнения «requireAdministrator» через манифест приложения, ваше приложение будет запускаться либо с маркером полного доступа администратора, либо не запускаться вообще, если пользователь отказывает в согласии (см. Создание и встраивание манифеста приложения (UAC) для получения дополнительной информации).

То же самое произойдет, когда пользователь выберет Запуск от имени администратора .

Единственное отличие - это способ запуска процесса.Когда вы запускаете исполняемый файл из оболочки, например, дважды щелкнув в проводнике или выбрав Запуск от имени администратора из контекстного меню, оболочка вызовет ShellExecute, чтобы фактически запустить выполнение процесса.Весь процесс возвышения скрыт внутри этой функции.Кенни Керр более подробно описывает этот процесс в Windows Vista для разработчиков. Часть 4. Контроль учетных записей пользователей :

ShellExecute сначала вызывает CreateProcess, чтобы попытаться создатьновый процесс.CreateProcess выполняет всю работу по проверке параметров совместимости приложений, манифестов приложений, загрузчиков среды выполнения и т. Д. Если он определяет, что приложение требует повышения прав, но вызывающий процесс не повышен, то CreateProcess завершается ошибкой с ошибкой ERROR_ELEVATION_REQUIRED.Затем ShellExecute вызывает службу Application Information для обработки запроса на повышение прав и создания процесса с повышенными правами, поскольку вызывающий процесс, очевидно, не имеет необходимых разрешений для выполнения такой задачи.Служба Application Information в конечном счете вызывает CreateProcessAsUser с токеном администратора без ограничений.

Если, с другой стороны, вы хотите создать процесс с повышенными правами независимо от того, какая информация о приложении доступна, вы можете указать малоизвестный глагол «runas»с ShellExecute.В результате запрашивается повышение прав независимо от того, что может предписывать манифест приложения и информация о совместимости.Глагол runas на самом деле не нов в Windows Vista.Он был доступен в Windows XP и Windows 2003 и часто использовался для создания ограниченного токена непосредственно из оболочки.Это поведение, однако, изменилось.Вот простой пример:

::ShellExecute(0, // owner window
           L"runas",
           L"C:\\Windows\\Notepad.exe",
           0, // params
           0, // directory
           SW_SHOWNORMAL);

Таким образом, по сути, запуск исполняемого файла с использованием опции Запуск от имени администратора означает, что ShellExecute обходит проверки настроек совместимости, манифестов приложения и т. Д.и напрямую запрашивает повышение прав.

Статья Кенни Керра также содержит пример кода для запроса токена текущего процесса на предмет его разрешения с помощью функции OpenProcessToken.Возможно, вы сможете использовать пример, чтобы определить, что нет различий в том, как ваш процесс повышен.

Мне определенно любопытно узнать, какие различия вы наблюдаете, так как я сильно сомневаюсь, что они связаны с повышением.

И последнее: можете ли вы дважды проверить, действительно ли вы запрашиваете уровень requireAdministrator , а не по ошибке только уровень самый высокийAvailable ?

1 голос
/ 25 января 2011

В документации EasyHook для свойства IsAdministrator класса RemoteHooking упоминается:

Из-за UAC в Windows Vista это свойство в общем случае будет иметь значение false, даже если пользователь входит в группу встроенного администратора.Поскольку вы не можете подключиться без прав администратора, вам просто нужно установить уровень UAC вашего приложения для requireAdministrator.

Трудно представить, почему это происходит, но это возможно (особенно если вы видитебывает!) что активы, процессы, сборки и т. д., возможно, с разными уровнями доверия и т. д. не будут наследовать повышение уровня вашего основного приложения.Установка флага requireAdministrator может обрабатывать / применять это глобально во всей области ресурсов и зависимостей.Хотелось бы узнать, как это получается.

1 голос
/ 12 июля 2010

Одним из возможных отличий может быть редко используемый / понятый / намеренно выбранный атрибут uiAccess. Можете ли вы создать два манифеста, один с uiAccess = false, а другой с uiAccess = true, а затем скажите нам, дает ли один из них то же поведение, что и при использовании щелчка правой кнопкой мыши на run-as-admin?

0 голосов
/ 13 апреля 2017

Я думал, что вижу разницу между ними.Однако оказалось, что в моем случае проблема заключалась в следующем:

Когда я нажимаю «Запуск от имени администратора» в моем файловом браузере (Q-Dir), рабочий каталог отличается от того, когда я пытаюсь просто дважды щелкнутьприложение с requireAdministrator, установленным в манифесте.Это изменило поведение некоторых глючных DLL, которые я получил.Фактически, оказалось, что 100% различий, которые я видел, были связаны с запуском из разных рабочих каталогов (в частности, имело значение, был ли я на диске C: или с другой буквой диска) и что метод запуска программытак как администратор не имеет к этому никакого отношения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...