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ń )


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.


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.


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
    }

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.