1

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

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

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

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

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

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

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

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

有任何想法吗?有没有人尝试过类似的东西?

经过我的调查和@Persistent13 的回答后得出的结论:

PowerShell 开箱即用地提供了此功能。它被称为隐式远程处理。在@Persistent13 的回答之前,我选择了错误的部分,因为我认为分享我的经验很有趣,我已经在博客上写过它。 从远程服务器导入和使用模块

4

2 回答 2

1

听起来您要寻找的是隐式远程处理,并且设置起来相当简单。

请注意,我已从此处获取了相关说明。

要创建隐式会话,您将:

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在本地运行时。

于 2016-06-28T21:15:17.370 回答
0

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

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

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

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

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

您可以通过执行真正看到代理 cmdlet 的实现

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

至少很有趣。

于 2017-10-12T16:04:28.430 回答