Запустите сценарий PowerShell от имени другого пользователя с повышенными правами.

Я знаю, что это похоже на повторяющийся вопрос, но я пробовал решения, и они мне не помогли.

Нам нужно запустить скрипт с нашими учетными записями домена, а также выполнить его с повышенными правами. Это не проблема на большинстве устройств, поскольку ярлык запускается от имени администратора и запрашивает учетные данные. Однако, если пользователь является локальным администратором, нам не запрашиваются учетные данные (только запрос UAC «да/нет»).

Я не понимаю, почему это не работает:

      # Get identity of script user
$identity = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()

# Elevate the script if not already
if ($identity.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host -F Green 'ELEVATED'
} else {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Exit
}

# Ensure the script has domain privileges
if ($identity.IsInRole('[domain]\[admin group]')) {
    Write-Host -F Green 'DOMAIN ADMIN'
} else {
    Start-Process PowerShell -Verb RunAsUser "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Pause # required, otherwise the Exit below closes the UAC prompt
    Exit
}
Pause

Когда сценарий с самоповышением запускается при вводе учетных данных пользователя и домена, он теряет права... т.е.Start-Process -Verb RunAsUser powershellзапускается из PowerShell с повышенными правами, он сам не имеет повышенных прав.

Я также попробовал следующее:

      Start-Process powershell -verb RunAs -argumentlist "Start-Process powershell.exe -Verb RunAsUser `"& path\to\script.ps1`""

Это не удается, потому что администратор домена не имеет доступа к каталогу сценариев... если только у него нет повышенных прав.

3 ответа

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

ВыполнитеStart-Process Powershellнемного иначе, чем вы выполняли его, чтобы он выполнял действия логики сценария при работе с повышенными правами. ДобавитьExecutionPolicy Bypass -NoProfile -Fileпараметры и после этого запустите скрипт, чтобы он заработал.

Примечание. Оба приведенных ниже примера решения PowerShell используют корень диска «C» по адресу.C:\локальной файловой системы, но вы можете настроить ее соответствующим образом.

PowerShell (Решение 1)

      Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

Если вам необходимо пройти аутентификацию с использованием учетных данных домена для первоначального доступа к пути к сценарию, вы можете использоватьinvoke-commandс-credentialпараметр для выполнения операции копирования. Затем вы можете выполнить сценарий, скопированный в локальную файловую систему, с повышенными правами таким образом.

PowerShell (Решение 2)

      $cred = Get-Credential "domain\username";
Invoke-Command -ScriptBlock {
    Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
    } -Credential $cred;

Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

Вспомогательные ресурсы

Альтернативным инструментом является бесплатный инструмент sysinternals PsExec.

Команда будет выглядеть так:

      psexec -u domain\user -h -i command [arguments]

Параметры:

  • -i: Запустить программу, чтобы она взаимодействовала с рабочим столом указанного сеанса в удаленной системе. Если сеанс не указан, процесс запускается в сеансе консоли.
  • -h: если целевая система — Vista или более поздняя версия, процесс запускается с повышенным токеном учетной записи, если он доступен.

Небезопасной практикой также является указание пароля:

-p: указывает необязательный пароль для имени пользователя. Если вы пропустите этот параметр, вам будет предложено ввести скрытый пароль.

Насколько я понимаю, обычно исполняющий пользователь и привилегии текущего процесса не могут быть изменены во время выполнения процесса, но они устанавливаются во время запуска процесса ядром операционной системы.
Поэтому вам следует отделить блок кода, который вы хотите запустить с повышенными правами, и запустить его с помощью RunAs (или его проверок).
Если изменение привилегий внутри процесса возможно, это станет очень опасной дырой в безопасности операционной системы.

Кроме того, локальная привилегия () и доменная привилегия () определяются отдельно.
Если вы хотите разрешить оба AND , вам нужно сделать оба:

  • предоставить в локальную группу компьютерной безопасности, И
  • предоставитьв группу безопасности доменаDomainA\AdminGroup

а затем выполните сценарий с помощью RunAs.

Другие вопросы по тегам