En un script de PowerShell, ¿cómo puedo verificar si estoy ejecutando con privilegios de administrador?

Respuestas:

35
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

(de los trucos de seguridad de la línea de comando )

davey
fuente
2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrador)) {(get- host) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Advertencia: PowerShell se está ejecutando como Administrador. n"}
davey
Primera línea: última llave de cierre) falta. No puedo solucionarlo, ya que hay menos de 6 caracteres de cambio.
Xavier Nicollet
57

En Powershell 4.0 puede usar require en la parte superior de su script:

#Requires -RunAsAdministrator

Salidas:

El script 'MyScript.ps1' no se puede ejecutar porque contiene una instrucción "#requires" para ejecutarse como Administrador. La sesión actual de Windows PowerShell no se ejecuta como Administrador. Inicie Windows PowerShell utilizando la opción Ejecutar como administrador e intente ejecutar el script nuevamente.

Eddiegroves
fuente
No es exactamente lo que estaba buscando, pero sigue siendo muy útil. Gracias Eddie!
Michael Kelley
33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Ejecute la función anterior. SI el resultado es Verdadero, el usuario tiene privilegios de administrador.

Shay Levy
fuente
44
Esto solo determina si el usuario que ejecuta el script es un administrador en la máquina, y no si el script se está ejecutando actualmente con privilegios administrativos . En otras palabras, esto seguirá siendo cierto incluso si el usuario no usó "ejecutar como administrador" para iniciar el shell de comandos.
Desarrollador holístico
2
@HolisticDeveloper, eso es incorrecto. Si no está elevado, devolverá falso
charleswj81
@ charleswj81 a partir de ahora observo el comportamiento que describe Holistic Developer.
zneak
No creo que necesites el punto y coma ... pero eso dice que tampoco creo que arroje un error
Kolob Canyon
Esto funciona para mí en Win10 a partir de 2018. Devuelve False si la cuenta de usuario actual no está elevada, devuelve True si powershell se está ejecutando elevado.
arberg
0

Esto verificará si usted es un administrador; de lo contrario, se volverá a abrir en PowerShell ISE como administrador.

¡Espero que esto ayude!

    $ver = $host | select version
    if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}

    # Verify that user running script is an administrator
    $IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
    If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
    {
      "`nERROR: You are NOT a local administrator.  Run this script after logging on with a local administrator account."
        # We are not running "as Administrator" - so relaunch as administrator

        # Create a new process object that starts PowerShell
        $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";

        # Specify the current script path and name as a parameter
        $newProcess.Arguments = $myInvocation.MyCommand.Definition;

        # Indicate that the process should be elevated
        $newProcess.Verb = "runas";

        # Start the new process
        [System.Diagnostics.Process]::Start($newProcess);

        # Exit from the current, unelevated, process
        exit
    }
blayderunner123
fuente
0

Como una combinación de las respuestas anteriores, puede usar algo como lo siguiente al comienzo de su script:

# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator  
{  
    [OutputType([bool])]
    param()
    process {
        [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
        return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
    }
}

if(-not (Test-Administrator))
{
    # TODO: define proper exit codes for the given errors 
    Write-Error "This script must be executed as Administrator.";
    exit 1;
}

$ErrorActionPreference = "Stop";

# do something

Otro método es iniciar su secuencia de comandos con esta línea, lo que evitará su ejecución cuando no se inicie con derechos de administrador.

#Requires -RunAsAdministrator
MovGP0
fuente
1
Lamentablemente, esto no funciona. Si el script no se ejecuta con derechos elevados, ni siquiera se cargará y no verá su mensaje de error personalizado.
JamesQMurphy
Gracias. He corregido mi respuesta anterior.
MovGP0