2016-07-10 6 views
1

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

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 
} 
+0

* эта команда является признанной ООН * Как вы знаете, что? Любое исключение? Любая ошибка в 'ps.Streams.Error'? – PetSerAl

+0

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

+0

Добавьте это к вашему коду: 'init.ThrowOnRunspaceOpenError = true;'. – PetSerAl

ответ

0

Проблема была основой .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(); 
Смежные вопросы