【发布时间】:2019-04-06 04:25:05
【问题描述】:
我正在编写一个脚本,该脚本从 Exchange Online 收集有关我们组织中每个邮箱的邮箱权限的数据。为此,我将所有邮箱数据收集到一个变量中,然后使用 foreach 遍历每个邮箱并检查应用于它的邮箱权限。当您使用超过 15000 个邮箱时,这需要时间。
我想使用 Powershell 作业通过让多个作业检查权限并将它们附加到单个 CSV 文件来加快此过程。有没有办法将一个活动的 PSSession 传递给一个新作业,以便该作业“共享”产生该作业的父进程的活动会话并且不需要建立新的会话?
我可以在函数中调用 New-PSSession,但 Microsoft 在 Exchange Online PSSessions 中有活动会话限制,因此它会将我一次可以运行的作业数量限制为 3。其余的必须排队通过一个while循环。如果我可以在多个作业之间共享一个会话,我将受到计算机资源而非连接限制的限制。
之前有没有人成功地将活动的 PSSession 传递给工作?
编辑:
我一直致力于使用运行空间来尝试通过 Boe Prox 的 PoshRSJobs 模块来完成此任务。让它正常工作仍然有一些困难。不创建 CSV 或附加到它,但仅当我尝试在 foreach 语句中整理权限时。脚本块内的Write-Output 也只输出隐式远程处理信息,这很奇怪。
代码如下。
Connect-ToOffice365TenantPSSession
$mailboxes = Get-Mailbox -ResultSize 10 -IncludeInactiveMailbox
$indexCount = 1
foreach ($mailbox in $mailboxes) {
$script = @"
`$cred = Import-Clixml -Path 'C:\Users\Foo\.credentials\StoredLocalCreds.xml'
`$o365Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential `$cred -Authentication Basic -AllowRedirection
Import-PSSession `$o365Session -CommandName @('Get-Mailbox','Get-MailboxPermission')
`$internal_mailbox = `$Using:mailbox
`$mailboxPermissions = `$internal_mailbox | Get-MailboxPermission
foreach (`$permission in (`$mailboxPermissions | Where-Object {`$_.User -match 'tenantName|companyDomain'}))
{
`$userPermissions = `$permission | Select-Object Identity, User, AccessRights
`$permissionObject = [PSCustomObject]@{
"MailboxName" = `$userPermissions.Identity
"MailboxAddress" = `$internal_mailbox.PrimarySmtpAddress
"MailboxType" = `$internal_mailbox.RecipientTypeDetails
"UserWithAccess" = `$userPermissions.User
"AccessRights" = `$userPermissions.AccessRights
}
if (Test-Path 'C:\Scripts\MailboxPermissions.csv') {
`$permissionObject | Export-Csv 'C:\Scripts\MailboxPermissions.csv' -NoTypeInformation -Append
} else {
New-Item -Path 'C:\Scripts\MailboxPermissions.csv'
`$permissionObject | Export-Csv 'C:\Scripts\MailboxPermissions.csv' -NoTypeInformation -Append
}
Write-Output `$permissionObject
}
"@
$scriptBlock = [scriptblock]::Create($script)
$continue = $false
do
{
if ((Get-RSJob | Where-Object {$_.State -eq "Running"}).count -lt 3) {
Start-RSJob -Name "Mailbox $indexCount" -ScriptBlock $scriptBlock
$indexCount++
$continue = $true
}
else {
Start-Sleep 1
}
} while ($continue -eq $false)
}
Get-RSJob | Receive-RSJob
感谢您的建议。
【问题讨论】:
标签: powershell office365