Exchange Online Session и Runspace

Мне нужно выполнить Get-MailboxStatistics в среде выполнения. Я могу подключиться к Exchange через Интернет. Если я делаю «Get-Pssession», я вижу сеанс Exchange. Но как мне передать этот сеанс ExchangeOnline в пространство выполнения для выполнения Get-MailboxStatistics. В настоящее время он не распознает команду Get-MailboxStatistics в среде выполнения.

Вот мой код (это часть более крупного скрипта):

# Connecting to Exchange Online
$AdminName = "hil119"
$Pass = "password"
$cred_cloud = new-object -typename System.Management.Automation.PSCredential -argumentlist $AdminName, $Pass
Connect-ExchangeOnline -Credential $cred_cloud -Prefix Cloud

# Executing Get-MailboxStatistics in a Runspace
$Runspace = [runspacefactory]::CreateRunspace()
$PowerShell = [powershell]::Create()
$PowerShell.runspace = $Runspace
$Runspace.Open()
[void]$PowerShell.AddScript({Get-MailboxStatistics 'd94589'})
$PowerShell.BeginInvoke()

person hdsouza    schedule 05.02.2021    source источник
comment
Вы говорите о потоках, но используете совершенно другое пространство выполнения. Если вы собираетесь использовать этот код, вам необходимо синхронизировать пространства выполнения.   -  person Abraham Zinala    schedule 06.02.2021
comment
Хорошо, я заменил Threads на runspace в вопросе. Хотя исходный вопрос все равно остается. Как мне получить сеанс в runspace   -  person hdsouza    schedule 07.02.2021


Ответы (1)


После нескольких дней исследований я обнаружил, что вы можете запустить поток в локальной системе или на удаленном сервере Exchange. Если вы запускаете его в локальной системе, то каждый поток должен вызывать сеанс Exchange самостоятельно, но если вы запускаете его в удаленной системе обмена (локальной или облачной), вы можете получить сеанс обмена только один раз и передать этот сеанс в нить. Вы можете получить удаленный сеанс с помощью команды Invoke. Кроме того, я закончил писать сценарий в Poshjobs или runspaces. В конечном счете, из того, что я прочитал, Poshjobs представляет собой комбинацию Start-job и runspaces.

So here is the snippet of code that be used to run a Thread on a remote server. With this script you can pass the same exchange session to all threads.

Function Func_ConnectCloud
{
$AdminName = "r43667"
$AdminPassSecure = "pass"
$Cred_Cloud = new-object -typename System.Management.Automation.PSCredential -argumentlist $AdminName, $AdminPassSecure
Connect-ExchangeOnline -Credential $Cred_Cloud
$CloudSession =  Get-PSSession | Where { $_.ComputerName -like "outlook.office365*"}
Return $CloudSession
}

$script_Remote = 
    {
param(
     $Alias,
     $CloudSession
     )

Invoke-Command -session $CloudSession -ArgumentList $Alias  -ScriptBlock {param($Alias); Get-MailboxStatistics $Alias}
    }

$CloudSession = Func_ConnectCloud
$Alias = 'h672892'
$Job1 = Start-RsJob -Name "job_$Alias" -ScriptBlock $ScriptRemote -ArgumentList $Alias, $CloudSession

Receive-RsJob $Job1
Remove-RsJob $Job1

Вы можете использовать этот сценарий для запуска потоков как в локальной среде, так и в облаке, хотя при запуске на облачном сервере Microsoft разрешает только ДВА потока. Если вы запустите более ДВУХ потоков, ваш сеанс Exchange будет уничтожен (это отличается от регулирования). Поэтому, если у вас есть облачная среда, то лучше всего запускать ваши потоки локально. Специальная ссылка на @postanote для его сценария на https://powershell.org/forums/topic/connecting-to-office-365-in-psjobs/

person hdsouza    schedule 16.02.2021