2016-05-04 9 views
0

У меня есть служебная программа командной строки для какой-либо цели. Я запускаю эту утилиту из COM-библиотеки DLL с помощью функции ShellExecuteEx. При вызове ShellExecuteEx я указываю параметр lpVerb как «runas», так что утилита запускается с повышением. Я вызываю функцию COM-интерфейса от клиента exe при его запуске. Поэтому, когда я запускаю exe клиента, утилита также запускается. Моя проблема заключается в том, что, поскольку утилита запускается с повышением, она всегда запрашивает приглашение подтверждения UAC. Я не могу этого вынести, потому что во время этого процесса не будет ручного вмешательства. Поэтому мне нужно, чтобы утилита запускалась без отображения приглашения UAC, но все же повышалась при запуске клиентского exe. Есть ли способ достичь этого? Я предпочел бы некоторые изменения, сделанные в самой утилите, как изменение файла манифеста, а не изменения некоторых системных настроек. Любая помощь будет оценена.Как отключить приглашение UAC для конкретного приложения

ответ

0

Это невозможно, как вы описываете (манифестное изменение), потому что это победит цель UAC.

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

Посмотрите на ответ я дал здесь: https://stackoverflow.com/a/36838171/1871033

Вы можете сделать то же самое, но без триггера входа в систему. Таким образом, у вас будет запланированная задача, которая не запускается сама по себе, но она существует. Затем вы можете использовать schtasks.exe /run /tn YourTaskName без повышения, чтобы выполнить задачу с повышенными привилегиями.

+0

Но я запускаю приложение из COM-библиотеки с помощью ShellExecuteEx. Это утилита командной строки, которая также принимает некоторые аргументы. Я передаю эти аргументы в ShellExecuteEx. Возможно ли использовать такой же механизм, если я добавлю запланированную задачу? Я имею в виду вместо вызова ShellExecuteEx я должен иметь возможность запускать задачу из моей COM-библиотеки DLL. Это также указывает аргументы командной строки. Затем подождите, пока приложение выйдет (задача будет завершена), а затем продолжите. Возможно ли это программно? Если да, то можете ли вы предоставить некоторую информацию об этом .. – Partha

+0

О, я вижу ... Если вам нужно передать аргументы командной строки во время выполнения, это не будет работать из коробки. Вам нужно будет написать специальный инструмент в качестве обертки, который, например, принимает вход через именованный канал или читает его из текстового файла в определенном месте - тогда может быть даже пакетный скрипт, который вы вызываете через 'cmd/c' в (в обоих случаях вам нужно быть осторожным, чтобы очистить входные данные, чтобы убедиться, что вы не вводите какие-либо уязвимости, связанные с эскалацией привилегий), или посмотрите на запись службы. Но это не прямолинейно. – CherryDT

+0

Мне особенно нужно отключить уведомление UAC, потому что мое приложение-приложение должно запускаться на сервере, где не будет никакого взаимодействия с пользователем. Но все же мне нужны привилегии администратора. Интересно, нет ли такого сценария в Windows, где приложение должно запускаться на сервере дампа (неинтерактивный) с правами администратора? В таком сценарии будет использоваться механизм? Я действительно надеюсь, что может быть решение, потому что вышеупомянутый сценарий может быть требованием для многих людей. – Partha