Em um script do PowerShell, como posso verificar se estou executando com privilégios de administrador?

Respostas:

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

(dos truques de segurança da linha de comando )

davey
fonte
2
$ currentPrincipal = Novo objeto Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator)) {(get- host) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Aviso: O PowerShell está sendo executado como administrador."} "
davey
Primeira linha: última chave de fechamento) está ausente. Não consigo corrigi-lo, pois há menos de 6 caracteres alterados.
Xavier Nicollet
57

No Powershell 4.0, você pode usar os requisitos na parte superior do seu script:

#Requires -RunAsAdministrator

Saídas:

O script 'MyScript.ps1' não pode ser executado porque contém uma instrução "#requires" para ser executada como Administrador. A sessão atual do Windows PowerShell não está sendo executada como administrador. Inicie o Windows PowerShell usando a opção Executar como administrador e tente executar o script novamente.

eddiegroves
fonte
Não é exatamente o que eu estava procurando, mas ainda é muito útil. Obrigado Eddie!
Michael Kelley
33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Execute a função acima. Se o resultado for True, o usuário terá privilégios de administrador.

Shay Levy
fonte
4
Isso determina apenas se o usuário que está executando o script é um administrador na máquina - e não se o script está sendo executado no momento com privilégios administrativos . Em outras palavras, isso ainda retornará verdadeiro, mesmo que o usuário não tenha usado "executar como administrador" para iniciar o shell de comando.
Holistic Developer
2
@HolisticDeveloper, está incorreto. Se você não são elevados, ela retornará falso
charleswj81
@ charleswj81 a partir de agora, observo o comportamento que o Holistic Developer descreve.
zneak
Eu não acho que você precise do ponto e vírgula ... mas isso disse que eu também não acho que gera um erro #
Kolob Canyon
Isso funciona para mim no Win10 a partir de 2018. Retorna False se a conta de usuário atual não for elevada, retorna True se o PowerShell estiver executando elevado.
Arberg # 16/18
0

Isso verificará se você é um administrador, caso contrário, ele será reaberto no PowerShell ISE como administrador.

Espero que isto ajude!

    $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
fonte
0

como uma combinação das respostas acima, você pode usar algo como o seguinte no início do seu 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

Outro método é iniciar seu script com esta linha, o que impedirá sua execução quando não for iniciado com direitos de administrador.

#Requires -RunAsAdministrator
MovGP0
fonte
1
Infelizmente, isso não funciona. Se o script não for executado com direitos elevados, ele nem será carregado e você não verá sua mensagem de erro personalizada.
JamesQMurphy
Obrigado. Corrigi minha resposta acima.
MovGP0