从c#运行powershell最有效的方法是在Exchange Online中创建多个邮件联系

时间:2013-04-24 22:40:56

标签: c# powershell

我希望通过从C#运行Powershell命令在Microsoft Online的GAL中创建多个mailcontacts(外部联系人)。下面的代码有效,但速度很慢,需要大约15-20分钟来运行400个邮件联系。

foreach(EmailAdressVM emailAddressVM in emailList.emailAddresses1)
{
    //Create New MailContact.
    Pipeline pplNewMailContact = runspace.CreatePipeline();

    Command cmdNewMailContact = new Command("New-MailContact");
    cmdNewMailContact.Parameters.Add("Name", emailAddressVM.sExternalEmailAddress);
    cmdNewMailContact.Parameters.Add("Displayname", emailAddressVM.sFullName.Trim());
    cmdNewMailContact.Parameters.Add("Lastname", emailAddressVM.sLastName.Trim());
    cmdNewMailContact.Parameters.Add("Firstname", emailAddressVM.sFirstName.Trim());
    cmdNewMailContact.Parameters.Add("ExternalEmailAddress", emailAddressVM.sExternalEmailAddress.Trim());

    pplNewMailContact.Commands.Add(cmdNewMailContact);
    pplNewMailContact.Invoke();
    pplNewMailContact.Stop();
    pplNewMailContact.Dispose();
}

我猜这很慢,因为我为每个添加的新邮件联系创建了一个新的管道,并且自运行以来必须有一种更有效的方法来执行此操作......

import-csv <filename> | ForEach {
    new-mailcontact -name $_.emailaddress -displayname $_.FullName -lastname $_.lastname -firstname $_.firstname -externalemailaddress $_.emailaddress -alias $_.alias
}

...要快得多。

我在网上搜索了几个小时之后发现了一些参考资料,你可以在从C#运行Powershell命令时执行类似于使用CSV的操作,即将一个列表(或数组)值发送到命令(在这种情况下, “new-mailcontact”命令)。但是,我没有找到任何关于如何向命令发送多个值的好例子,我需要提供许多值(例如:-name $ .emailAddress -displayname $ .FullName等。)到“new-mailcontact”命令。

是否可以以与“import-csv”命令类似的方式发送列表(或数组)(使用常规PowerShell时)并且这会更快,还是有更好的方法?如果我使用Powershell 3而不是1(我现在正在使用),我会获得更好的性能。

请提供工作示例代码i C#!

请注意我无法将CSV文件保存到磁盘和执行powershell来自CMD,因为我没有对磁盘的写入权限,而且我认为我不能远程运行整个脚本(因为远程脚本可能已被禁用)在Exchange Online上。)

1 个答案:

答案 0 :(得分:0)

我认为最大的原因是因为对于每个地址,您正在创建一个新的Powershell实例而且您不是多线程的。

您的代码从上面看起来像这样:

Foreach email address{
    Declare a new Powershell process
    Add attributes to call later
    Start Powershell and pipe stuff in
    Close Powershell instance
}

我认为你最好先创建一个Powershell实例/管道,然后将每个对象发送到它。更多的是:

Create PS Pipe
    Foreach email address{
     PS.SendArguments(Email, Name, DN, etc.);
     }

我现在不在某个环境中工作或测试,所以希望这至少可以为您提供所需的大部分内容......