У нас есть базовый сценарий 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, который я добавил, отсутствует двойная кавычка. Я предполагаю, что это была ошибка транскрипции.