Ermitteln Sie, ob PowerShell als Administrator ausgeführt wird

36

Wie kann ich in meinen Skripten feststellen, ob PowerShell mit Administratorrechten ausgeführt wird?

Ich muss wissen, weil ich versuche, ein Programm auszuführen, das die Fähigkeit erfordert, geschützte Ports zu öffnen.

Boomerang
quelle
1
Sie Matte elevate Berechtigungen prüfen , wie beschrieben Gaining Administratorrechte in Powershell Antwort
MiFreidgeim SO-stop Sein Übel

Antworten:

42
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

Aufteilen, was dies bewirkt:

  • [bool]- Wirf das Endergebnis auf a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Ruft das WindowsIdentityfür den aktuell ausgeführten Benutzer ab.
  • (...).groups- Rufen Sie die groupsEigenschaft der Identität auf, um herauszufinden, zu welchen Benutzergruppen die Identität gehört.
  • -match "S-1-5-32-544"Überprüft, ob groupsdie bekannte SID der Administratorgruppe enthalten ist. Die Identität enthält sie nur, wenn "Als Administrator ausführen" verwendet wurde.
RMazi
quelle
1
Kannst du bitte erklären, was es bewirkt, anstatt nur eine Codezeile zu posten? Dies hilft zukünftigen Besuchern, diese zu verstehen und gegebenenfalls anzupassen.
Slhck
BOOO. Geben Sie diesem Mann mehr Upvotes
Kolob Canyon
4
Ich bevorzuge die Antwort von @Bill_Stewart unten, da es frei von Zaubersprüchen ist.
8.
Anstatt zu verwenden -matchund zu [Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
tippen
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Dadurch wird die aktuelle Windows-Identität abgerufen und True zurückgegeben, wenn die aktuelle Identität die Administratorrolle hat (dh mit erhöhten Rechten ausgeführt wird).

Bill_Stewart
quelle
13
Während die akzeptierte Antwort korrekt ist, ist diese Antwort viel klarer, insbesondere für jemanden, der Ihr Skript in sechs Monaten lesen kann.
Patrick Seymour
46

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.

Eddiegroves
quelle
Was ist, wenn Sie eine Funktion möchten, die beendet wird, wenn sie nicht vom Administrator ausgeführt wird?
Kolob Canyon
1
@KolobCanyon - Es gibt keine Möglichkeit, nur eine PowerShell-Funktion mit erhöhten Rechten auszuführen . Der gesamte PowerShell-Prozess ist entweder erhöht oder nicht.
Bill_Stewart
@ Bill_Stewart ja, aber Sie können, returnwenn der Benutzer nicht admin ist :)
Kolob Canyon
1
@KolobCanyon - Sie können nur den PowerShell- Prozess erhöhen . Sie können keine einzelne Funktion erhöhen . Deshalb #Requires -RunAsAdministratorist das nützlich: Es verhindert, dass das gesamte Skript ausgeführt wird, wenn Sie nicht über einen erhöhten Status verfügen.
Bill_Stewart
@ Bill_Stewart Ja, ich werde das irgendwann benutzen müssen.
Kolob Canyon