Как проверить, запущен ли скрипт PowerShell или терминал PowerShell от имени администратора? (РЕШЕНО)

Если вам нужно запустить скрипт PowerShell с правами администратора, вы можете проверить, имеет ли текущий процесс powershell.exe или pwsh.exe повышенные разрешения прямо в вашем коде PS.

К тому же, иногда нужно определить, запущен ли терминал с повышенными привилегиями или с правами обычного пользователя.

Связанная статья: Как запустить PowerShell с правами администратора

Как определить, запущен ли терминал PowerShell с правами администратора

В первую очередь, обратите внимание на приглашение командной строки:

Окно PowerShell открывается с текущей рабочей директорией в C:\windows\system32 и соответственно там следующее приглашение командной строки:

PS C:\windows\system32>

Если у процесса PowerShell обычные права, то в качестве текущей рабочей директории открывается папка пользователя:

PS C:\Users\MiAl>

Всё становится сложнее, если PowerShell используется через Windows Terminal. Посмотрите на этот скриншот, один из этих терминалов открыт от имени администратора, а второй от имени обычного пользователя — они ничем не различаются.

Это был тест на внимательность — в названии окна с правами администратора имеется слово Administrator.

Когда вам нужно узнать, есть ли права администратора у данной оболочки, последовательно выполните следующие две команды:

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

Консоль PowerShell с правами администратора выведет True, консоль с обычными правами выведет False:

Кстати, этот же способ можно использовать и в скриптах.

Как в скрипте PowerShell проверить, что он запущен от имени администратора

Следующий код PowerShell можно использовать для проверки того, работает ли текущий сценарий в режиме «Запуск от имени администратора»:

Write-Host "Проверяем повышенные права..."
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
[Security.Principal.WindowsBuiltInRole] "Administrator")) {
	Write-Warning "Недостаточные разрешения для скрипта. Откройте консоль PowerShell как администратор и вновь запустите этот скрипт."
	Break
}
else {
	Write-Host "Код запущен от имени администратора — продолжаем выполнение скрипта..." -ForegroundColor Green
}

Сохраните код PowerShell в файле check_process_elevation.ps1 и запустите его в консоли без прав администратора:

C:\PS\check_process_elevation.ps1

Как видите, появилось сообщение, что у вас нет прав администратора, поэтому сценарий PowerShell был остановлен.

Теперь запустите сценарий в сеансе PowerShell с повышенными привилегиями. Как видите, сценарий обнаружил, что этот сеанс PowerShell запущен от имени администратора.

Также вы можете запросить повышение прав прямо из сценария PowerShell. Для этого вместо строки:

Write-Warning "Недостаточно прав…”

используйте следующий код:

Start-Process Powershell -ArgumentList $PSCommandPath -Verb RunAs

При запуске сценария без прав администратора он будет повторно запущен в новом сеансе PowerShell с повышенными привилегиями, и вы увидите запрос на повышение прав UAC. Если вы примете его, ваш сценарий PS1 будет запущен от имени администратора. (Путь к текущему файлу сценария PowerShell передаётся с помощью переменной среды $PSCommandPath.)

В PowerShell 4.0 или новее ещё проще проверить, работает ли ваш скрипт с правами администратора. Для этого используйте директиву -RunAsAdministrator.

#requires -version 4.0
#requires -RunAsAdministrator
Write-Host "PowerShell запущен от имени администратора" -ForegroundColor Green

Если скрипт не запускается под администратором, появится следующая ошибка:

C:\PS\check_process_elevation.ps1: The script 'check_process_elevation.ps1' cannot be run because it contains a "#requires" statement for running as Administrator. The current PowerShell session is not running as Administrator. Start PowerShell by using the Run as Administrator option, and then try running the script again.

Если вы запустите сценарий на компьютере с PowerShell v2, появится следующее сообщение об ошибке:

Cannot process the “#requires” statement at line 2 because it is not in the correct format.
The “#requires” statement must be in one of the following formats:
“#requires -shellid <shellID>”
“#requires -version <major.minor>”
“#requires -pssnapin <psSnapInName> [-version ]”

Для управления Active Directory вам может потребоваться другая задача: проверить, есть ли у текущего пользователя права администратора домена из сценария PowerShell. Используйте следующий код:

If(([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Domain Admins"))
{
	# у пользователя, запустившего этого скрипт, есть права Domain Admins (админа домена)
}
Else
{
	# нет прав Domain Admins (админа домена)
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *