从c#运行powershell是在Exchange Online中创建多个邮件联系人的最有效方法
我希望通过从C#运行Powershell命令在Microsoft Online的GAL中创建多个mailcontacts(外部联系人)。下面的代码可以工作,但速度非常慢,运行400个mailcontacts大约需要15-20分钟从c#运行powershell是在Exchange Online中创建多个邮件联系人的最有效方法,c#,powershell,C#,Powershell,我希望通过从C#运行Powershell命令在Microsoft Online的GAL中创建多个mailcontacts(外部联系人)。下面的代码可以工作,但速度非常慢,运行400个mailcontacts大约需要15-20分钟 foreach(EmailAdressVM emailAddressVM in emailList.emailAddresses1) { //Create New MailContact. Pipeline pplNewMailContact = run
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
}
导入csv | ForEach{
新建邮件联系人-名称$\u0.emailaddress-显示名称$\u0.FullName-lastname$\u0.lastname-firstname$\u0.firstname-外部电子邮件地址$\u0.emailaddress-别名$\u0.alias
}
…要快得多
我在网上搜索了数小时后发现了一些参考资料,您可以在从C#运行Powershell命令时执行类似于使用CSV的操作,即向命令发送值列表(或数组)(在本例中为“new mailcontact”命令)。但是,我还没有找到任何关于如何向命令发送多个值的好例子,我需要向“new mailcontact”命令提供多个值(例如:-name$.emailAddress-displayname$.FullName等)
是否有可能以与“导入csv”命令类似的方式发送列表(或数组)(在使用常规powershell时),这会更快,还是有更好的方法?如果我使用Powershell 3而不是1(就像我现在使用的那样),我会获得更好的性能吗
请提供工作示例代码i C#
请注意,我无法将CSV文件保存到磁盘,也无法从CMD执行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.);
}
我现在不是在一个工作或测试的环境中,所以希望这能给你至少大部分你需要的东西…Hallo!你“高高在上”,我的代码是错误的。我就是这样做的:1。提供连接信息以连接到Exchange Online。2.创建Powershell运行空间R。并将其打开。3.在运行空间R.4中创建一个新的管道P。将命令添加到管道第5页。将列表的foreach循环中当前obj的参数添加到管道第5页。调用管道第6页。处理管道,第6页。从步骤3循环到foreach结束,然后转到步骤7。7.关闭运行空间R。我已准备好按照您的建议执行。问题是,是否有另一种更快的方法?