在PowerShell

时间:2016-06-28 11:55:58

标签: powershell dynamic powershell-remoting cmdlet powershell-module

这就是我想要实现的目标,我找不到任何相关内容。

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

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

举个例子。如果我想从远程计算机上的模块 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。
  3. 的脚本

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

    有什么想法吗?有没有人尝试过类似的东西?

    调查后的结论和@ Persistent13的答案:

    PowerShell提供开箱即用的此功能。它被称为 IMPLICIT REMOTING 。在@ Persistent13的答案之前我采取了错误的部分,因为我认为分享我的经验很有意思,我已经在博客上发表过这篇文章。 import and use module from a remote server

2 个答案:

答案 0 :(得分: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

这样做的好处是不需要远程连接你的模块,只要它存在于远程计算机上并允许PowerShell远程处理。

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

使用隐式远程处理时,

Deserialized.Microsoft.ActiveDirectory.Management.ADUser

在本地运行时

Microsoft.ActiveDirectory.Management.ADUser

答案 1 :(得分:0)

当我提出问题时,我并不知道隐式远程处理的概念。

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

例如,要从服务器Microsoft.PowerShell.Management导入$target="SERVER",请执行此

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

使用此代理模块在当前会话中生成,该模块提供与指定的cmdlet相同的cmdlet。代理cmdlet会自动将参数推送到远程会话$session并捕获其输出。隐含地从Microsoft.PowerShell.Management导入SERVERGet-Service会从SERVER返回服务。

您可以通过执行

真正看到代理cmdlet的实现
$module=Get-Module Microsoft.PowerShell.Management
$module.Definition

至少有趣。