Мне нужно иметь возможность импортировать модуль, находящийся на удаленной машине, через пространство выполнения 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', не был обработан, так как не найден действительный модуль в любом каталоге модулей.
На данный момент я действительно не уверен, куда идти или даже если это действительно возможно. Я искал повсюду и нашел некоторые вещи, которые кажутся связанными, но никогда не были совершенно одинаковыми и имели тенденцию быть проблемами, которые я уже преодолел или просто еще (насколько я знаю) не сталкивался. Любая помощь будет оценена! Спасибо!