I'm developing a custom PowerShell module, which I'd like to use in context of a remote session to a different computer. The following code (which obviously doesn't work) explains what I'm trying to achieve:
import-module .\MyCustomModule.psm1
$session = new-pssession -computerName server01
invoke-command -session $session -scriptblock {
<# use function defined in MyCustomModule here #>
}
The first question is whether it is at all possible to achieve this scenario? I mean I would only like my custom module to be physically present on my machine, not on remote server.
I have found this thread, but I didn't manage it to work - it doesn't allow creating a session from remote machine back to the local one. Probably, I faced with the configuration limitations mentioned somewhere in the comments to that thread... Besides, the author mentioned the performance implications which is critical for my solution...
If that's possible, then how?
The version of PowerShell is currently not a constraint - if the solution is only available in PS 3.0 - I can live with this.
Here's another approach: Recreate the module in a remote session, without copying any files.
I've made no attempt to cope with dependencies between modules, but this seems to work ok for simple self contained modules. It relies on the module being available in the local session, as this makes determining exports easier, but with a bit of extra work it would also work with a module file.
What about making scriptblock out of your custom function and sending it off to terget servers using
Invoke-command
I don't believe this is supported right of the box without any "hacks". The smart move would probably be to put the module on a public location like a fileserver and import it on the server when you need it. Ex:
There were some great comments to the question, and I've spent some time investigating various ways to approach the problem.
To begin with, what I've initially asked for is not possible. I mean, if you go the module way, then the module should be physically present on a target machine to be able to
Import-Module
into remote session.To abstract my question further, I'm trying to create a reusable PowerShell-based framework for the product deployments. It's going to be a push-manner deployments, meaning that we encourage people to run some scripts on a local machine to deploy to some remote server. As far as I investigated the area, there are two possible ways which are friendly to the common sense.
Modules approach
The process to follow:
*.psm1
)PSModulePath
variable to include the new modules locationInvoke-Command -Session $s -ScriptBlock {...}
Import-Module CustomModule
- it will search theCustomModule
on a remote machine and obviously will find itAdvantages
The following are the reasons to love this approach for:
Disadvantages
The following is important to take into consideration:
xcopy
from the shared folder. Besides, the delivery mechanism should support upgrade / downgrade and (preferably) multi-instance installations, but that's more related to my task than to the problem in generalScripts approach
The process to follow:
Invoke-Command -Session $s -FilePath .\myscript.ps1
to load the functions defined in a script to the remote sessionInvoke-Command -Session $s -ScriptBlock {...}
and refer to your custom functions - they will be there in a sessionAdvantages
The following are good points of this approach:
Disadvantages
Sure, it's not ideal:
Finally, I should say that remote machine still needs to be prepared for the remoting. This is what I mean:
Set-ExecutionPolicy Unrestricted
Enable-PSRemoting