1

这就是我想要实现的功能,我找不到任何关于此的信息。在PowerShell中动态创建cmdlet /模块

我想为远程服务器上可用的模块创建远程模块代理。

我知道如何使用远程处理,但我想要创建更干净的脚本文件。

举个例子。如果我想在远程计算机上从模块MyModule的执行MyCmdlet我会做这个

$block={ 
    # Invoke the cmdlet from a module named MyCmdlet 
    MyCmdlet -Parameter1 -Parameter2 
} 

Invoke-Command -ComputerName "" -ScriptBlock $block 

但我想土地弄成这个样子

Import-Module MyModuleRemote 
MyCmdlet -ComputerName "" -Parameter1 -Parameter2 

请注意到MyModule的我的客户机上未安装

我可以用Invoke-Command包装器为每个cmdlet重新编写模块,但这不是目的。通过为每个cmdlet和参数创建一个代理平等代理,我想要做的是远程处理MyModule。即使是Get-Help也应该至少对参数组合起作用。

我有几个想法,但我不确定是否有可能。

  1. 创建一个powershell模块,例如, PSRemotify将检测远程服务器上的模块并生成代码。
    1. 如果我选择将文件写入文件系统,那么这应该是可能的,如果我可以对cmdlet进行反射。
    2. 如果我不想保存文件,那么我需要在内存中执行所有操作。我可以在内存中编写cmdlet的主体吗?我可以生成一个字符串并导入其嵌入式cmdlet吗?
  2. 创建一个1.2的脚本。

我的选择是选项1.2。非常干净且不会在文件系统上留下任何痕迹。

任何想法?有没有人试过类似的东西?我的调查和回答@ Persistent13后

结论:

PowerShell中提供此功能的开箱。它被称为IMPLICIT REMOTING。在@ Persistent13的回答之前,我采取了错误的部分,因为我认为分享我的经验很有趣,我已经在博客上发表了看法。 import and use module from a remote server

+1

'$ Session = New-PSSession -ComputerName“”;导入模块-PSSession $会话MyModule'? – PetSerAl

回答

1

这听起来像你想要的是隐式远程处理,并且设置起来相当简单。

请注意我已经从here采取了此说明。

要创建一个你要一个隐含的会话:

PS C:\> $foo = New-PSSession -ComputerName DC1 
PS C:\> Import-Module -PSSession $foo -Name ActiveDirectory 
PS C:\> Get-ADUser 

以上将打开计算机DC1一个PowerShell会话,导入ActiveDirectory中模块的远程计算机上,并且命令对远程计算机同时运行它似乎在本地执行。

在本地模块与远程模块冲突的情况下,也可以使用隐式导入模块的前缀。

PS C:\> $foo = New-PSSession -ComputerName DC1 
PS C:\> Import-Module -PSSession $foo -Name ActiveDirectory -Prefix DC1 
PS C:\> Get-DC1ADUser 

这样做的好处是没有必要REMOT-IFY的模块,只要它存在于远程计算机上和PowerShell远程处理是允许的。

但是,这种方法的一个警告是,返回的对象的类型会改变。

Deserialized.Microsoft.ActiveDirectory.ADUser当使用隐式远程处理时。

Microsoft.ActiveDirectory.ADUser在本地运行时。

0

当我提出这个问题时,我不知道隐式远程的概念。

实际上,您使用Import-Module导入模块,但您也可以使用参数-Session指定到远程服务器的会话。

例如从服务器$target="SERVER"Microsoft.PowerShell.Management导入执行该

$session=New-PSSession -ComputerName $target 
Import-Module Microsoft.PowerShell.Management -Session $session 

有了这个在于提供了相同的小命令所指定的一个当前会话产生代理模块。代理cmdlet自动将参数推送到远程会话$session并捕获其输出。从SERVER隐含导入Microsoft.PowerShell.ManagementGet-ServiceSERVER返回服务。

你真的可以通过执行

$module=Get-Module Microsoft.PowerShell.Management 
$module.Definition 

它至少有趣看到代理的cmdlet的执行情况。

+0

关于此的完整说明可以在[https://sarafian.github.io/tips/2016/07/01/Import-Module-Remote.html] –