Wie kann ich in einem PowerShell-Skript überprüfen, ob ich mit Administratorrechten ausgeführt werde?


Antworten:


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

(von Kommandozeilen-Sicherheitstricks )


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 "Warnung: PowerShell wird als Administrator ausgeführt.`n"}
davey

Erste Zeile: letzte schließende Klammer) fehlt. Ich kann das Problem nicht beheben, da sich weniger als 6 Zeichen ändern.
Xavier Nicollet

57

In Powershell 4.0 können Sie verwenden , erfordert am Anfang des Skripts:

#Requires -RunAsAdministrator

Ausgänge:

Das Skript 'MyScript.ps1' kann nicht ausgeführt werden, da es die Anweisung "#requires" enthält, um als Administrator ausgeführt zu werden. Die aktuelle Windows PowerShell-Sitzung wird nicht als Administrator ausgeführt. Starten Sie Windows PowerShell mit der Option Als Administrator ausführen, und führen Sie das Skript erneut aus.


Nicht genau das, wonach ich gesucht habe, aber immer noch sehr nützlich. Danke Eddie!
Michael Kelley

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

Führen Sie die obige Funktion aus. WENN das Ergebnis True ist, hat der Benutzer Administratorrechte.


4
Dies bestimmt nur, ob der Benutzer, der das Skript ausführt, ein Administrator auf dem Computer ist - und nicht, ob das Skript derzeit mit Administratorrechten ausgeführt wird . Mit anderen Worten, dies wird immer noch true zurückgeben, selbst wenn der Benutzer "Als Administrator ausführen" nicht zum Starten der Befehlsshell verwendet hat.
Holistic Developer

2
@ HolisticDeveloper, das ist falsch. Wenn Sie nicht erhöht sind, wird es false zurückgeben
charleswj81

@ charleswj81 Ab sofort beobachte ich das Verhalten, das Holistic Developer beschreibt.
Zneak

Ich glaube nicht, dass Sie das Semikolon brauchen ... aber das heißt, ich glaube auch nicht, dass es einen Fehler auslöst
Kolob Canyon

Dies funktioniert für mich unter Win10 ab 2018. Gibt False zurück, wenn das aktuelle Benutzerkonto nicht erhöht ist, und True, wenn Powershell erhöht ausgeführt wird.
Arberg

0

Hiermit wird überprüft, ob Sie ein Administrator sind. Andernfalls wird es in PowerShell ISE als Administrator erneut geöffnet.

Hoffe das hilft!

    $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

Als Kombination der obigen Antworten können Sie am Anfang Ihres Skripts Folgendes verwenden:

# 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

Eine andere Methode besteht darin, Ihr Skript mit dieser Zeile zu starten, wodurch die Ausführung verhindert wird, wenn es nicht mit Administratorrechten gestartet wird.

#Requires -RunAsAdministrator

1
Das funktioniert leider nicht. Wenn das Skript nicht mit erhöhten Rechten ausgeführt wird, wird es nicht einmal geladen, und Ihre benutzerdefinierte Fehlermeldung wird nicht angezeigt.
JamesQMurphy

Vielen Dank. Ich habe meine Antwort oben korrigiert.
MovGP0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.