Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hosting powershell runspace in web application

I'm writing a web service that executes powershell scripts (active directory, directory management, etc).

Right now, Runspace instance is created per web request. As Runspace initialization is time consuming operation, plus often I have to import modules, like ActiveDirectory, which are also slow operations.

In this blog post Managing Exchange 2007 Recipients with C# , the Runspace instance is kept in a static field.

I wander what if I keep Runspace instance in static field, would it be thread safe? Maybe there are other drawbacks of doing it this way?

Thanks

like image 356
Misha N. Avatar asked Feb 03 '23 21:02

Misha N.


1 Answers

Runspaces are not thread-safe, nor can they guarantee that the scripts they are running are either.

I would suggest you create a RunspacePool and have your web service queue work to it. This is actually pretty easy to do. I blogged about it for v2 ctp3, but the API has not changed for RTM.

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

update:

If you want to preload each runspace in the pool with one or more modules, use the RunspaceFactory.CreateRunspacePool(InitialSessionState) overload. To see how to create and initialize this, see:

http://www.nivot.org/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule.aspx

Every time you create a PowerShell instance, assign the pool to its RunspacePool property.

like image 76
x0n Avatar answered Feb 06 '23 16:02

x0n