Назад | Перейти на главную страницу

Выполнение Oracle SQLPlus в инструкции Powershell Invoke-Command на удаленном компьютере

У нас есть базовый сценарий PowerShell, который пытается выполнить SQLPlus.exe на удаленном компьютере. На пульте дистанционного управления не установлен Oracle Instant client, но мы сгруппировали все необходимые библиотеки DLL в удаленную папку. Например, у нас есть sqlplus.exe и зависимости в каталоге C: \ temp \ oracle.

Если я перейду к этому пути на удаленном сервере и запустил sqlplus.exe, он будет работать нормально. Я получаю запрос на ввод имени пользователя.

Если я пойду:

Invoke-Command -comp remote.machine.host -ScriptBlock { C:\temp\oracle\sqplus.exe }

Получаю следующее:

Error 57 initializing SQL*Plus
    + CategoryInfo          : NotSpecified: (Error 57 initializing SQL*Plus:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Error loading message shared library

Думая, что это потенциально проблема с PATH, я попробовал следующее:

Invoke-Command -comp remote.machine.host -ScriptBlock { $env:ORACLE_HOME= "C:\temp\oracle"; $env:PATH = "$env:ORACLE_HOME; C:\temp\oracle\sqlplus.exe }

Результат был тот же.

Код ошибки не очень полезен и очень расстраивает, поскольку он работает, когда я вхожу в систему. Что делает удаленное взаимодействие PowerShell, из-за чего это не работает?

Ошибка 57 часто связана с проблемами памяти. Хотя выходные данные не очень полезны, а использование удаленного взаимодействия усложняет проблему, это может быть связано с памятью, доступной для удаленной оболочки, в частности, значением MaxMemoryPerShellMB на удаленном компьютере.

Это можно проверить с помощью

winrm get winrm/config

и результат близок к концу. В нашем случае было установлено значение 150, тогда как 512 было достаточно для целей, которые не вышли из строя. Значение можно установить с помощью

winrm set winrm/config @{MaxMemoryPerShellMB="512"}

или установив групповую политику на машине.

Для меня это пахнет проблемой окружающей среды. Почему вы не можете правильно установить клиент в удаленной системе?

Есть ли способ выгрузить свою среду из сценария PowerShell непосредственно перед вызовом SQL * Plus? Если да, сравните это с вашей средой, когда вы вошли в систему, и она работает. Возможно что-то вроде этого:

Invoke-Command -comp remote.machine.host -ScriptBlock { $env:ORACLE_HOME= "C:\temp\oracle"; $env:PATH = "$env:ORACLE_HOME"; set > c:\temp\oracle\set.txt  }

Примечание: похоже, в вашем операторе PATH, который я добавил, отсутствует двойная кавычка. Я предполагаю, что это была ошибка транскрипции.