这就是我想要实现的目标,我找不到任何相关内容。
我想为远程服务器上可用的模块创建远程模块代理。
我知道如何使用远程处理,但我想要创建更清晰的脚本文件。
举个例子。如果我想从远程计算机上的模块 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.2。非常干净,不会在文件系统上留下任何痕迹。
有什么想法吗?有没有人尝试过类似的东西?
调查后的结论和@ Persistent13的答案:
PowerShell提供开箱即用的此功能。它被称为 IMPLICIT REMOTING 。在@ Persistent13的答案之前我采取了错误的部分,因为我认为分享我的经验很有意思,我已经在博客上发表过这篇文章。 import and use module from a remote server
答案 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
导入SERVER
,Get-Service
会从SERVER
返回服务。
您可以通过执行
真正看到代理cmdlet的实现$module=Get-Module Microsoft.PowerShell.Management
$module.Definition
至少有趣。