Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c#运行powershell是在Exchange Online中创建多个邮件联系人的最有效方法_C#_Powershell - Fatal编程技术网

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

从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

我希望通过从C#运行Powershell命令在Microsoft Online的GAL中创建多个mailcontacts(外部联系人)。下面的代码可以工作,但速度非常慢,运行400个mailcontacts大约需要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
}
导入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。我已准备好按照您的建议执行。问题是,是否有另一种更快的方法?