Я пишу скрипт, который собирает данные из Exchange Online относительно разрешений почтовых ящиков для каждого почтового ящика в нашей организации. Для этого я собираю все данные почтового ящика в переменную, затем использую foreach для итерации по каждому почтовому ящику и проверяю разрешения почтового ящика, примененные к нему. Это занимает время, когда вы работаете с более чем 15000 почтовых ящиков.
Я хотел бы использовать задания Powershell для ускорения этого процесса, имея несколько заданий, проверяющих разрешения и добавляющих их в один файл CSV. Есть ли способ передать активный сеанс PSSession в новое задание, чтобы задание «разделяло» активный сеанс родительского процесса, который породил задание, и не требовало установки нового сеанса?
Я мог бы поместить вызов New-PSSession в функцию, но у Microsoft есть активные ограничения сеансов в сеансах Exchange Online PSSessions, поэтому это ограничило бы количество заданий, которые я мог бы выполнить за один раз, до 3. Остальные должны были бы быть поставлены в очередь через цикл времени. Если бы я мог разделить один сеанс между несколькими заданиями, я был бы ограничен ресурсами компьютера, а не ограничениями соединения.
Кто-нибудь успешно передавал активную PSSession на работу раньше?
Редактировать:
Я работал над использованием пространств выполнения, чтобы попытаться сделать это с помощью модуля PoshRSJobs Boe Prox. По-прежнему возникают трудности с его корректной работой. Не создает 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
Спасибо за предложения.