Я пытаюсь запрограммировать выполнение установщика на удаленных веб-серверах. Рассматриваемый установщик также является службой Windows, на которой размещается NServiceBus. Если RDP подключен к серверу, приложение устанавливается следующей командой:
& "$ theInstaller" / install / serviceName: TheServiceName
Программа установки распечатывает вывод о ходе выполнения регистрации службы и подключения к базе данных для stdout
, среди прочего.
Это отлично работает в сеансе RDP, но когда я выполняю его удаленно через PS, я получаю Вы не можете сделать это по сети сообщение, если я выполню его напрямую или через Invoke-Command -computername $theRemoteServer
:
System.IO.FileLoadException: не удалось загрузить файл или сборку 'file: // \\ theRemoteServer \ c $ \ thePath \ AutoMapper.dll' или одну из его зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515) ---> System.NotSupportedException: была предпринята попытка загрузить сборку из сетевого расположения, в результате чего сборка была бы изолирована в песочнице в предыдущих версиях .NET Framework. В этом выпуске .NET Framework по умолчанию политика CAS не включена, поэтому такая нагрузка может быть опасной. Если эта загрузка не предназначена для изолирования сборки, включите переключатель loadFromRemoteSources. Видеть http://go.microsoft.com/fwlink/?LinkId=155569 Чтобы получить больше информации.
(Примечание: я добавил дополнительный символ "\" к пути в первой строке, чтобы он правильно отображался в предварительном просмотре на этом сайте.)
Это и другие DLL
s, загружаются службой, и контекст выполнения службы, по-видимому, не может быть удален.
Я также пробовал использовать Invoke-WmiMethod
, что делает что-то, но непонятно что, а вывод из установщика теряется:
Invoke-WMIMethod win32_process create '"$ theInstaller" / install / serviceName: TheServiceName' -ComputerName $ server (с и без cmd.exe / k перед ссылкой на установщик):
__ РОД: 2
__КЛАСС: __ПАРАМЕТРЫ
__СУПЕРКЛАСС:
__ДИНАСТИЯ: __ПАРАМЕТРЫ
__RELPATH:
__PROPERTY_COUNT: 2
__DERIVATION: {}
__СЕРВЕР:
__NAMESPACE:
__ДОРОЖКА :
ProcessId:
ReturnValue: 9
Как удаленно выполнить такую EXE
и захватить вывод?
Хорошо ... это работает:
invoke-command $remoteServer { param($installer) cmd /c "$installer" /install /serviceName:TheServiceName } -ArgumentList $installer
где $remoteServer
имя удаленного сервера, $installer
- это UNC-путь к установщику на этом удаленном сервере, и TheServiceName
это имя службы.
Однако мне также пришлось предоставить специальную конфигурацию, чтобы разрешить запуск exe по сети, как в этой статье: http://through-the-interface.typepad.com/through_the_interface/2011/07/loading-blocked-and-network-hosted-assemblies-with-net-4.html
Итак, этот трюк состоит в том, чтобы настроить службу так, чтобы ее можно было удалить, а затем вы можете invoke-command
Это.
Удаленно выполнить его локально ... что я имею в виду, выполнить его на удаленном сервере в локальном контексте, удаленно с вашего локального компьютера. Что ж, может быть, было бы проще читать дальше ...
Похоже, лучше всего использовать PSExec чтобы открыть удаленную консоль PowerShell или командную строку с вашего локального компьютера, которая будет выполняться на удаленном сервере.
Так, например:
psexec \\ удаленный сервер cmd.exe
или
psexec \\ удаленный сервер powershell.exe
В итоге вы получаете экземпляр PowerShell или cmd
запущенный на удаленном сервере, которым вы будете управлять на своем экране.
Другой способ расколоться без изменения конфигурации развертываемого приложения:
# increase memory available to WsMan (run from elevated PS instance on remote machine)
set-item wsman:localhost\Shell\MaxMemoryPerShellMB 2048
# for PowerShell v3 or higher this line is also necessary
Set-Item WSMan:\localhost\Plugin\Microsoft.PowerShell\Quotas\MaxMemoryPerShellMB 2048
# add remote work to script on remote server, and then call that script from the local script
invoke-command $remoteServer { param($remoteScript, $arg1, $arg2, $arg3) powershell $script $arg1 $arg2 $arg3 } -ArgumentList $remoteScript, $arg1, $arg2, $arg3