Определить, работает ли PowerShell от имени администратора

36

Как я могу определить в своих сценариях, работает ли PowerShell с правами администратора?

Мне нужно знать, потому что я пытаюсь запустить программу, которая требует возможности открывать защищенные порты.

Бумеранг
источник
1
Вы можете рассмотреть возможность повышения разрешений, как описано в
разделе «

Ответы:

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

Разбивая, что это делает:

  • [bool]- Привести конечный результат к bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Получает WindowsIdentityдля текущего работающего пользователя.
  • (...).groups- Доступ к groupsсвойству удостоверения, чтобы узнать, к каким группам пользователей принадлежат удостоверения.
  • -match "S-1-5-32-544"проверяет, groupsсодержит ли общеизвестный SID группы «Администраторы», удостоверение будет содержать его, только если использовался «запуск от имени администратора».
RMazi
источник
2
Вместо того, чтобы просто разместить строку кода, не могли бы вы объяснить, что он делает? Это помогает будущим посетителям понять и адаптировать его, если это необходимо.
slhck
Booo. Дайте этому человеку больше голосов
Каньон Колоб
4
Я предпочитаю ответ @Bill_Stewart ниже, так как в нем нет волшебных строк.
8
Вместо того, чтобы использовать -matchи [Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
Typecasting
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Это извлекает текущую идентификацию Windows и возвращает True, если текущая идентификация имеет роль администратора (т. Е. Выполняется с повышенными правами).

Bill_Stewart
источник
13
Хотя принятый ответ является правильным, этот ответ гораздо яснее, особенно для тех, кто может прочитать ваш сценарий через шесть месяцев.
Патрик Сеймур
46

В Powershell 4.0 вы можете использовать требования в верхней части вашего скрипта:

#Requires -RunAsAdministrator

Выходы:

Сценарий «MyScript.ps1» не может быть запущен, поскольку он содержит оператор «#requires» для запуска в качестве администратора. Текущий сеанс Windows PowerShell не работает от имени администратора. Запустите Windows PowerShell с помощью параметра «Запуск от имени администратора» и попробуйте снова запустить сценарий.

eddiegroves
источник
Что делать, если вы хотите выйти из функции, если она не запущена администратором?
Каньон Колоб
1
@KolobCanyon - нет такой вещи, как запуск только функции PowerShell с повышенными правами ; весь процесс PowerShell либо повышен, либо нет.
Bill_Stewart
@Bill_Stewart да, но вы можете, returnесли пользователь не является администратором :)
Каньон Колоб
1
@KolobCanyon - вы можете поднять только процесс PowerShell ; Вы не можете повысить одну функцию . Вот почему #Requires -RunAsAdministratorэто полезно: он предотвращает запуск всего скрипта, если вы не повышены.
Bill_Stewart
@Bill_Stewart Да, мне придется использовать это в какой-то момент.
Каньон Колоб