Обход высоты при запуске нового процесса - PullRequest
4 голосов
/ 10 августа 2011

ОК, вот моя проблема: я пытаюсь запустить стороннее приложение. Это приложение, по-видимому, настроено так, чтобы требовать повышения прав, предположительно через встроенный манифест. Моя программа работает в контексте пользователя без прав администратора, и я хочу, чтобы стороннее приложение запускалось в том же контексте.

Когда я вызываю CreateProcess, он возвращает код ошибки 740 «Запрошенная операция требует повышения прав».

Я пробовал флаг CREATE_PRESERVE_CODE_AUTHZ_LEVEL, который звучал актуально, но без разницы.

Стороннее приложение работает без прав администратора, например, если я отключаю UAC, а затем запускаю его без прав администратора.

Заранее благодарим за любые советы / идеи, которые могут у вас возникнуть.

Ответы [ 4 ]

8 голосов
/ 24 сентября 2011

Установите для переменной среды __ compat_layer для вашего процесса значение RunAsInvoker . Если эта переменная среды задана, CreateProcess будет успешным.

Для этой цели вы можете использовать функцию SetEnvironmentVariable .

1 голос
/ 13 марта 2013

Эта отметка также требуется для некоторых очень простых программ, в именах которых есть ОБНОВЛЕНИЕ, НАСТРОЙКА или УСТАНОВКА; ничего общего с манифестом. Мы пишем код в PICK BASIC, который работает на Win2008, и если мы напишем программу HELLO WORLD с именем UPDATE.TEST, мы не сможем запустить ее без повышения прав. Все, что нам нужно сделать, это переименовать программу, чтобы исправить ... Но раздражает, и кстати.

0 голосов
/ 30 мая 2017

Другое возможное решение - использовать Microsoft Application Compatibility Toolkit для создания и установки настраиваемой базы данных совместимости, которая применяет RunAsInvoker исправление или RunAsHighest исправление к заявке, о которой идет речь. Хотя в документации не говорится, работает ли это для приложений, для которых в манифесте установлен параметр requireAdministrator, я проверил это, и оно работает для меня.

Программу базы данных совместимости можно установить программно с помощью инструмента командной строки sdbinst .

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

0 голосов
/ 10 августа 2011

Боюсь, что нет способа обойти это.

Если UAC включен и программа показывает, что требует повышения прав, то система пытается запустить этот процесс с повышенными правами. CreateProcess не запустит такой процесс, если вы не повышены.

Используйте функции ShellExecute или ShellExecuteEx для запуска стороннего приложения. Эти функции будут отображать подтверждение UAC и запускать процесс, если пользователь нажимает Да . Элемент пользовательского интерфейса, который запускает это стороннее приложение, должен иметь UAC-щит для уведомления пользователей о том, что будет отображаться подтверждение UAC.

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