Использование Invoke-Command для запуска Start-Process в сеансе с повышенными правами

Перед запуском установочного файла на нескольких удаленных серверах мне нужно обновить параметр Powershell MaxMemoryPerShellMB. Для этого требуется запуск сеанса PS от имени администратора на удаленном сервере. Я пытался запустить Invoke-Command, который затем запускает ScriptBlock, состоящий из команды Start-Process, которая включает параметр -Verb RunAs. Однако ничего не работает.

Я пробовал разные схемы цитирования, одинарные, двойные, тройные, но ничего не работает.

Я пробовал запускать Start-Process с Enter-PSSession с теми же результатами.

Ниже приведен код, который я сейчас тестирую:

$creds = Get-Credential -Username 'DOMAIN\userID' -Message "Enter Username and Password to access the remote servers."

$ScriptBlock = {
    Start-Process -FilePath Powershell.exe -ArgumentList """Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024""" -Verb RunAs -Wait 
}
Invoke-Command -ComputerName testsvr01 -Credential $creds -ScriptBlock $ScriptBlock

Я должен иметь возможность подключиться к удаленному серверу по протоколу RDP и запустить Get-Item WSMan:\localhost\Shell, чтобы он отображал обновленное значение, но значение не изменилось.

При запуске кода он приостанавливается на секунду, когда запускается Invoke-Command, но кроме этого в Powershell нет обратной связи.

На удаленном сервере я вижу следующие две ошибки Kerberos в журнале системных событий.

0x19 KDC_ERR_PREAUTH_REQUIRED,

0xd KDC_ERR_BADOPTION

Любая помощь приветствуется.


person Noobux    schedule 07.08.2019    source источник


Ответы (1)


> powershell.exe -?
...
EXAMPLES
...
PowerShell -Command "& {Get-EventLog -LogName security}"

-Command
...
 To write a string that runs a Windows PowerShell command, use the format:
    "& {<command>}"
where the quotation marks indicate a string and the invoke operator (&)
causes the command to be executed.

Таким образом, вы можете попробовать вызвать Set-Item следующим образом:

$ScriptBlock = {
    Start-Process -FilePath Powershell.exe -ArgumentList "-Command"," &{ Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024 }" -Verb RunAs -Wait -PassThru
}
$process = Invoke-Command -ComputerName testsvr01 -Credential $creds -ScriptBlock $ScriptBlock
$process.ExitCode

Я также возвращаю объект процесса через -PassThru, на котором вы можете проверить `ExitCode``

надеюсь, это поможет

person Moerwald    schedule 08.08.2019
comment
Спасибо за разъяснение синтаксиса. Это помогло. К сожалению, это не решило мою проблему. Чтобы добавить некоторые детали, я запускаю это с сервера W2K16, пытаясь выполнить команду на сервере W2K8 R2. Я часами исследовал проблемы с kerberos, но ничего не смог показать. Наконец-то я попробовал другой сервер W2K8, и он заработал после запуска на нем Enable-PSRemoting. После проверки я обнаружил, что этот сервер был обновлен до Powershell 5.1. Я вернулся на свой исходный сервер, обновил его до 5.1, повторно запустил Enable-PSRemoting и, наконец, смог запустить обновление. Спасибо - person Noobux; 08.08.2019
comment
Я бы проголосовал за вас, но, видимо, у меня пока нет репутации. Хотя пометил вас как ответ. - person Noobux; 08.08.2019