【发布时间】:2022-06-23 13:19:21
【问题描述】:
我正在编写一个 powershell 脚本来操作 Exchange Online 邮箱。
我希望此脚本与后台作业并行运行,因此我尝试使用 PoshRSJobs (https://github.com/proxb/PoshRSJob) 来创建作业。
我的代码是:
Connect-ExchangeOnline -Credentials ...
Start-RSJob -ModulesToImport ExchangeOnlineManagement -Throttle $ProcesosConcurrentes -InputObject $jobs -ScriptBlock {
./migra_buzon.ps1 ...
}
地点:
- $jobs 是一个数组列表,其中有我要操作的邮箱的参数
- migra_buzon.ps1 是另一个在一个指定邮箱上运行的 powershell 脚本
我以这种方式运行时遇到的问题是在作业中出现错误:
“Add-MailboxPermission”一词未被识别为 cmdlet、函数、脚本文件或可执行程序的名称。 检查名称的拼写,如果包含路径,请验证路径是否正确,然后重试。
虽然 Get-EXOMailbox 等其他命令运行正常。
寻求帮助我发现问题可能与会话有关,因此我将代码更改为:
Connect-ExchangeOnline -Credentials ...
Start-RSJob -ModulesToImport ExchangeOnlineManagement -Throttle $ProcesosConcurrentes -InputObject $jobs -ScriptBlock {
$o365session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid" -Credential $(Import-Clixml $Using:ExchangeCredentials) -Authentication "Basic" -AllowRedirection
Import-PSSession $o365Session -CommandName @('Add-MailboxPermission', 'Get-MailboxPermission')
./migra_buzon.ps1 ...
}
在这种情况下,我遇到的问题是 Exchange 连接。在运行了一些作业后,我收到了错误:
[outlook.office365.com] 处理来自远程服务器 outlook.office365.com 的数据失败,并显示以下错误消息:客户端未从服务器获得正确响应。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。 无法验证参数“会话”的参数。参数为空。为参数提供一个有效值,然后再次尝试运行该命令。
所以我的问题是,运行共享主进程中连接的后台作业的正确方法是什么?
谢谢
PS:我首先尝试使用 Start-Job 运行作业,但问题是每个后台作业都需要自己的连接,所以我得到了并且超出了最大连接数。这就是我将代码更改为 Start-RSJob 的原因
【问题讨论】:
-
为什么不在每个工作的顶部调用
Connect-ExchangeOnline -Credentials ...,然后一次只开始这么多?您将无法绕过连接限制,并且您将无法跨进程共享实时会话(作业在单独的子进程中运行)。 -
这样我就限制了 5 个并发作业(或者 3 个,我不记得了),我需要更多并发。
-
Exchange cmdlet 不适用于多线程,因为每个帐户总共只能有 3 个连接。即使在您传递运行空间的全局变量中使用 Exchange 会话也不起作用(当您的租户拥有 30k+ 个邮箱时,这真的很糟糕)。我过去规避这种情况的方法是查看我想要执行的操作的替代方案(MS Graph、EWS 和 Outlook API)。
-
我使用过 Graph,但我找不到配置交换的命令。如果其他 API 有我需要的命令,我会看看它们。
标签: powershell office365 exchange-server