Ok, a razão pela qual isso não funciona é o modelo de segurança no Windows Vista e mais recente. Uma conta no grupo de administradores ainda executa tudo que não é explicitamente elevado como um usuário limitado. A exceção é a Administrator
conta, que executa tudo elevado. Por esse motivo, geralmente é considerado ruim usá-lo como sua conta de login e normalmente está desativado.
Você pode habilitá-lo e depois runas
invocar como essa conta. Isso apresenta alguns problemas - agora você está executando o ambiente de um usuário diferente, que pode ter diferentes variáveis de ambiente definidas. 1
A melhor maneira de fazer isso seria realmente elevar-se como seu usuário atual via UAC. Infelizmente, o prompt de comando padrão não inclui esse recurso - mas os programas de terceiros e o PowerShell e WSHell (VBScript) internos podem fazê-lo.
Tomando emprestado da minha outra resposta , você pode invocar o comando do PowerShell diretamente com powershell -c
:
powershell -c start -verb runas notepad C:\Windows\System32\drivers\etc\hosts
que basicamente diz ao PowerShell para executar o seguinte (com o start
alias de Start-Process
):
Start-Process -Verb "runas" notepad C:\Windows\System32\drivers\etc\hosts
O truque aqui é passar o verbo runas
, acionando o UAC.
Nem Start-Process -Verb runas
o cmd padrão runas
passará no diretório de trabalho atual ; portanto, sempre use o caminho completo em todos os comandos que você elevar dessa maneira.
Observe também que alguns argumentos como -c
podem colidir com Start-Process
argumentos; portanto, a maneira mais segura é:
powershell "-c start -verb runas commandname -argumentlist 'arg1 arg2'"
1 Nota: isso se aplica apenas às variáveis de ambiente do usuário . As variáveis de ambiente definidas em um processo pai não são transmitidas pelo UAC ! Isso também se aplica a runas
, e é ainda pior lá, porque você não receberá os vars do usuário correto.