从c#运行powershell最有效的方式来创建多个邮件联系人在Exchange Online

本文关键字:联系人 Online Exchange 创建 powershell 运行 有效 方式 | 更新日期: 2023-09-27 18:10:42

我希望通过c#运行Powershell命令在Microsoft Online的GAL中创建多个邮件联系人(外部联系人)。下面的代码可以工作,但是非常慢,运行400个邮件联系人大约需要15-20分钟。

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(就像我现在使用的),我会得到更好的性能吗?

请提供c#的工作示例代码!

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

从c#运行powershell最有效的方式来创建多个邮件联系人在Exchange Online

我认为最大的原因是你为每个地址创建一个新的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.);
     }

我现在不是在一个环境中得到一些工作或测试,所以希望这给你至少大部分你需要的…