Ok, la ragione per cui questo non funziona è il modello di sicurezza in Windows Vista e versioni successive. Un account nel gruppo amministratori esegue comunque tutto ciò che non è esplicitamente elevato come utente limitato. L'eccezione è l' Administratoraccount, che esegue tutto elevato. Per questo motivo, è considerato generalmente errato utilizzare come account di accesso ed è normalmente disabilitato.
È possibile abilitarlo e quindi runasinvocare come tale account. Ciò introduce alcuni problemi: ora stai funzionando con l'ambiente di un altro utente, che potrebbe avere diverse variabili d'ambiente impostate. 1
Il modo migliore per farlo sarebbe effettivamente elevare come utente corrente tramite UAC. Sfortunatamente, il prompt dei comandi standard non include questa funzionalità, ma sia i programmi di terze parti che PowerShell e WSHell (VBScript) integrati possono farlo.
Prendendo in prestito dall'altra mia risposta , puoi invocare il comando PowerShell direttamente con powershell -c:
powershell -c start -verb runas notepad C:\Windows\System32\drivers\etc\hosts
che sostanzialmente dice a PowerShell di eseguire quanto segue ( startè alias Start-Process):
Start-Process -Verb "runas" notepad C:\Windows\System32\drivers\etc\hosts
Il trucco qui è passare il verbo runas, innescando UAC.
Né Start-Process -Verb runasil cmd standard runaspasserà la directory di lavoro corrente , quindi usa sempre il percorso completo in tutti i comandi che elevi in questo modo.
Si noti inoltre che alcuni argomenti come -cpotrebbero essere in conflitto con Start-Processargomenti, quindi il modo più sicuro è:
powershell "-c start -verb runas commandname -argumentlist 'arg1 arg2'"
1 Nota: questo vale solo per le variabili d'ambiente dell'utente . Le variabili d'ambiente impostate in un processo parent non vengono trasmesse da UAC ! Questo vale anche per runas, ed è anche peggio lì perché non otterrai nemmeno i vars dell'utente corretto.