TL; DR - единственный вариант - порождать другой процесс. (Новое cmd.exe
.) В случае командной строки запуск нового экземпляра с токеном доступа с более высокими разрешениями всегда приведет к созданию нового окна .
Невозможно предоставить дополнительные разрешения для уже запущенного процесса.
Когда пользователь с правами администратора входит в систему Windows с включенным контролем учетных записей (UAC), создаются два отдельных маркера доступа :
- Один с полным доступом администратора и
- Второй «фильтрованный токен» со стандартным доступом пользователя
Во время создания процесса (например CMD.EXE
) ему назначается один из этих двух токенов доступа . Если процесс запущен «с повышенными правами» от имени администратора, используется маркер доступа без фильтрации. Если процессу не предоставлены права администратора, используется отфильтрованный токен стандартного пользователя.
После создания процесса невозможно заменить его токен доступа . 1 В этой теме MSDN Application Security для Windows Desktop постер, идентифицирующий себя как член команды ядра Windows, заявляет:
Ядро NT никогда не предназначалось для переключения токенов после запуска процесса. Это связано с тем, что дескрипторы и т. Д. Могут быть открыты в старом контексте безопасности, операции в полете могут использовать противоречивые контексты безопасности и т. Д. В связи с этим, как правило, нет смысла переключать токен процесса после начала его выполнения. Тем не менее, это не было реализовано до Vista . [курсив мой] (Источник благодаря к @Ben N )
Примечание. Контроль учетных записей пользователей был представлен с выпуском Windows Vista .
Этот ответ суперпользователя приводит два дополнительных источника, подтверждающих то же самое:
Поэтому просто невозможно поднять Командную строку или любой другой процесс на месте. Единственный вариант - порождать другой процесс с новым токеном доступа (который может быть другим экземпляром исходного процесса при желании). В случае командной строки запуск нового экземпляра с токеном доступа с более высокими разрешениями всегда приведет к созданию нового окна, и, если в системе включены запросы UAC, они также будут инициированы.
1 Вы можете настроить привилегии в существующем токене доступа с помощью функции AdjustTokenPrivileges , но в соответствии с MSDN :
Функция AdjustTokenPrivileges не может добавлять новые привилегии к токену доступа. Он может только включать или отключать существующие полномочия токена.