2013-10-15 6 views
2

У нас возникли проблемы с кодом, который уже работал, чтобы повысить права вспомогательного процесса, который устанавливает новый принтер.Подъемный процесс с UAC без ShellExecute

Я нашел этот ответ здесь, что почти соответствует наш код: Windows 7 and Vista UAC - Programmatically requesting elevation in C#

Единственное отличие состоит в том, что мы установили ShellExecute ложь. Это вызвало исключение Win32Exception, что процесс требует повышенных прав. Использование ShellExecute разрешило это.

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

Большое спасибо за все советы!

+0

Основным «почему» является то, что существует значительная проблема с этим «вспомогательным процессом». Он должен попросить возвышение. –

ответ

3

Способ поднять новый процесс программно - попросить оболочку выполнить исполняемый файл с помощью глагола runas. Это единственный способ сделать это. Чтобы передать глагол runas в оболочку, вам нужно вызвать подходящую функцию API Win32. Возможные кандидаты включают ShellExecute и ShellExecuteEx.

Свойство UseShellExecute определяет, какой вызов API используется при вызове Process.Start. Если UseShellExecute - true, то вызывается ShellExecuteEx. В противном случае вызывается CreateProcess.

Итак, когда вы установили UseShellExecute в false, вы переключились на использование CreateProcess. И CreateProcess не имеет механизма для подъема нового процесса. Поэтому, когда UseShellExecute является false, глагол runas, который вы указали, просто игнорируется, потому что CreateProcess не получает глаголы оболочки.

1

Поведение связано с тем, что Process.Start использует один из двух API внутри: CreateProcess или ShellExecuteEx. Только последний поддерживает выравнивание UAC, и почему мы должны установить UseShellExecute = true.

В качестве интересного в стороне есть другой способ достижения Высота UAC без непосредственного начала нового процесса. Вы можете написать внепроцессный COM-компонент для выполнения фактической работы, которая должна выполняться с повышением. Затем, когда вы создаете экземпляр компонента, он запускается в режиме повышенной (после отображения приглашения UAC). Конечно, нелегко написать внепроцессные COM-компоненты в .NET без использования C++/CLI. Но см. this post для получения дополнительной информации.

+0

Второй абзац неверен в том отношении, что он применим только к специальным DLL: «он должен быть подписан цифровой подписью издателем Windows, который является сертификатом, используемым для подписания всего кода, включенного в Windows (его недостаточно для подписания Microsoft, поэтому Microsoft программное обеспечение, которое не поставляется в Windows, не включено) »- так что это довольно эксклюзивно. – coderforlife

+0

@coderforlife - Спасибо за обнаружение ошибки! Техника работает, но я поспешно связал статью, в которой описывается совсем другое. Вместо этого я добавил ссылку на другую почту.Надеюсь, это будет полезно кому-то. – Olly

+0

Удивительный! Я рад, что он действительно работает и теперь будет изучать его использование (я сначала прочитал статью, потому что я действительно хотел, чтобы она работала). Благодаря! – coderforlife

Смежные вопросы