Jak mogę sprawdzić w skrypcie PowerShell, czy korzystam z uprawnień administratora?

Odpowiedzi:

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

(z trików bezpieczeństwa z linii poleceń )

davey
źródło
2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) i {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator)) {(get- host) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Ostrzeżenie: PowerShell działa jako administrator. n"}
davey
Brakuje pierwszego wiersza: ostatnia klamra zamykająca). Nie mogę tego naprawić, ponieważ zmiana jest mniejsza niż 6 znaków.
Xavier Nicollet
57

W programie Powershell 4.0, którego można używać, wymaga u góry skryptu:

#Requires -RunAsAdministrator

Wyjścia:

Nie można uruchomić skryptu „MyScript.ps1”, ponieważ zawiera on instrukcję „#requires” do działania jako administrator. Bieżąca sesja Windows PowerShell nie działa jako administrator. Uruchom program Windows PowerShell, używając opcji Uruchom jako administrator, a następnie spróbuj ponownie uruchomić skrypt.

eddiegroves
źródło
Nie do końca to, czego szukałem, ale nadal bardzo przydatne. Dzięki Eddie!
Michael Kelley,
33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Wykonaj powyższą funkcję. JEŻELI wynik ma wartość True, użytkownik ma uprawnienia administratora.

Shay Levy
źródło
4
Określa to tylko, czy użytkownik uruchamiający skrypt jest administratorem komputera - a nie, czy skrypt jest obecnie wykonywany z uprawnieniami administratora . Innymi słowy, to nadal zwróci wartość true, nawet jeśli użytkownik nie użył polecenia „uruchom jako administrator” do uruchomienia powłoki poleceń.
Holistic Developer
2
@HolisticDeveloper, to jest niepoprawne. Jeśli nie zostaniesz podniesiony, zwróci fałsz
charleswj81
@ charleswj81 Od tej chwili obserwuję zachowanie opisane przez Holistic Developer.
zneak
Nie sądzę, żebyś potrzebował średnika ... ale to powiedziawszy, nie wydaje mi się, żeby to również spowodowało błąd
Kolob Canyon
Działa to dla mnie na Win10 od 2018 roku. Zwraca False, jeśli bieżące konto użytkownika nie jest podniesione, zwraca True, jeśli PowerShell jest podniesiony.
arberg
0

Spowoduje to sprawdzenie, czy jesteś administratorem, jeśli nie, to zostanie ponownie otwarte w programie PowerShell ISE jako administrator.

Mam nadzieję że to pomoże!

    $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
źródło
0

jako kombinację powyższych odpowiedzi na początku skryptu możesz użyć czegoś takiego:

# 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

Inną metodą jest uruchomienie skryptu za pomocą tego wiersza, co zapobiegnie jego wykonaniu, jeśli nie zostanie uruchomiony z uprawnieniami administratora.

#Requires -RunAsAdministrator
MovGP0
źródło
1
Niestety to nie działa. Jeśli skrypt nie jest uruchamiany z podwyższonymi uprawnieniami, to nawet się nie załaduje i nie zobaczysz niestandardowego komunikatu o błędzie.
JamesQMurphy
Dzięki. Poprawiłem swoją odpowiedź powyżej.
MovGP0