Передача активного соединения Powershell PSSession в качестве аргумента в Start-Job - PullRequest
0 голосов
/ 27 марта 2019

Я пишу скрипт, который собирает данные из 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

Спасибо за предложения.

1 Ответ

0 голосов
/ 28 марта 2019

У вас есть спецификации здесь, но вы не показываете код и все же запрашиваете мнение.

То есть, как многие сказали бы здесь, не по теме, потому что цель здесь - помочь с кодом, который не работает или тому подобное.Итак, на данный момент вы пробовали то, что вы спрашиваете, и если так, что случилось?

Итак, ИМХО ... Пока, поскольку вы здесь.давайте не будем отправлять вас с пустыми руками.

В соответствии с аналогичным запросом здесь , принятый ответ был ...

… у вас есть текущий сеанс PSSessionоткрылся на консоли, а затем вы пытаетесь использовать тот же сеанс в фоновом задании.Это не будет работать, потому что вы используете два разных процесса PowerShell и не можете обмениваться оперативными данными между пространствами выполнения, поскольку они десериализуются и теряют все свои возможности.Вам нужно будет взглянуть на создание собственных пространств выполнения PowerShell, если ваша цель состоит в том, чтобы обмениваться действующими переменными в нескольких сеансах PowerShell.

Даже с учетом вышесказанного у вас все еще есть те ограничения потребления, о которых вы упоминаете, и технически основанные на них.В вашем случае вы, скорее всего, также столкнетесь с серьезными проблемами с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...