Размещение ограниченного Powershell с пользовательскими командлетами - PullRequest
2 голосов
/ 08 февраля 2012

Я размещаю PowerShell в своем приложении и настроил ограниченный пул runspace, который в основном пуст (насколько мне известно).

public class MyPowerShell : IDisposable
{
    private RunspacePool _runspacePool;
    private PowerShell _shell;

    public MyPowerShell()
    {
        try
        {
            var initialSessionState = InitialSessionState.CreateRestricted(SessionCapabilities.RemoteServer);

            _runspacePool = RunspaceFactory.CreateRunspacePool(initialSessionState);

            _shell = PowerShell.Create();
            _shell.RunspacePool = _runspacePool;
            _shell.RunspacePool.Open();

            _shell.AddCommand("Import-Module").AddParameter("Assembly", Assembly.GetExecutingAssembly());
            _shell.Invoke();
            _shell.Commands.Clear();
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    public void Dispose()
    {
        _shell.RunspacePool.Close();
        _shell.Dispose();
    }

    public string[] Exec(string commandText)
    {
        var results = new List<string>();

        try
        {
            _shell.AddScript(commandText);
            foreach (var str in _shell.AddCommand("Out-String").Invoke<string>())
            {
                results.Add(str);
            }
        }
        catch (Exception ex)
        {
            results.Add(ex.Message);
        }
        return results.ToArray();
    }

}

очевидно, когда я запускаю этот код ...

        _shell.AddCommand("Import-Module").AddParameter("Assembly", Assembly.GetExecutingAssembly());
        _shell.Invoke();
        _shell.Commands.Clear();

происходит сбой, поскольку нет доступного командлета «Import-Module».Итак, мой вопрос: как я могу импортировать модуль без доступного командлета «Import-Module»?

Это сообщение об ошибке, которое я получаю ...

Термин«Модуль импорта» не распознается как имя командлета, функции, файла сценария или работающей программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

1 Ответ

3 голосов
/ 03 августа 2012

Я нашел решение, не могу вспомнить, где я делал сейчас, и я действительно забыл, что задал этот вопрос!Во всяком случае, здесь это для всех, кто сталкивается с той же проблемой.

var initialSessionState = InitialSessionState.CreateRestricted(SessionCapabilities.RemoteServer);
initialSessionState.ImportPSModule(new [] { "ModuleName1", "ModuleName2" });

Я не могу увидеть, какой модуль я пытался импортировать, когда я задал этот вопрос, но я успешно использовал вышеупомянутое.код для использования командлетов PowerShell для администрирования AppFabric.

...