cómo ejecutar un script de PowerShell como administrador

58

En mi escritorio de Windows 7, tengo script.ps1, que necesita privilegios de administrador (inicia un servicio). Quiero hacer clic en este script y ejecutarlo con privilegios de administrador.

¿Cuál es la forma más fácil de lograr esto?

Sajee
fuente

Respuestas:

49

Aquí hay una forma de hacerlo, con la ayuda de un icono adicional en su escritorio. Supongo que podría mover el script a otra persona si solo quisiera tener un solo icono en su escritorio.

  1. Cree un acceso directo a su secuencia de comandos Powershell en su escritorio
  2. Haga clic derecho en el acceso directo y haga clic en Propiedades
  3. Haga clic en la pestaña Acceso directo
  4. Haga clic en avanzado
  5. Seleccione Ejecutar como administrador

Ahora puede ejecutar la secuencia de comandos elevada haciendo doble clic en el nuevo acceso directo en su escritorio.

Kez
fuente
37
Esto funcionó para mí, pero en Ejecutar como administrador solamente llegó a estar disponible después de añadir powershell -f delante de la ruta del script, con el fin de "completo" el comando ...
mousio
2
@mousio - También necesitaba esto, gracias por el comentario
m.edmondson
@mousio, ¿puedes decirme por qué funciona ese comando?
SShaheen
77
@SShaheen: para que Ejecutar como administrador esté disponible, el acceso directo debe apuntar a algún tipo de ejecutable (por ejemplo, powershell.exe) en lugar de solo el documento o script al que apuntó originalmente el acceso directo. Un acceso directo a las script.ps1obras, al igual que un acceso directo a powershell.exe -f script.ps1, pero este último se puede configurar para que se ejecute como administrador (consulte powershell.exe /?la explicación del interruptor -fo -File)
mousio
16

En los sistemas habilitados para UAC, para asegurarse de que un script se esté ejecutando con todos los privilegios de administrador, agregue este código al comienzo del script:

param([switch]$Elevated)

function Test-Admin {
  $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
  $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) 
    {
        # tried to elevate, did not work, aborting
    } 
    else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}

exit
}

'running with full privileges'

cuando ejecute su script con el modificador elevado, intentará elevar los privilegios antes de ejecutarlo.

MDMoore313
fuente
Si el script requiere argumentos-parámetros?
Kiquenet
¿Qué pasa si esto me dice que se está ejecutando con todos los privilegios, pero mi código todavía dice que no hay suficientes privilegios administrativos?
mike.b93
@Kiquenet agréguelo en la param(...)parte superior y reenvíelos justo antes -elevated, deberá ser inteligente sobre cómo crear el ArgumentList, probablemente querrá usar el String[]formulario.
TWiStErRob
bastante ingenioso - mejor que crear un atajo
Mikey
13

Si estás en el mismo PowerShell, puedes hacer esto:

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"
mjsr
fuente
El problema con esto es que cambia el directorio de trabajo para el script llamado a C:\Windows\System32. Una alternativa que conserva el directorio actual: stackoverflow.com/a/57033941/2441655
Venryx
4

Dado que está sentado en su escritorio, diría que la forma más fácil de hacer esto es arrastrarlo al gadget de elevación .

De lo contrario, podría hacer un script por separado utilizando el elevatecomando en su script ps1.

O bien, puede aplicar elevatesolo al bit de inicio del servicio.

badp
fuente
1

PowerShell ISE vive en% windir% \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe. Puede hacer clic derecho en eso y seleccionar "Ejecutar como administrador" y ejecutar el script desde allí.

También puede encontrarlo bajo el logotipo de Windows> Todos los programas> Accesorios> Windows PowerShell y hacer lo mismo con esos accesos directos.

vapcguy
fuente
-1

Agregue esto al comienzo del script:

$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$testadmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if ($testadmin -eq $false) {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
exit $LASTEXITCODE
}
Antonio
fuente
Esto parece ser un subconjunto de la respuesta de MDMoore313 , de hace más de cuatro años.
Scott