【问题标题】:Passing active Powershell PSSession connection as argument in Start-Job在 Start-Job 中将活动的 Powershell PSSession 连接作为参数传递
【发布时间】: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


    【解决方案1】:

    您在这里有规范,但您没有显示代码,而是征求意见。

    也就是说,正如许多人在这里所说的那样,题外话,因为这里的目标是帮助处理不工作的代码等。那么,在这一点上,您是否尝试过您的要求,如果是,发生了什么?

    所以,恕我直言……然而,既然你在这里。我们不要空手而归。

    As per a similar ask here,接受的答案是......

    …你在你的控制台上打开了一个当前的 PSSession,然后你 正在尝试在后台作业中使用相同的会话。这将 不起作用,因为您使用的是两个不同的 PowerShell 进程,并且 无法在运行空间之间共享实时数据 反序列化并失去其所有功能。你需要看看 如果您的目标是共享,则创建您自己的 PowerShell 运行空间 跨多个 PowerShell 会话的实时变量。

    即使有上述情况,您仍然有您提到的那些消耗限制,并且从技术上讲,根据您的用例,您很可能最终也会遇到严重的性能问题。

    【讨论】:

    • 感谢您的建议。我已经在 OP 中添加了一些代码,并尝试执行我所说的操作。
    猜你喜欢
    • 2017-10-08
    • 2023-01-02
    • 2013-01-17
    • 2021-10-03
    • 1970-01-01
    • 2022-01-25
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多