#powershell #invoke-command
#powershell #invoke-command
Вопрос:
Я пытаюсь запустить invoke-command для запуска a powershell script in a powershell file
на a remote computer
. Я использую credentials for a user with Administrator privilege
. Команда должна быть выполнена running powershell as an administrator
. Существуют проблемы с лицензированием приложения, которое я пытаюсь вызвать с помощью сценария powershell, поэтому я не могу изменить учетные данные на Administrator, но должен запускаться с самим этим конкретным пользователем. Я попытался использовать -RunAsAdministrator
в конце Invoke-Command, но я получил сообщение об ошибке:
Invoke-Command : Parameter set cannot be resolved using the specified named parameters.
$command = {
cd Folder
C:Folderbuild.ps1
}
Invoke-Command -ComputerName $RemoteSystemIP -ScriptBlock $command -credential $Credentials1 -ErrorAction Stop -AsJob
Я пытаюсь выполнить это как фоновое задание, поэтому я добавил -AsJob
параметр.
Прошло несколько дней, и я еще не нашел решения.
Ответ №1:
tl; dr
- Единственный способ заставить удаленный сеанс PowerShell выполняться с повышенными правами (с правами администратора) — это подключиться к учетной записи пользователя (либо неявно, либо через
-Credential
), которая имеет права администратора на целевой машине. - С такой учетной записью сеанс автоматически и неизменно запускается с повышенными правами.
Переключатель Invoke-Command
s -RunAsAdministrator
можно использовать только с контейнерами (виртуализация) -ContainerId
(параметр), а не с обычным удаленным доступом ( -ComputerName
параметр).
Вы не можете повышать уровень по требованию в удаленном сеансе (как вы можете локально, в интерактивном Start-Process -Verb RunAs
режиме).[1]
Вместо этого вы должны убедиться, что учетные данные, которые вы передаете Invoke-Command -Credential
для подключения к удаленной машине, относятся к учетной записи пользователя, которая (также) имеет права администратора на целевой машине, и в этом случае удаленный сеанс автоматически и неизменно запускается с повышенными правами (с правами администратора).[2]
Если вы не можете передать такие учетные данные, я думаю, вам не повезло.
Чтобы проверить, имеет ли текущий пользователь права администратора:
# Returns $true if elevated, otherwise $false.
[Security.Principal.WindowsPrincipal]::new(
[Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
Простой ярлык, который позволяет выполнять только при повышении net session
:
# Returns $true if elevated, otherwise $false.
[bool] (net session 2>$null)
[1] Если сеанс at уже не повышен, -Verb RunAs
отображается всплывающее диалоговое окно UAC, которое пользователь должен подтвердить в интерактивном режиме, что не поддерживается в удаленном сеансе.
[2] То же самое применимо, если вы используете «циклическое удаленное взаимодействие», т. Е. Если вы нацелены на локальную машину с помощью удаленного взаимодействия, используя Invoke-Command -ComputerName .
, например, с дополнительными ограничениями, однако: вы не можете использовать пользователя, который авторизован для удаленного взаимодействия, но не является частью локальной Administrators
группы, и если вы используете текущийпользователь (с явными учетными данными или без них), вызывающий сеанс сам должен быть повышен.
Комментарии:
1. Возможно, стоит отметить, что запуск
Invoke-Command
на локальном компьютере также приводит к автоматическому повышению полномочий команд внутри блока сценариев, при условии, что учетная запись имеет права администратора.2. Спасибо. В вашем последнем предложении я обнаружил, что я могу открыть невыровненное окно Powershell и по-прежнему повышать уровень локально
Invoke-Command
. Смотрите вывод Powershell на pastebin.com/wqeUaC8R3. Спасибо, @Jimadine — я не знал, что если вы укажете учетные данные другого пользователя, повышение прав не требуется. Я обновил сноску, чтобы, надеюсь, нарисовать полную картину. Дайте мне знать, соответствует ли это вашему опыту.
4. Это имеет смысл. Да, другой пользователь — я открываю окно PS как стандартный пользовательский интерфейс, затем в
Get-Credential
приглашении вводится пароль администратора.
Ответ №2:
Я думаю, вам следует сделать это:
$command = {
Start-Process "powershell" -Verb runas -Workingdirectory "C:Folder" -ArgumentList "build.ps1"
}
Invoke-Command -ComputerName $RemoteSystemIP -ScriptBlock $command -credential $Credentials1 -ErrorAction Stop -AsJob
Комментарии:
1. Не выполняется сценарий в build.ps1
2. Если учетные данные являются учетными данными администратора, удаленный сеанс автоматически повышается — дополнительная работа не требуется; если это не так, попытка повышения по требованию с
Start-Process -Verb RunAs
помощью не работает (нет способа показать графический интерфейс UAC).