Не удалось импортировать модуль PowerShell из C#

Я видел довольно много решений, но ни одно из них не решает мою проблему. Я пытаюсь импортировать пользовательский модуль PowerShell под названием «DSInternals» в мою библиотеку C#.

https://github.com/MichaelGrafnetter/DSInternals

Все в моем коде выглядит просто отлично, но когда я пытаюсь получить доступный модуль, он не загружается.

Поток отвечает

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

Где я ошибаюсь с этим кодом?

InitialSessionState init = InitialSessionState.CreateDefault();
init.ImportPSModule(new string[] { @"D:\\DSInternals\\dsinternals.psd1" }); //location of the module files
Runspace runspace = RunspaceFactory.CreateRunspace(init);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.Commands.AddCommand("Get-ADReplAccount"); //this command is un-recognized

foreach (PSObject result in ps.Invoke())
{
    Console.WriteLine(result); //this always returns null
}

person Patrizio Mwange    schedule 10.07.2016    source источник
comment
эта команда не распознана Откуда вы это знаете? Любое исключение? Какая-то ошибка в ps.Streams.Error?   -  person user4003407    schedule 10.07.2016
comment
Потоки отвечают Термин «Get-ADReplAccount» не распознается как имя командлета, функции, файла сценария или работающей программы. Проверьте правильность написания имени или, если указан путь, убедитесь, что путь указан правильно, и повторите попытку. Эти командлеты включены в модуль DSInternals.   -  person Patrizio Mwange    schedule 10.07.2016
comment
Добавьте это в свой код: init.ThrowOnRunspaceOpenError=true;.   -  person user4003407    schedule 10.07.2016
comment
Большое спасибо @PetSerAl Как раз то, что мне нужно, чтобы вернуться на правильный путь.   -  person Patrizio Mwange    schedule 10.07.2016


Ответы (1)


Проблема заключалась в версии платформы .NET, в которую был встроен модуль. Добавление модуля, созданного с помощью более высокой версии платформы .NET, в класс C# не сработает. Модуль был собран в 4.5.1 и я работал с версией 2, добавляя

init.ThrowOnRunspaceOpenError=true;

Помогли найти причину ошибки.

Вот мой окончательный код, который работает

        InitialSessionState init = InitialSessionState.CreateDefault();
        init.ImportPSModule(new string[] { @"D:\\DSInternals\\dsinternals.psd1" }); //location of the module files
        init.ThrowOnRunspaceOpenError = true;
        Runspace runspace = RunspaceFactory.CreateRunspace(init);
        runspace.Open();
        var script =
            "Get-ADReplAccount -SamAccountName peter -Domain BLABLA -Server dc.BLABLA.co.za -Credential $cred -Protocol TCP"; //my powershell script

        _powershell = PowerShell.Create().AddScript(script);
        _powershell.Runspace = runspace;

        var results = _powershell.Invoke();
        foreach (var errorRecord in _powershell.Streams.Progress)
            Console.WriteLine(errorRecord);
        foreach (var errorRecord in _powershell.Streams.Debug)
            Console.WriteLine(errorRecord);
        foreach (var errorRecord in _powershell.Streams.Error)
            Console.WriteLine(errorRecord);
        foreach (var errorRecord in _powershell.Streams.Warning)
            Console.WriteLine(errorRecord);

        var stringBuilder = new StringBuilder();
        foreach (var obj in results)
        {
            stringBuilder.AppendLine(obj.ToString());
        }

        return stringBuilder.ToString();
person Patrizio Mwange    schedule 10.07.2016