2015-02-15 3 views
1

Я планирую построить консоль администратора Active Directory/Exchange, используя C#, говоря powershell - DC и серверам Exchange.Сохранение рабочей среды powershell в C# WPF?

Я хочу, чтобы при запуске приложения установили подключения к этим серверам, а затем сохранили их, чтобы я мог выполнять запросы или сценарии или что-то еще, потому что для установления удаленного подключения требуется несколько секунд, и он просто не будет работать иметь такую ​​задержку во всем, что вы делаете.

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

Как я могу предотвратить закрытие runspace, чтобы я мог использовать его снова и снова?

Редактировать: code Очень простой, просто создавая пространство, планируя возможность включения модулей позже, когда у меня есть базовая функциональность. Идея заключалась в создании рабочей области и при вызове функции, выполняющей код powershell, присваивать этому пробелу другую переменную, чтобы я мог ее повторно использовать, но я, вероятно, глуп. В настоящее время у меня просто есть фиктивный «Get-Process», который отправляется при нажатии кнопки и текстовом поле, которое отображает вывод.

public partial class MainWindow : Window 
{ 
    Runspace powerShellRunspace = RunspaceFactory.CreateRunspace(); 
    public MainWindow() 
    { 

     InitializeComponent(); 
     powerShellRunspace.Open(); 
     string[] modules; 
     scriptOutput.Text = "test"; 
     modules = new string[5]; 
     modules[0] = "john"; 



     //string result = powerShellRun("Get-Process"); 
     //powerShellInitialize(modules); 

    } 

    public static void powerShellInitialize(string[] modules) 
    { 
     Runspace powerShellRunspace = RunspaceFactory.CreateRunspace(); 
     powerShellRunspace.Open(); 

    } 

    public string powerShellRun(string commands, Runspace powerShellRunspace) 
    { 

     Runspace powerShellRunspace2 = powerShellRunspace; 
     Pipeline powerShellPipeline = powerShellRunspace2.CreatePipeline(); 
     powerShellPipeline.Commands.Add(commands); 
     Collection<PSObject> powerShellResult = powerShellPipeline.Invoke(); 
     //string result="temp"; 
     //return result; 
     StringBuilder stringBuilder = new StringBuilder(); 
     foreach (PSObject obj in powerShellResult) 
     { 
      stringBuilder.AppendLine(obj.ToString()); 
     } 

     return stringBuilder.ToString(); 

    } 
} 
+0

Что делает ваш текущий код выглядит? – Trondh

ответ

1

Этот вопрос уже был дан ответ на Keeping Powershell runspace open in .Net

В целом, вы можете сохранить пространство выполнения Open, но для каждого независимого запроса, вам необходимо создать новый экземпляр Powershell.

Пример:

Runspace runspace = RunspaceFactory.CreateRunspace(initial); 
runspace.Open(); 

//First Query 
var firstQuery = PowerShell.Create(); 
firstQuery.Runspace = runspace; 
firstQuery.AddScript("Write-Host 'hello'") 

//Second Query 
var secondQuery = PowerShell.Create(); 
secondQuery.Runspace = runspace; 
secondQuery.AddScript("Write-Host 'world'") 
Смежные вопросы