script - ¿Cómo puedo ejecutar powershell como administrador Y con argumentos de un archivo por lotes?
ejecutar script powershell como administrador (2)
Puede hacer esto tomando un ejecutable corto de línea de comandos que escribí llamado Elevate32.exe (o Elevate64.exe para la versión de 64 bits). Puedes obtenerlo aqui:
http://www.westmesatech.com/misctools.html (ElevationToolkit1.zip)
Ejemplo:
elevate64 -- powershell.exe -file C:/scripts/myscriptfile.ps1
Todo después --
es la línea de comando que desea elevar.
He encontrado respuestas para ambas tareas por separado, pero no juntas:
Ejecute powershell como administrador desde un archivo por lotes
Ejecute powershell con argumentos de un archivo por lotes
Pero quiero ejecutar powershell como administrador Y con argumentos de un archivo por lotes.
Por esta razón, estoy convencido de que esto no es un duplicado hasta el momento.
Este problema es complicado por esta razón:
Estoy usando el ArgumentList
para apuntar a la ruta del archivo cuando se ejecuta una PowerShell elevada. También lo estoy usando para pasar argumentos. Por separado, he podido usar este interruptor con éxito. Sin embargo, no parece que pueda usarlo para ambas tareas.
Así es como estoy usando PowerShell actualmente:
Como administrador:
powershell -Command "& {Start-Process powershell -ArgumentList ''-File "filePath.ps1'' -Verb RunAs}"
Con argumentos:
powershell -ExecutionPolicy unrestricted Import-Module "filePath.ps1" -ArgumentList "arg1","arg2"
Lo que he intentado:
Intenté simplemente agregar mis argumentos a ArgumentList
donde se pasa el archivo, pero no fueron reconocidos.
También traté de agregar -Verb RunAs
a la línea de argumento de trabajo, pero powershell pensó que estaba tratando de pasar otro argumento llamado Verb, y no pudo ejecutar powershell as y admin.
¿Es posible lograr tanto el funcionamiento de powershell como un administrador, y con argumentos, cambiando cómo estoy pasando argumentos, o cómo estoy elevando el powershell?
Es posible resolver su problema sin herramientas de terceros, pero la solución es un tanto arcana.
Por lo tanto, considere descargar las útiles herramientas elevate32
y elevate64
Bill Stewart en su lugar, como se describe en su respuesta , que simplifican la solución.
Este es un ejemplo simple que invoca el cmdlet Get-Date
con argumentos en una sesión de PowerShell elevada iniciada desde cmd.exe
(o un archivo por lotes):
powershell -command "start-process -verb runas powershell" "''-noexit -command get-date -UFormat %s''"
Observe cómo la línea de comando para pasar a la sesión PS elevada que el argumento de comando intermedio crea se pasa como un único argumento encerrado entre comillas simples .
Citar puede ser complicado, pero este enfoque también funciona con la invocación de archivos *.ps1
en principio:
powershell -command "start-process -verb runas powershell"
es la parte invariable de la línea de comando.El resto de cadena
"..."
debe contener una cadena individual anidada con comillas que PowerShell reconoce (las comillas simples son más fáciles) que contienen todos los argumentos que pasaría directamente a una invocación de línea de comandos depowershell ...
Aplicado a tu ejemplo:
... "''-File C:/path/to/filePath.ps1 arg1 arg2''"
Nota: asegúrese de utilizar la ruta completa al archivo de secuencia de comandos , ya que la sesión de PS elevada no se ejecuta (necesariamente) en el mismo directorio que la sesión de llamada.
Si necesita citar los argumentos dentro de la cadena anidada, use /"
:
... "''-File /"c:/path with spaces/to/filePath.ps1/" arg1 arg2''"