Powershell Remoting: using imported module cmdlets in a remote pssession

前端 未结 7 2106
我在风中等你
我在风中等你 2021-02-05 12:34

Is there a way to use modules that were imported in a local session in a remote session? I looked at import-pssession, but I don\'t know how to get the local session. Here\'s a

7条回答
  •  孤独总比滥情好
    2021-02-05 13:00

    I ended up hacking this to work. What I did was create a local session, import modules into that session and used import-pssession to import modules from the created local session into the remote session. This is slow. If anyone has a better way of doing this, or if someone knows how to get an instance of the base session I'd love to hear from you!

    Remoting.psm1

    function Export-ModuleToSession {
     Param(
      [ValidateNotNull()]
      $session,
      [ValidateNotNull()]
      $modules
     )
    
     $computername = $env:computername
    
     $modulesToImport = get-module -name $modules
    
     invoke-command -session $session -argumentlist @($computername, $modulesToImport) -scriptblock {
      Param(
       $computername,
       $modules
      )
    
      write-host ("Creating Temp Session On: " + $computername)
    
      $localSession = New-psSession -computername $computername
    
      $modules | foreach-object {
       if($_.ModuleType -ne "Binary") {
        $path = $_.path
       }
       else {
        $path = join-path (split-path $_.Path) ("{0}.psd1" -f $_.name)
       }
    
       invoke-command -session $localSession -argumentList $path -scriptblock {
        Param(
         $path
        )
    
        $initializeDefaultBTSDrive = $false
        set-executionpolicy unrestricted
    
        write-host ("Importing Module To Temp Session: " + $path)
        import-module $path
       }
      }
    
      $initializeDefaultBTSDrive = $false
    
      $modules | foreach-object { 
       write-host ("Exporting Module: " + $_.name)
       import-psSession -session $localSession -Module $_.name  | out-null 
      }
     }
    }
    

    MyModule.psm1

    function MyCmdlet {}
    

    RemotingTest.ps1

    import-module .\remoting.psm1
    import-module .\MyModule.psm1
    
    try
    {
     $remoteSession = New-PsSession -computerName "RemoteComputer"
     Export-ModuleToSession -session $remoteSession -modules "MyModule"
    
     Invoke-Command -session $remoteSession -scriptblock { MyCmdlet } -verbose -ea Stop
    }
    finally
    {
     Remove-PsSession $remoteSession -ea Continue
     Remove-Module "Remoting" -ea Continue
     Remove-Module "MyModule" -ea Continue
    }
    

提交回复
热议问题