In uno script di PowerShell, come posso verificare se sto eseguendo i privilegi di amministratore?


Risposte:


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

(dai trucchi di sicurezza della riga di comando )


2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator)) {(get- host) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Avvertenza: PowerShell è in esecuzione come amministratore`n"}
davey

Prima riga: ultima parentesi graffa di chiusura) mancante. Non riesco a risolverlo perché cambia meno di 6 caratteri.
Xavier Nicollet,

57

In Powershell 4.0 è possibile utilizzare i requisiti nella parte superiore dello script:

#Requires -RunAsAdministrator

Uscite:

Lo script "MyScript.ps1" non può essere eseguito perché contiene un'istruzione "#requires" per l'esecuzione come amministratore. L'attuale sessione di Windows PowerShell non è in esecuzione come amministratore. Avviare Windows PowerShell utilizzando l'opzione Esegui come amministratore, quindi riprovare a eseguire lo script.


Non esattamente quello che stavo cercando, ma comunque molto utile. Grazie Eddie!
Michael Kelley,

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

Eseguire la funzione sopra. Se il risultato è True, l'utente dispone dei privilegi di amministratore.


4
Questo determina solo se l'utente che esegue lo script è un amministratore sulla macchina e non se lo script è attualmente in esecuzione con privilegi di amministratore . In altre parole, ciò tornerà comunque vero anche se l'utente non ha utilizzato "Esegui come amministratore" per avviare la shell dei comandi.
Sviluppatore olistico,

2
@HolisticDeveloper, che non è corretto. Se non sei elevato, restituirà false
charleswj81 l'

@ charleswj81 fin d'ora osservo il comportamento descritto da Holistic Developer.
zneak,

Non penso che tu abbia bisogno del punto e virgola ... ma ciò ha detto che non penso che si verifichi un errore
Kolob Canyon

Questo funziona per me su Win10 a partire dal 2018. Restituisce False se l'account utente corrente non è elevato, restituisce True se PowerShell è in esecuzione elevato.
arberg,

0

Questo controllerà se sei un amministratore, altrimenti riaprirà in PowerShell ISE come amministratore.

Spero che sia di aiuto!

    $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
    }

0

come combinazione delle risposte sopra, puoi usare qualcosa come il seguente all'inizio del tuo 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

Un altro metodo è avviare lo script con questa riga, che ne impedirà l'esecuzione quando non viene avviato con i diritti di amministratore.

#Requires -RunAsAdministrator

1
Sfortunatamente, questo non funziona. Se lo script non viene eseguito con diritti elevati, non verrà nemmeno caricato e non verrà visualizzato il messaggio di errore personalizzato.
JamesQMurphy

Grazie. Ho corretto la mia risposta sopra.
MovGP0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.