Wykryj, czy PowerShell działa jako administrator

36

Jak mogę sprawdzić w moich skryptach, czy PowerShell działa z uprawnieniami administratora?

Muszę wiedzieć, ponieważ próbuję uruchomić program, który wymaga możliwości otwierania chronionych portów.

Bumerang
źródło
1
Rozważasz

Odpowiedzi:

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

Podział na to, co to robi:

  • [bool]- Rzuć wynik końcowy na a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Pobiera WindowsIdentitydla aktualnie uruchomionego użytkownika.
  • (...).groups- Uzyskaj dostęp do groupswłaściwości tożsamości, aby dowiedzieć się, do jakich grup użytkowników należy tożsamość.
  • -match "S-1-5-32-544"sprawdza, czy groupszawiera dobrze znany identyfikator SID grupy Administratorzy, tożsamość będzie go zawierała tylko wtedy, gdy użyto opcji „uruchom jako administrator”.
RMazi
źródło
2
Czy zamiast po prostu napisać wiersz kodu, możesz wyjaśnić, co on robi? Pomaga to przyszłym odwiedzającym w zrozumieniu i dostosowaniu go, jeśli to konieczne.
slhck
BOOO. Daj temu człowiekowi więcej pozytywnych opinii
Kolob Canyon
4
Wolę odpowiedź @Bill_Stewart poniżej, ponieważ jest wolna od magicznych sznurków.
8DH
Zamiast używania -matchi rzutowania [Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
czcionek
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Pobiera bieżącą tożsamość systemu Windows i zwraca wartość True, jeśli bieżąca tożsamość ma rolę administratora (tzn. Działa z podwyższonym poziomem uprawnień).

Bill_Stewart
źródło
13
Chociaż zaakceptowana odpowiedź jest poprawna, ta odpowiedź jest znacznie bardziej wyraźna, szczególnie dla kogoś, kto może czytać twój skrypt za sześć miesięcy.
Patrick Seymour
46

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
co jeśli chcesz funkcji, która kończy działanie, jeśli nie jest uruchamiana przez administratora?
Kolob Canyon
1
@KolobCanyon - Nie ma czegoś takiego jak uruchomienie tylko podniesionej funkcji PowerShell; cały proces PowerShell jest podwyższony lub nie.
Bill_Stewart
@Bill_Stewart tak, ale możesz, returnjeśli użytkownik nie jest administratorem :)
Kolob Canyon
1
@KolobCanyon - możesz jedynie podnieść proces PowerShell ; nie można podnieść ani jednej funkcji . Dlatego #Requires -RunAsAdministratorjest przydatny: Zapobiega uruchomieniu całego skryptu, jeśli nie masz uprawnień .
Bill_Stewart
@Bill_Stewart Tak, w pewnym momencie będę musiał tego użyć.
Kanion Kolob