Среда: 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();
}