Запустить Invoke-Command на удаленном компьютере от имени администратора

#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/wqeUaC8R

3. Спасибо, @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).