Как я могу прочитать подробный вывод из командлета в C # с помощью Exchange Powershell - PullRequest
1 голос
/ 20 декабря 2010

Среда: Exchange 2007 sp3 (смешанный режим 2003 sp2)

Visual Studio 2008, .Net 3.5


Я работаю с командлетом Move-mailbox почтового ящика PowerShell Exchange и имеюотметил, что когда я делаю это из командной консоли Exchange (используя переключатель Verbose), предоставляется масса информации в режиме реального времени.

Чтобы представить небольшой контекст, я пытаюсь создать приложение с пользовательским интерфейсом, которое перемещаетсяпочтовые ящики, аналогичные консоли управления Exchange, но при желании поддерживать входной файл и конкретные места назначения сервера / базы данных для каждой записи (и потоков).

Вот примерно то, что у меня есть в настоящее время, но я не уверен, есть лисобытие, которое мне нужно зарегистрировать или что ... И чтобы быть ясным, я хочу получить эту информацию в режиме реального времени, чтобы я мог обновить свой пользовательский интерфейс, чтобы отразить, что происходит в последовательности перемещения для соответствующего пользователя (в значительной степени похоже народной функционал, предлагаемый в консоли управления).И если вам интересно, причина, по которой я не доволен функционалом Консоли управления, заключается в том, что у меня есть алгоритм, который я использую для балансировки пользователей в зависимости от лимита хранилища, использования Blackberry, ведения журнала, размера почтового ящика исключений и т. Д., Который требуетПользователь будет сопоставлен с определенными местоположениями ... и я не хочу создавать много / несколько групп перемещений для каждого общего назначения или охотиться за списками пользователей индивидуально через пользовательский интерфейс консоли управления.

Кажется, я не могу найти какую-либо хорошую документацию или примеры того, как связываться с чтением подробных сообщений, которые предоставляются в консоли с использованием C # (я вижу ценность в том, что я могу читать информацию такого рода во многих различныхсценарии).

Я исследовал методы Invoke и InvokeAsync и события StateChanged & DataReady, но, похоже, ни один из них не предоставляет информацию (подробные комментарии), к которой я стремлюсь.

Любойруководство или примеры, которые могут быть предоставлены, будут очень благодарны!

Ниже приведен пример кода, который немного больше, чем то, как я обычно называю любую другую команду powershell:

// config to use ExMgmt shell, create runspace and open it
RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();

PSSnapInException snapInException = null;
PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException);

if (snapInException != null) throw snapInException;

Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig);

try
{
  runspace.Open();

  // create a pipeline and feed script text
  Pipeline pipeline = runspace.CreatePipeline();

  string targetDatabase = @"myServer\myStorageGroup\myDB";
  string mbxOwner = "user@company.com";

  Command myMoveMailbox = new Command("Move-Mailbox", false, false);
  myMoveMailbox.Parameters.Add("Identity", mbxOwner);
  myMoveMailbox.Parameters.Add("TargetDatabase", targetDatabase);
  myMoveMailbox.Parameters.Add("Verbose");
  myMoveMailbox.Parameters.Add("ValidateOnly");
  myMoveMailbox.Parameters.Add("Confirm", false);
  pipeline.Commands.Add(myMoveMailbox);

  System.Collections.ObjectModel.Collection<PSObject> output = null;

  // these next few lines that are commented out are where I've tried
  // registering for events and calling asynchronously but this doesn't 
  // seem to get me anywhere closer
  //
  //pipeline.StateChanged += new EventHandler<PipelineStateEventArgs>(pipeline_StateChanged);
  //pipeline.Output.DataReady += new EventHandler(Output_DataReady);
  //pipeline.InvokeAsync();
  //pipeline.Input.Close();
  //return; tried these variations that are commented out but none seem to be useful

  output = pipeline.Invoke();

  // Check for errors in the pipeline and throw an exception if necessary
  if (pipeline.Error != null && pipeline.Error.Count > 0)
  {
     StringBuilder pipelineError = new StringBuilder();
     pipelineError.AppendFormat("Error calling Test() Cmdlet.  ");
     foreach (object item in pipeline.Error.ReadToEnd())
       pipelineError.AppendFormat("{0}\n", item.ToString());

     throw new Exception(pipelineError.ToString());
   }

   foreach (PSObject psObject in output)
   {
     // blah, blah, blah
     // this is normally where I would read details about a particular PS command
     // but really pertains to a command once it finishes and has nothing to do with
     // the verbose messages that I'm after... since this part of the methods pertains
     // to the after-effects of a command having run, I'm suspecting I need to look to
     // the asynch invoke method but am not certain or knowing how.
   }
}
finally
{
  runspace.Close();
}

Ответы [ 2 ]

2 голосов
/ 21 декабря 2010

Взгляните на класс PowerShell .Он имеет свойство Streams, позволяющее получить доступ к содержимому подробного потока.Обратите внимание, что класс PowerShell был представлен в PowerShell 2.0, но, вероятно, это то, что вы хотите использовать при внедрении PowerShell в приложение хостинга.Фактически, в документах говорится:

Предоставляет методы, которые используются для создания конвейера команд и вызова этих команд либо синхронно, либо асинхронно в пространстве выполнения.Этот класс также обеспечивает доступ к выходным потокам, которые содержат данные, которые генерируются при вызове команд. Этот класс в первую очередь предназначен для хост-приложений, которые программно используют Windows PowerShell для выполнения задач. Этот класс представлен в Windows PowerShell 2.0.

0 голосов
/ 21 декабря 2010

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

Большое спасибо за предоставленную информацию и предоставленную ссылку.Как вы уже указали, я отмечаю, что мне нужно обновить PS 2.0, чтобы «увидеть» этот класс Powershell (который по некоторым причинам оказывается делом рутинным).

Теперь, когда я понимаю, использоватьКласс PS со свойством streams, я ожидаю, что смогу добавить оснастку «Управление Exchange», аналогично тому, как я делал это раньше, и мне пора.

Спасибо, что указали на меняправильное направление, это, кажется, именно то, что мне нужно!

С уважением, Кит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...