TL; DR - A única opção é gerar outro processo. (Um novo cmd.exe
.) No caso do prompt de comando, iniciar uma nova instância com um token de acesso com permissões mais altas sempre resultará em uma nova janela sendo criada.
Não é possível conceder permissões adicionais a um processo já em execução .
Quando um usuário com direitos administrativos efetua login em uma máquina Windows com o Controle de Conta de Usuário (UAC) habilitado, dois tokens de acesso separados são criados :
- Um com acesso total de administrador e
- Um segundo "token filtrado" com acesso de usuário padrão
No momento em que um processo (por exemplo, CMD.EXE
) é criado, ele é atribuído a um desses dois tokens de acesso . Se o processo for executado "elevado" como administrador, o token de acesso não filtrado será usado. Se o processo não tiver direitos de administrador, o token de usuário padrão filtrado será usado.
Uma vez que um processo foi criado, não é possível substituir seu token de acesso . 1 Neste MSDN Segurança de Aplicativos para Windows Desktop < a href="https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/86602194-c8f7-4c42-b349-fd78e1bdb5f2/ntsetinformationprocess-processaccesstoken-fails-with-statusnotsupported?forum=windowssecurity"> thread , um cartaz que se identifica como membro da equipe do Kernel do Windows:
The NT kernel was never intended to allow token switching once a process started running. This is because handles, etc. may have been opened in an old security context, inflight operations may use inconsistent security contexts, etc. As such, it typically does not make sense to switch a process' token once it has begun execution. However, this was not enforced until Vista. [emphasis mine] (Source thanks to @Ben N)
Observação: o controle de conta de usuário era introduzido com o lançamento do Windows Vista .
Esta resposta do superusuário cita duas fontes adicionais que confirmam o mesmo:
-
A postagem no blog do devzest.com Programando privilégio elevado / UAC :
Code can only be elevated at process level when startup, which means that a running process cannot be elevated. In order to elevate an existing application, a new instance of the application process must be created...
-
O artigo techtarget.com Como elevar privilégios dos programas corretamente usando o UAC do Vista :
Programs can't be elevated once they've already been launched...
1 Você pode ajustar os privilégios em um token de acesso existente com a função AdjustTokenPrivileges , mas de acordo com o MSDN :
The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges.