【问题标题】:Dynamically create a cmdlets/module in PowerShell在 PowerShell 中动态创建 cmdlet/模块
【发布时间】:2016-06-28 11:55:57
【问题描述】:

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

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

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

举个例子。如果我想在远程计算机上从模块 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 的回答之前,我选择了错误的部分,因为我认为分享我的经验很有趣,我已经在博客中讨论过它。 import and use module from a remote server

【问题讨论】:

  • $Session=New-PSSession -ComputerName ""; Import-Module -PSSession $Session MyModule?

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


【解决方案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 在本地运行时。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    至少很有趣。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2023-03-09
    • 2020-02-27
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多