Мне нужно иметь возможность импортировать модуль, который находится на удаленном компьютере, через пространство выполнения C #.
Чтобы было понятно, что я имею в виду: создаваемая мной служба находится на сервере A. Она создает удаленное пространство выполнения для сервера B, используя метод, описанный ниже. Через пространство выполнения я пытаюсь импортировать модуль на сервер B.
Вот метод, который я использую для удаленного вызова:
internal Collection<PSObject> RunRemoteScript(string remoteScript, string remoteServer, string scriptName, out bool scriptSuccessful)
{
bool isLocal = (remoteServer == "localhost" || remoteServer == "127.0.0.1" || remoteServer == Environment.MachineName);
WSManConnectionInfo connectionInfo = null;
if (!isLocal)
{
connectionInfo = new WSManConnectionInfo(new Uri("http://" + remoteServer + ":5985"));
}
PsHostImplementation myHost = new PsHostImplementation(scriptName);
using (Runspace remoteRunspace = (isLocal ? RunspaceFactory.CreateRunspace(myHost) : RunspaceFactory.CreateRunspace(myHost, connectionInfo)))
{
remoteRunspace.Open();
using (PowerShell powershell = PowerShell.Create())
{
powershell.Runspace = remoteRunspace;
Pipeline pipeline = remoteRunspace.CreatePipeline();
pipeline.Commands.AddScript(remoteScript);
Collection<PSObject> results = pipeline.Invoke();
remoteRunspace.Close();
scriptSuccessful = myHost.ScriptSuccessful;
return results;
}
}
}
«remoteScript» установлен для сценария Powershell, который я хочу запустить. Например:
"Import-Module Modulename;CustomCommand-FromModule -parameter(s) -ErrorAction stop"
Модуль не упакован вместе, это psd1, psm1 и куча файлов сценария, которые находятся в C: \\ Powershell \ ModuleName на удаленном сервере (сервер B), и я протестировал и убедился, что он вызывает ModuleName. psd1 в каталоге C: \\ Powershell \ ModuleName.
Внутри файла ModuleName.psd1 есть строка:
ModuleToProcess = 'ModuleName.psm1'
Однако я получаю очень странную ошибку, если пытаюсь запустить ее через пространство выполнения C #.
Если я отправлю в качестве параметра "remoteScript" следующее:
"Import-Module Modulename"
Я получаю следующую ошибку:
System.Management.Automation.RemoteException: модуль для обработки 'ModuleName.psm1', указанный в поле 'ModuleToProcess' манифеста модуля 'C: \ Powershell \ ModuleName \ ModuleName.psd1', не был обработан, поскольку ни в одном из них не был найден допустимый модуль. каталог модуля.
Модуль существует в одном из расположений "$ env: PSModulePath" и отображается, если вы запустите:
get-module -listAvailable
Я также попытался указать полный путь к файлу ModuleName.psm1 внутри файла psd1. Когда я это делаю (или то, что было предложено x0n ниже), я получаю почти ту же ошибку:
Модуль для обработки 'C: \ Powershell \ ModuleName \ ModuleName.psm1', указанный в поле 'ModuleToProcess' манифеста модуля 'C: \ Powershell \ ModuleName \ ModuleName.psd1', не был обработан, поскольку ни в одном из модулей не был найден допустимый модуль каталог.
На данный момент я действительно не уверен, куда идти и даже возможно ли это на самом деле. Я искал повсюду и нашел некоторые вещи, которые кажутся связанными, но никогда не были одинаковыми и, как правило, были проблемами, которые я уже преодолел или просто (насколько мне известно) еще не сталкивался. Любая помощь будет оценена по достоинству! Спасибо!