0

I need to execute Get-MailboxStatistics in a Runspace. I can connect to Exchange online. If I do a 'Get-Pssession' I can see the Exchange session. But how do I pass this ExchangeOnline session to the Runspace to execute Get-MailboxStatistics. Currently it does not recognize the Get-MailboxStatistics command in the Runspace.

Here is my code (this is part of a larger script):

# 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()
hdsouza
  • 354
  • 4
  • 17
  • You say threads but, you're using a whole different runspace. If you're going to stick with using this code, you need to synchronize the runspaces. – Abraham Zinala Feb 06 '21 at 02:24
  • Ok I replaced Threads with runspace in the question. Although the original question still remains. How do I get the session into runspace – hdsouza Feb 07 '21 at 02:37

1 Answers1

1

After days of research I found that you can run a thread on a local system or on a remote Exchange server. If you run it on the local system, then each thread needs to call the Exchange session on their own, but if you run it a remote exchange system (onprem or cloud) you can get the exchange session just once and pass that session to the thread. You can get a remote session with an Invoke command. Also I ended up writing the script in Poshjobs instead or runspaces. Ultimately from what I have read Poshjobs is a combination of Start-job and 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

You can use this script to run threads onprem as well as cloud, although when run on a cloud server, Microsoft will only allow TWO threads. If you run more that TWO threads, your Exchange session is killed (This is different from Throttling) . So if you have a cloud environment, then its best to run your threads locally. Special reference to @postanote for his script at https://powershell.org/forums/topic/connecting-to-office-365-in-psjobs/

hdsouza
  • 354
  • 4
  • 17