Search code examples
c#powershellpowershell-2.0runspacepowershell-hosting

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


Solution

  • 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.