Команды Exchange PowerShell через C #

Я использую C # для отправки команд PowerShell, взаимодействующих с Exchange. У меня есть методinitconnection который устанавливает мое соединение с Exchange.

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

<code>Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace();

runspace.Open();

Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript("Set-ExecutionPolicy Unrestricted -Scope process -Force;$password = ConvertTo-SecureString -AsPlainText -Force " + password + ";$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist " + username + ",$password;$LiveCred = Get-Credential -Credential $mycred; $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic –AllowRedirection; Import-PSSession $Session");
// pipeline.Commands.Add("Out-String");

pipeline.Invoke();
mpeAdd.Hide();
</code>

Это метод initconnection, который создает соединение.

<code>protected void Get_Mailboxes(object sender, EventArgs e) {

    PowerShell powershell = PowerShell.Create();
    PSCommand command = new PSCommand();
    command = new PSCommand();
    command.AddCommand("Get-Mailbox");

    powershell.Commands = command;
    powershell.Runspace = runspace; //Also it says runsapce doesn't exist in this context.
    Collection<PSObject> commandResults = powershell.Invoke();

    StringBuilder sb = new StringBuilder();

    ArrayList boxesarray = new ArrayList();

    foreach (PSObject ps in commandResults)
    {
        boxesarray.Add(ps.Properties["Alias"].Value.ToString());
    }

    boxes.DataSource = boxesarray;
    boxes.DataBind();
}
</code>

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

Ответы на вопрос(2)

Если & quot; runspace & quot; не существует, что объясняет, почему команда Get-Mailbox терпит неудачу. Вместо того, чтобы управлять пространством выполнения, вы можете создать экземпляр PowerShell в вашем методе initConnection и использовать его везде, где это необходимо. Обратите внимание, что это показано с собственным кодом, а не со скриптом.

ps = PowerShell.Create(); 

Установите политику выполнения.

ps.ClearCommands()
 .AddCommand("Set-ExecutionPolicy")
 .AddParameter("Scope", "Process") 
 .AddParameter("ExecutionPolicy", "Unrestricted")    
 .AddParameter("Confirm", false)
 .AddParameter("Force", true)
 .Invoke();

Создайте учетные данные. Обратите внимание, что вам не нужно вызывать Get-Credential.

SecureString pass;   
var creds = new PSCredential(username, pass);

Создать и импортировать сеанс.

var newSession = ps.ClearCommands()
 .AddCommand("New-PSSession")
 .AddParameter("ConfigurationName", "Microsoft.Exchange")
 .AddParameter("ConnectionUri", "https://ps.outlook.com/powershell/")
 .AddParameter("Credential", creds)
 .AddParameter("Authentication", "Basic")
 .AddParameter("AllowRedirection", true)
 .Invoke();

var session = newSession[0];
var import = ps.ClearCommands()
 .AddCommand("Import-PSSession")
 .AddParameter("Session", session)
 .Invoke();

ps.ClearCommands () - это метод расширения, добавленный таким образом, что он может быть связан с помощью AddCommand (), AddParameter () и т.д .:

public static PowerShell ClearCommands(this PowerShell ps)
{
    if (ps.Commands != null)
        ps.Commands.Clear();

    return ps;
}

Используйте его в Get_Mailboxes ()

protected void Get_Mailboxes(object sender, EventArgs e) {

  var commandResults = ps.ClearCommands().AddCommand("Get-Mailbox").Invoke();
  StringBuilder sb = new StringBuilder();
  ArrayList boxesarray = new ArrayList();

  foreach (PSObject ps in commandResults)
  {
      boxesarray.Add(ps.Properties["Alias"].Value.ToString());
  }

  boxes.DataSource = boxesarray;
  boxes.DataBind();
}

Когда вы закрываете приложение или где-то уместно:

ps.ClearCommands()
 .AddCommand("Get-PSSession")
 .AddCommand("Remove-PSSession")
 .Invoke();

ps.Dispose();

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

Ваш ответ на вопрос